Elevator System
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());
}- 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
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.