Ý tưởng cốt lõi:
- Thay vì mỗi thang nhận request “lẻ tẻ”, hệ thống nhìn toàn bộ nhu cầu của hành khách trước.
- Sau đó gom người đi các tầng gần nhau vào cùng một thang → mỗi thang dừng ít tầng hơn, tổng thể nhanh hơn.
Khác với Collective Control (mỗi người tự bấm tầng trong cabin), Destination Dispatch làm một bước “tối ưu hoá trước khi bước vào thang”.
1. Mô hình đơn giản hoá
Để minh hoạ, ta dùng mô hình tối giản:
- Tòa nhà 16 tầng (0–15), tất cả hành khách đều xuất phát từ tầng 0 (sảnh).
- 3 thang máy: Elevator A, B, C, ban đầu đều ở tầng 0.
- Mỗi hành khách có:
- destination: tầng muốn tới (1–15).
- Destination Dispatch sẽ:
- Nhìn toàn bộ list destination.
- Sắp xếp theo tầng.
- Chia thành 3 cụm liên tiếp (cluster) và gán lần lượt cho thang A/B/C.
Ví dụ: có người đi các tầng: 3, 4, 5, 10, 11, 14 → hệ thống có thể gán:
- Elevator A: 3, 4, 5
- Elevator B: 10, 11
- Elevator C: 14
Mỗi thang chỉ phải dừng một “đoạn” tầng liên tiếp → ít dừng hơn, tránh cảnh thang nào cũng ghé mọi tầng.
2. Demo Destination Dispatch – 3 thang, phân cụm điểm đến
Demo dưới đây cho phép bạn:
- Thêm hành khách với destination cụ thể.
- Thêm nhiều hành khách ngẫu nhiên.
- Nhấn “Gán thang (Dispatch)” để Destination Dispatch chia các cụm điểm đến cho 3 thang.
- Cho thang chạy (step hoặc auto) và quan sát từng thang dừng ở các tầng được giao.
Demo: Destination Dispatch – gom người theo cụm tầng
Thêm hành khách
Destination Dispatch
Chạy mô phỏng
Trạng thái
Log
Giải thích nhanh logic demo
- floors: 16 tầng (0–15), tất cả hành khách xuất phát từ tầng 0.
- passengers: mảng các object
{ id, dest, elevator }, trong đó:dest: tầng muốn tới (1–15).elevator: index thang được gán (0=A, 1=B, 2=C) hoặcnullnếu chưa gán.
- elevators: mảng 3 thang:
{ name, currentFloor, stops }, trong đóstopslà danh sách tầng mà thang sẽ dừng (sort tăng dần, unique).
- Gán thang (Dispatch):
- Lấy list các hành khách, lọc theo những người chưa gán elevator.
- Sắp xếp theo
desttăng dần. - Chia danh sách này thành 3 cụm liên tiếp: cluster 0, 1, 2.
- Gán cluster 0 cho Elevator A, cluster 1 cho B, cluster 2 cho C.
- Cập nhật
stopscủa từng thang = tập các dest trong cluster (sort + unique).
- Chạy 1 bước: với mỗi thang:
- Nếu còn
stops:- Lấy tầng mục tiêu đầu tiên
target. - Nếu
currentFloor < target→ đi lên 1 tầng. - Nếu
currentFloor > target→ đi xuống 1 tầng. - Nếu bằng nhau → dừng, log lại, xoá target khỏi
stops.
- Lấy tầng mục tiêu đầu tiên
- Nếu còn
- Vẽ trên canvas:
- Tòa nhà 16 tầng, mỗi tầng là một đường ngang.
- 3 trục thang A/B/C nằm cạnh nhau (3 “ống” riêng).
- Mỗi thang là một hình chữ nhật màu riêng trên trục tương ứng.
- Hành khách được vẽ cạnh trục thang đã được gán (màu theo thang); nếu chưa gán → vẽ ở khu “Waiting” bên trái.
Bình luận