🛗
Machine & Device Design

Elevator System

State Machine Aur Scheduling
💡 Elevator system EK TAXI DISPATCHER jaisa hai — kai taxis (lifts) hain, sawaari kahin se bhi bula sakta hai, aur dispatcher decide karta hai ki KAUNSI taxi jaayegi. Galat taxi bhejna = sabka time barbaad.

Do tarah ke requests hote hain aur inhe alag rakhna ZAROORI hai: EXTERNAL request (floor par lagi UP/DOWN button — sirf direction pata hai) aur INTERNAL request (lift ke andar ka floor button — exact destination pata hai). Bahut log ise ek hi bana dete hain aur design wahin bikhar jaata hai.

Lift ki state — IDLE, MOVING_UP, MOVING_DOWN, DOOR_OPEN — State pattern ke liye perfect hai. Aur ElevatorSelectionStrategy alag interface hona chahiye: simplest hai "nearest idle lift", better hai LOOK/SCAN algorithm jo current direction mein aage ke stops pehle serve karta hai.

enum Direction { UP, DOWN, IDLE }

class ExternalRequest { int floor; Direction direction; }   // floor ka button
class InternalRequest { int destinationFloor; }             // lift ke andar

interface ElevatorSelectionStrategy {
  Elevator select(List<Elevator> lifts, ExternalRequest req);
}

class Elevator {
  private int currentFloor;
  private Direction direction = Direction.IDLE;
  // TreeSet taaki stops apne aap sorted rahein
  private final TreeSet<Integer> upStops   = new TreeSet<>();
  private final TreeSet<Integer> downStops = new TreeSet<>(Comparator.reverseOrder());
}
🛗
Elevator system EK TAXI DISPATCHER jaisa hai — kai taxis (lifts) hain, sawaari kahin se bhi bula sakta hai, aur dispatcher decide karta hai ki KAUNSI taxi jaayegi. Galat taxi bhejna = sabka time barbaad.
1 / 2
⚡ Quick Recap
  • External (direction) aur Internal (destination) request ko alag model karo
  • Lift states — IDLE/MOVING_UP/MOVING_DOWN/DOOR_OPEN — State pattern se
  • ElevatorSelectionStrategy alag rakho: nearest-idle se LOOK algorithm tak upgrade ho sake
Is page mein (2 subtopics)

Naive approach: request aane ke order mein serve karo. Ye bahut bura hai — lift 1 → 10 → 2 → 9 bhaagti rahegi. LOOK algorithm kehta hai: current DIRECTION mein aage ke saare stops pehle serve karo, aur us direction mein kuch na bache to hi direction badlo.

Isi liye do TreeSet rakhe jaate hain — upStops (ascending) aur downStops (descending). Lift UP ja rahi hai to upStops se agla nikaalti rehti hai; khaali hone par direction flip karke downStops par chali jaati hai. Ye real elevators ka actual behaviour hai.

Integer nextStop() {
  if (direction == Direction.UP) {
    Integer above = upStops.ceiling(currentFloor);
    if (above != null) return above;
    direction = Direction.DOWN;              // upar kuch nahi bacha
  }
  return downStops.floor(currentFloor);
}

Ek building mein 4-6 lifts hoti hain aur ElevatorController decide karta hai kaunsi jaayegi. Simplest: sabse nazdeek IDLE lift. Behtar: wo lift jo pehle se USI DIRECTION mein us floor ki taraf ja rahi hai — wo bina extra travel ke pick up kar legi.

Ek important optimization: agar koi lift already us floor par rukne waali hai to NAYI lift assign mat karo. Ye batana efficiency ki samajh dikhata hai.

💡Tip: "Saari lifts busy hain to?" ka jawab rakho — request ek pending queue mein jaaye aur koi bhi lift free hone par uthaa le. Request drop karna kabhi acceptable nahi hai.