Thuật toán nào được sử dụng bởi thang máy để tìm ra con đường ngắn nhất để đặt hàng trên sàn?


27

Tôi đang cố gắng mô phỏng thang máy, như mọi khi tôi bắt đầu rất đơn giản bằng cách chỉ thực hiện một đơn hàng tại một thời điểm, sau đó thêm bộ nhớ vào thang máy dưới dạng hàng đợi để các tầng được di chuyển theo thứ tự mà chúng được nhấn, đó rõ ràng không phải là cách tiếp cận tốt nhất.

Vì vậy, hiện tại tôi đang sử dụng một logic rất đơn giản và "thiển cận", đối với tầng hiện tại, hãy tìm tầng gần tôi nhất và đặt nó làm điểm đến tiếp theo của tôi và lặp lại cho đến khi không còn tầng nào trong danh sách nữa.

Nhưng điều này không phải lúc nào cũng hoạt động, ví dụ thang máy ở tầng 3 của tòa nhà 5 tầng và nhận được đơn hàng 4,5,2, con đường ngắn nhất sẽ là 2-> 4-> 5 có giá 4 tầng nhưng sử dụng logic này 4-> 5-> 2 có giá 5 có cùng cơ hội được chọn, tùy thuộc vào mã.

Làm thế nào để tôi tìm thấy con đường ngắn nhất và làm cho thang máy hiệu quả hơn?



6
Tôi muốn mời bạn đến văn phòng của tôi và tìm ra thuật toán mà thang máy sử dụng ở đó. Bởi vì tôi hoàn toàn không thể.
gnasher729

1
@ gnasher729 Ồ, tôi có thể mặc dù tôi không biết bạn, bởi vì nó chắc chắn giống như trong văn phòng của tôi: không bao giờ dừng lại ở tầng tôi đang ở, trừ khi đã có đầy người. Tôi có đúng không
Andres F.

2
Không hẳn. Có bốn thang máy. Bạn nhấn nút, không có gì di chuyển trong một thời gian rất dài. Nếu một người di chuyển, nó dừng lại ngay trước sàn nhà của bạn và chờ đợi lâu, cho đến khi nó bị vượt qua bởi một người khác đi qua sàn nhà của bạn và sau đó đi xuống. Trên đường xuống mặt đất, nó dừng lại ít nhất ba lần mà không ai bước vào.
gnasher729

2
Trò chơi / thử thách lập trình có liên quan: play.elevatorsaga.com
dwikle

Câu trả lời:


30

"Hiệu quả" không phải là tính năng quan trọng nhất, quan trọng nhất là đảm bảo mọi đơn hàng đều được tuân theo, không có tình trạng đói. Nếu ai đó nhấn 100 và mọi người tiếp tục nhấn 1 và 2, có thể sẽ hiệu quả khi tiếp tục đi giữa các tầng đó, nhưng thật tuyệt khi 100 người được truy cập vào một lúc nào đó.

Tôi nghĩ (từ quan sát cá nhân khi tôi quan tâm đến việc tìm ra) mà hầu hết họ làm:

  1. Bắt đầu đi theo hướng nhấn nút đầu tiên, theo dõi hướng chúng ta sẽ đi
  2. Khi đạt đến một tầng và nút đó được nhấn, dừng và mở các cửa, đánh dấu các nút cho tầng này là không nhấn nữa.
    • Nếu vẫn còn nhiều tầng mà chúng ta cần ghé thăm cùng hướng, hãy tiếp tục đi theo hướng đó .
    • Nếu không và vẫn còn những tầng chúng ta cần ghé thăm, hãy di chuyển theo hướng đó.
    • Nếu không thì chúng ta đã hoàn thành và sẽ bắt đầu từ 1 khi nhấn nút lần nữa.

Lưu ý rằng nhiều thang máy có các nút "Tôi muốn đi lên" và "Tôi muốn đi xuống" bên cạnh các cửa thay vì một nút duy nhất. Thuật toán chỉ cần một thay đổi nhỏ: trong 2, nếu nút duy nhất được nhấn cho tầng đó là một trong những nút bên cạnh cửa, chỉ dừng lại và mở cửa nếu chúng ta đi theo hướng đó. Có thể giữ nút ấn nếu cửa mở do nút ấn bên trong thang máy và nó đang đi sai hướng.

Bạn không bao giờ phải tìm ra toàn bộ một con đường , chỉ cần đi theo hướng tiếp theo.


Điều này hoàn toàn bỏ qua tâm trí của tôi, tôi đã quá tập trung vào hiệu quả và quên những thứ khác cũng quan trọng. Vẫn không hiệu quả khi nói từ 2-> 100 và quay lại 1 đơn giản vì nó cùng hướng nhưng ít nhất nó đảm bảo không bị đói. và, hoàn toàn lạc đề, có lẽ đây là lý do tại sao thường thấy hai thang máy có logic này? Điều này khiến tôi tự hỏi liệu có phổ biến hơn khi tìm thấy thang máy đi ngược chiều tại bất kỳ thời điểm nào. Dù sao, tôi vẫn tò mò về cách tìm ra con đường ngắn nhất, nhưng điều này trả lời câu hỏi của tôi rất gọn gàng, cảm ơn
Raed Tabani

