Collective Control – thang máy chung cư với nút Up/Down hoạt động thế nào?

Khi đứng trước thang máy chung cư, bạn chỉ thấy hai nút UpDown, bấm xong thì… chờ thang tới. Nhưng đằng sau hai nút đơn giản đó là cả một cơ chế điều khiển gọi là Collective Control: thang phải quyết định nên ghé tầng nào, theo hướng nào, phục vụ ai trước, mà vẫn hạn chế quay đầu lung tung. Trong bài này, ta sẽ xem thang máy “suy nghĩ” ra sao với hall call (Up/Down ngoài sảnh) và car call (nút trong cabin), kèm một demo trực quan để thấy từng bước ra quyết định.

Collective Control – thang máy chung cư với nút Up/Down hoạt động thế nào?

Hai bài trước ta nói về Up/Down cơ bảnSCAN/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 (Up/Down) ở các tầng, thêm car call trong cabin, sau đó cho thang chạy. Khi đi lên, thang ưu tiên phục vụ các request đi lên phía trên; khi đi xuống thì ngược lại.

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

Tòa nhà 10 tầng (0–9). Thang ở tầng0, hướngIDLE. Chưa có request nào.

Log

Chưa chạy thuật toán.

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.
  • 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


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...