Skip to content

Instantly share code, notes, and snippets.

@codl
Created October 22, 2018 21:17
Show Gist options
  • Save codl/f6ba488471bb983ee79dd87c4643f3f1 to your computer and use it in GitHub Desktop.
Save codl/f6ba488471bb983ee79dd87c4643f3f1 to your computer and use it in GitHub Desktop.
{
init: function(elevators, floors) {
let i = 0;
for(let elevator of elevators){
elevator.num = i;
i++;
elevator.on('idle', ()=>{
if(elevator.num % 2 == 1){
elevator.goToFloor(0);
} else {
elevator.goToFloor(floors.length - 1);
}
});
elevator.on('floor_button_pressed', floor => {
try_insert_floor(elevator, floor, 1) ||
try_insert_floor(elevator, floor, -1) ||
elevator.goToFloor(floor);
})
elevator.on('passing_floor', (floorNum, direction) => {
});
elevator.on('stopped_at_floor', (floorNum) => {
if(floorNum > elevator.destinationQueue[0]){
elevator.goingDownIndicator(true);
elevator.goingUpIndicator(false);
}
else if(floorNum < elevator.destinationQueue[0]){
elevator.goingDownIndicator(false);
elevator.goingUpIndicator(true);
}
else {
elevator.goingDownIndicator(true);
elevator.goingUpIndicator(true);
}
});
}
let try_insert_floor = (elevator, floor, direction) => {
let queue = elevator.destinationQueue;
for(let j = -1; j < queue.length - 1; j++){
let queueFloor = queue[j];
let nextQueueFloor = queue[j+1];
let d = direction || 1;
if(j<0){
queueFloor = elevator.currentFloor();
}
if(queueFloor*d <= floor*d && floor*d <= nextQueueFloor*d){
if(queueFloor == floor || nextQueueFloor == floor){
// already queued, nothing to do
return true;
}
// insert floor stop inbetween stops
queue.splice(j+1, 0, floor);
elevator.checkDestinationQueue();
return true;
}
}
return false;
}
let call = (direction, floor) => {
for(let elevator of elevators){
if(elevator.loadFactor() > 0.66){
// elevator too full
continue;
}
let success = try_insert_floor(elevator, floor, direction);
if(success){
return;
}
}
// if we get here, we couldn't find a convenient place to insert the stop
// we find which elevator will take the least amount of time to get there at the end of its queue
let i = 0;
let minCost = +Infinity;
let minCostIdx = 0;
for(let i = 0; i < elevators.length; i++){
let elevator = elevators[i];
let cost = 0;
let lastFloor = elevator.currentFloor();
for(let queueFloor of elevator.destinationQueue){
cost += Math.abs(lastFloor - queueFloor);
cost += .1; // for stopping and starting
lastFloor = queueFloor;
}
cost += Math.abs(lastFloor - floor);
if(cost < minCost){
minCost = cost;
minCostIdx = i;
}
}
elevators[minCostIdx].goToFloor(floor);
}
for(let floor of floors){
floor.on('up_button_pressed', () => call(1, floor.floorNum()));
floor.on('down_button_pressed', () => call(-1, floor.floorNum()));
}
},
update: function(dt, elevators, floors) {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment