- 1. Các loại request trong Collective Control
- 2. Luật dừng thang (when to stop) trong Collective Control
- 3. Luật chọn hướng (when to change direction)
- 4. Demo Collective Control – một thang, hall call + car call
- Demo: Collective Control – thang máy chung cư 10 tầng
- Giải thích nhanh demo Collective Control
Hai bài trước ta nói về Up/Down cơ bản và SCAN/LOOK – đều coi các request như những “điểm cần ghé” trên một trục. Nhưng thực tế, thang máy chung cư thường có:
- Nút gọi ngoài sảnh: Up / Down ở mỗi tầng.
- Nút trong cabin: chọn tầng muốn đến.
Kiểu điều khiển mà ta thấy hàng ngày này được gọi là Collective Control. Ý tưởng chính:
- Khi thang đang đi lên:
- Dừng ở các tầng phía trên có người bấm lên hoặc có người trong cabin chọn tầng đó.
- Yêu cầu đi xuống ở các tầng phía trên thường sẽ được xử lý trên lượt đi xuống.
- Khi thang đang đi xuống thì logic ngược lại.
Thuật toán này giúp thang máy “gom khách cùng hướng” để giảm số lần đổi chiều và tránh việc thang cứ lắc qua lắc lại giữa hai tầng.
1. Các loại request trong Collective Control
Trong mô hình đơn giản (một thang, toà nhà 10 tầng), ta có 3 loại request:
- Car call (nút trong cabin):
- Ví dụ: hành khách đang ở trong thang bấm tầng 7.
- Ta lưu carCall[floor] = true.
- Hall call Up (gọi lên ở tầng i):
- Ví dụ: ở tầng 3 bấm nút “Up”.
- Ta lưu hallUp[i] = true.
- Hall call Down (gọi xuống ở tầng i):
- Ví dụ: ở tầng 8 bấm nút “Down”.
- Ta lưu hallDown[i] = true.
Trạng thái thang máy:
- elevatorFloor: tầng hiện tại.
- direction:
- 0: idle (đứng yên).
- +1: đang đi lên.
- -1: đang đi xuống.
2. Luật dừng thang (when to stop) trong Collective Control
Nói nôm na:
- Khi đi lên:
- Dừng nếu có carCall tại tầng đó.
- Dừng nếu có hallUp tại tầng đó.
- Có thể dừng hallDown tại tầng đó nếu đây là điểm quay đầu (không còn request nào phía trên).
- Khi đi xuống:
- Dừng nếu có carCall tại tầng đó.
- Dừng nếu có hallDown tại tầng đó.
- Có thể dừng hallUp tại tầng đó nếu đây là điểm quay đầu (không còn request nào phía dưới).
Ý tưởng là: ôm trọn request theo hướng hiện tại, các request ngược hướng sẽ được xử lý trên lượt quay về.
3. Luật chọn hướng (when to change direction)
- Nếu đang đi lên:
- Nếu còn bất kỳ request nào phía trên → tiếp tục đi lên.
- Nếu không còn request phía trên nhưng còn phía dưới → đổi hướng xuống.
- Nếu đang đi xuống:
- Nếu còn request phía dưới → tiếp tục đi xuống.
- Nếu không còn request phía dưới nhưng còn phía trên → đổi hướng lên.
- Nếu đang idle (direction = 0):
- Chọn hướng về phía request gần nhất.
Như vậy, Collective Control vừa giống Up/Down cơ bản, vừa tôn trọng ý nghĩa nút Up/Down ở từng tầng.
4. Demo Collective Control – một thang, hall call + car call
Demo dưới đây mô phỏng một toà nhà 10 tầng, một thang máy, có:
- Thêm hall call (Up/Down) ở từng tầng.
- Thêm car call (nút trong cabin).
- Chạy từng bước hoặc chạy tự động và quan sát log quyết định.
Demo: Collective Control – thang máy chung cư 10 tầng
Thêm hall call (gọi từ tầng)
Thêm car call (nút trong cabin)
Điều khiển thang
Trạng thái thang
Log
Giải thích nhanh demo Collective Control
- floors: số tầng (10), đánh số 0–9.
- Trạng thái thang:
elevatorFloor: tầng hiện tại.direction: 0 (IDLE), +1 (UP), -1 (DOWN).
- Request arrays:
carCalls[f]: true nếu có người trong cabin bấm tầng f.hallUpCalls[f]: true nếu có hall call đi lên tại tầng f.hallDownCalls[f]: true nếu có hall call đi xuống tại tầng f.
- Hàm
hasAnyRequests(): kiểm tra còn request nào không. - Hàm
existsAnyAbove()/existsAnyBelow(): xem phía trên/phía dưới còn bất kỳ request nào (car/hall-up/hall-down) không. - Hàm
serveAtCurrentFloor():- Nếu đang đi lên:
- Clear carCalls[f] và hallUpCalls[f].
- Nếu không còn request nào phía trên → có thể phục vụ luôn hallDownCalls[f] (coi như điểm quay đầu).
- Nếu đang đi xuống: tương tự nhưng với hallDown làm chính, hallUp chỉ phục vụ ở điểm quay đầu phía dưới.
- Nếu đang đi lên:
- Hàm
stepCollective():- Nếu idle và có request → chọn hướng về phía gần nhất.
- Di chuyển 1 tầng theo hướng hiện tại (có thể đổi hướng nếu phía trước hết request nhưng phía sau còn).
- Gọi
serveAtCurrentFloor()để xử lý request tại tầng mới.
- Vẽ trên canvas:
- Mỗi tầng có một đường ngang + label “Tầng i”.
- Cabin thang là hình chữ nhật màu xanh ở vị trí tầng hiện tại.
- car call được vẽ bằng chấm xanh bên cạnh trục, hallUp/hallDown là mũi tên chỉ lên/xuống màu cam.
Bình luận