Guest User

Untitled

a guest
Oct 22nd, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. {
  2. init: function(elevators, floors) {
  3. let i = 0;
  4. for(let elevator of elevators){
  5. elevator.num = i;
  6. i++;
  7. elevator.on('idle', ()=>{
  8. if(elevator.num % 2 == 1){
  9. elevator.goToFloor(0);
  10. } else {
  11. elevator.goToFloor(floors.length - 1);
  12. }
  13. });
  14.  
  15. elevator.on('floor_button_pressed', floor => {
  16. try_insert_floor(elevator, floor, 1) ||
  17. try_insert_floor(elevator, floor, -1) ||
  18. elevator.goToFloor(floor);
  19. })
  20.  
  21. elevator.on('passing_floor', (floorNum, direction) => {
  22. });
  23.  
  24. elevator.on('stopped_at_floor', (floorNum) => {
  25. if(floorNum > elevator.destinationQueue[0]){
  26. elevator.goingDownIndicator(true);
  27. elevator.goingUpIndicator(false);
  28. }
  29. else if(floorNum < elevator.destinationQueue[0]){
  30. elevator.goingDownIndicator(false);
  31. elevator.goingUpIndicator(true);
  32. }
  33. else {
  34. elevator.goingDownIndicator(true);
  35. elevator.goingUpIndicator(true);
  36. }
  37.  
  38. });
  39. }
  40.  
  41. let try_insert_floor = (elevator, floor, direction) => {
  42. let queue = elevator.destinationQueue;
  43. for(let j = -1; j < queue.length - 1; j++){
  44. let queueFloor = queue[j];
  45. let nextQueueFloor = queue[j+1];
  46. let d = direction || 1;
  47. if(j<0){
  48. queueFloor = elevator.currentFloor();
  49. }
  50. if(queueFloor*d <= floor*d && floor*d <= nextQueueFloor*d){
  51. if(queueFloor == floor || nextQueueFloor == floor){
  52. // already queued, nothing to do
  53. return true;
  54. }
  55. // insert floor stop inbetween stops
  56. queue.splice(j+1, 0, floor);
  57. elevator.checkDestinationQueue();
  58. return true;
  59. }
  60. }
  61. return false;
  62. }
  63.  
  64. let call = (direction, floor) => {
  65. for(let elevator of elevators){
  66. if(elevator.loadFactor() > 0.66){
  67. // elevator too full
  68. continue;
  69. }
  70. let success = try_insert_floor(elevator, floor, direction);
  71. if(success){
  72. return;
  73. }
  74. }
  75. // if we get here, we couldn't find a convenient place to insert the stop
  76. // we find which elevator will take the least amount of time to get there at the end of its queue
  77. let i = 0;
  78. let minCost = +Infinity;
  79. let minCostIdx = 0;
  80. for(let i = 0; i < elevators.length; i++){
  81. let elevator = elevators[i];
  82. let cost = 0;
  83. let lastFloor = elevator.currentFloor();
  84. for(let queueFloor of elevator.destinationQueue){
  85. cost += Math.abs(lastFloor - queueFloor);
  86. cost += .1; // for stopping and starting
  87. lastFloor = queueFloor;
  88. }
  89. cost += Math.abs(lastFloor - floor);
  90. if(cost < minCost){
  91. minCost = cost;
  92. minCostIdx = i;
  93. }
  94. }
  95. elevators[minCostIdx].goToFloor(floor);
  96. }
  97.  
  98. for(let floor of floors){
  99. floor.on('up_button_pressed', () => call(1, floor.floorNum()));
  100. floor.on('down_button_pressed', () => call(-1, floor.floorNum()));
  101. }
  102. },
  103. update: function(dt, elevators, floors) {
  104. }
  105. }
Add Comment
Please, Sign In to add comment