7
Lưu ý rằng một khi bạn đến tòa nhà có 100 tầng, thông thường bạn sẽ có thang máy chỉ phục vụ một phạm vi tầng cụ thể (ví dụ: 0-19, 20-39, Thẻ), cũng như thang máy tốc hành chỉ đi được quãng đường dài (ví dụ 0 đến 50, 0 đến 100, 50 đến 100, nhưng không có tầng nào ở giữa), vì vậy bạn có thể phải thay đổi thang máy để đến đích. Bạn cũng có thể có nhiều thang máy trên mỗi trục rõ ràng không thể vượt qua nhau. Hoàn toàn lạc đề: IIRC, có một câu hỏi về hiệu quả của các nút mũi tên lên và xuống trên trang web Trải nghiệm người dùng được thực hiện để đọc rất hấp dẫn.
Jörg W Mittag

cảm ơn, tôi không biết điều đó chia nhỏ có vẻ là một chiến lược tốt nếu một phần phá vỡ toàn bộ hệ thống không và cũng để phân phối tải trọng rất quan trọng đối với hao mòn cơ học. Tôi tự hỏi liệu những thang máy tốc hành này có phải là do những thiếu sót logic của thuật toán Thang máy Knuth không.
Nâng Tabani

chỉ có một điều khác tôi muốn nói thêm là họ thường có sàn 'nhà' mà họ sẽ quay lại khi không sử dụng, điều này có thể khác nhau đối với các thang máy khác nhau và thậm chí có thể thay đổi tùy theo thời gian trong ngày và mô hình sử dụng dự kiến
jk .

Tôi có xu hướng ấn nút tăng / giảm ngẫu nhiên bất kể tôi thực sự đi theo hướng nào. Trong trường hợp của tôi, tôi chỉ có một điểm đến, vì vậy thang máy đưa tôi đến vị trí đó bất kể tôi chọn lên hay không xuống. Tôi nghi ngờ rằng nếu tôi ấn nút xuống, chọn một tầng phía trên tôi, rồi chọn một tầng bên dưới tôi trước khi thang máy bắt đầu di chuyển, nó sẽ đưa tôi xuống tầng dưới tôi thay vì tầng mà tôi đẩy trước. Tôi có thể sai, tôi chắc chắn sẽ kiểm tra lần sau khi tôi thấy mình đang ở trong thang máy.
Ucenna

13

Câu trả lời khác đưa ra chính xác thuật toán thang máy tiêu chuẩn, về cơ bản là "tiếp tục đi cùng hướng càng lâu càng tốt và làm cho mọi điểm dừng cần thiết trên đường đi".

Có các thuật toán thang máy khác. Ví dụ, hãy xem xét một tòa nhà chung cư nơi căn hộ đắt hơn khi bạn đi lên. Chủ sở hữu của tòa nhà có thể chọn sửa đổi thuật toán thang máy để "đi theo hướng càng lâu càng tốt nhưng chỉ dừng lại trên đường xuống". Theo cách đó, nếu bạn có người trong thang máy đang ở trong sảnh và sắp lên 2, 5 và 10, thang máy sẽ chuyển sang 10, rồi 5, rồi 2, thả người xuống theo thứ tự họ phải trả bao nhiêu tiền thuê. Nhưng tất nhiên khi những người trên 10 rời khỏi căn hộ của họ, họ sẽ thường phải chờ lâu hơn để đến sảnh.

Nếu bạn đang tìm kiếm một giải pháp hiệu quả thì hãy đưa ra một số liệu về chi phí và thực hiện một loạt các thuật toán khác nhau và chạy mô phỏng. Hãy nhớ đo lường không chỉ chi phí trung bình, mà cả các số liệu như thời gian dài nhất mà bất kỳ một yêu cầu nào sẽ được thực hiện. Tối ưu hóa cho mức trung bình thấp đôi khi có thể thu nhỏ trường hợp xấu nhất, điều này là xấu.


1
Nó dường như là hiếm (sinh thường khác)
FindOutIslamNow

10

Lưu ý rằng thang máy sử dụng các thuật toán lập lịch giống như một số bộ điều khiển ổ cứng. Thuật toán SCAN tiêu chuẩn thậm chí còn được gọi là thuật toán thang máy . Tôi nghĩ rằng trong thực tế thuật toán LOOK là phổ biến hơn, vì nó hiệu quả hơn một chút so với SCAN.


Khi bạn nói như vậy chắc chắn, bạn có kinh nghiệm chuyên môn thực hiện mã cho thang máy? Đặc biệt là hệ thống thang máy mới hơn? Tôi tò mò liệu sau ngày 11/9 ở NYC có ưu tiên cao hơn trong việc đưa hành khách xuống so với đưa họ lên.
John Zabroski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.