Created
October 22, 2018 21:17
-
-
Save codl/f6ba488471bb983ee79dd87c4643f3f1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
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