Який алгоритм використовується ліфтами, щоб знайти найкоротший шлях до замовлень на подорожі?


27

Я намагаюся імітувати ліфт, як завжди, я починав дуже просто, приймаючи лише одне замовлення за один раз, потім додав пам’яті до ліфта у вигляді черг, щоб підлоги проходили в тому порядку, в якому їх натискали, що, очевидно, не найкращий підхід.

Тож на даний момент я використовую дуже просту і «короткоглядну» логіку, яка полягає в тому, що для поточного поверху знайдіть підлогу, що знаходиться найближче до мене, і встановіть його як наступне місце призначення та цикл, доки в списку не буде більше поверхів.

Але це не завжди спрацьовує, наприклад, ліфт був на 3-му поверсі 5-поверхового будинку і отримав замовлення 4,5,2, найкоротший шлях буде 2-> 4-> 5, який коштує 4 поверхи, але використовуючи цю логіку 4-> 5-> 2, який коштує 5, має однакові шанси на вибір, залежно від коду.

Як знайти найкоротший шлях і зробити ліфт більш ефективним?


2
Дещо пов’язане: programmers.stackexchange.com/q/96278/149904
manlio

6
Я хотів би запросити вас до мене в офіс і розібратися в алгоритмі, який там використовують ліфти. Тому що я абсолютно не можу.
gnasher729

1
@ gnasher729 О, я можу, хоч я тебе не знаю, бо це, безумовно, те саме, що в моєму кабінеті: ніколи не зупиняйтесь на підлозі, в якій я перебуваю, за винятком випадків, коли вже повно людей. Чи правий я?
Андрес Ф.

2
Не зовсім. Є чотири ліфти. Ви натискаєте кнопку, дуже довго нічого не рухається. Якщо ви рухаєтеся, він зупиняється прямо перед вашою підлогою і чекає віків, поки його не наздожене інший, який пройде повз ваш поверх, а потім зійде. Під час спуску на землю він зупиняється щонайменше три рази, і ніхто не входить.
gnasher729

2
Відповідна гра / виклик програмування: play.elevatorsaga.com
dwikle

Відповіді:


30

"Ефективність" - не найважливіша особливість, найважливіша - переконатися, що дотримується кожного порядку, щоб не було голоду. Якщо хтось натискає 100 і люди продовжують натискати 1 і 2, можливо, буде ефективно продовжувати рух між цими поверхами, але було б непогано, щоб 100 відвідували в якийсь момент.

Я думаю (з особистого спостереження, коли мені було цікаво з'ясувати), що більшість з них робить:

  1. Почніть рухатись у напрямку першої натиснутої кнопки, слідкуйте, в якому напрямку ми їдемо
  2. Коли підлога досягається, і ця кнопка була натиснута, зупиніться та відкрийте двері, позначте кнопки цього поверху такими, що не натискаються більше.
    • Якщо є ще кілька поверхів, які нам потрібно відвідати, які йдуть у тому ж напрямку, продовжуйте рухатись у цьому напрямку .
    • Якщо ні, то ще є поверхи, які нам потрібно відвідати, рухатися в цьому напрямку.
    • Якщо ні, то ми закінчили і почнемо о 1, коли знову натиснемо кнопку.

Зауважте, що в багатьох ліфтах є кнопки «Я хочу піднятися вгору» і «Я хочу спуститися» поруч із дверима замість однієї кнопки. Алгоритм потребує лише невеликої зміни: 2, якщо єдиною кнопкою, що натискається на цей поверх, є одна з кнопок поруч із дверима, зупиніться та відкрийте двері, якщо ми їдемо в цьому напрямку. Можливо, натисніть кнопку, якщо двері відкриті через кнопку, натиснуту всередині ліфта, і вона рухається в неправильному напрямку.

Вам ніколи не доведеться з'ясувати цілу стежку , лише в якому напрямку рухатися далі.


це повністю пропустило мою думку, я був так зосереджений на ефективності і забув, що інші речі теж важливі. як і раніше сказати від 2-> 100 і назад до 1 просто непросто, тому що це було в тому ж напрямку, але принаймні це не забезпечує голодування. і, зовсім поза темою, можливо, саме тому звичайно знайти два елеватори з такою логікою? що змушує мене замислитися, чи частіше знайти ліфти, що йдуть у зворотному напрямку в будь-який момент часу. у будь-якому разі мені все ще цікаво, як знайти найкоротший весь шлях, але це дуже чітко відповідає на моє питання, дякую
Raed Tabani

7
Зауважте, що як тільки ви потрапите до будинку зі 100 поверхами, у вас зазвичай будуть ліфти, які обслуговують лише певний діапазон поверхів (наприклад, 0-19, 20-39,…), а також експрес-ліфти, які йдуть лише на великі відстані (наприклад, 0 до 50, 0 до 100, 50 до 100, але між ними немає поверхів), тому вам, можливо, доведеться змінити ліфти, щоб дістатися до місця призначення. Ви також можете мати кілька ліфтів на вал, які, очевидно, не можуть проходити один одного. Зовсім поза темою: IIRC, виникло питання про ефективність цих кнопок зі стрілками вгору та вниз на веб-сайті User Experience, які дуже цікаво читали.
Йорг W Міттаг

дякую, я цього не знав. підрозділення здається гарною стратегією, якщо одна частина розбиває всю систему, а також не розподіляє навантаження, що важливо для механічного зносу. Мені цікаво, чи виникли ці експрес-ліфти через логічні недоліки алгоритму Ліфта Knuth's Elevator.
Raed Tabani

Єдине, що я хотів би додати, це те, що часто у них є "домашній" поверх, до якого вони повернуться, коли вони не використовуються, це може бути різним для різних ліфтів, і, можливо, навіть змінюватись залежно від часу доби та очікуваних моделей використання
jk .

У мене є тенденція натискати кнопку "вгору / вниз" випадковим чином, незалежно від того, в якому напрямку я дійсно подорожую. У моєму випадку я маю колись одне місце призначення, тому ліфт відвозить мене до цього місця незалежно від того, я вибрав або вниз. Я підозрюю, що якби я натискав кнопку вниз, вибирав підлогу над мною, а потім вибирав підлогу під мною, перш ніж ліфт почне рухатись, це призвело б до мене підлоги, а не до підлоги, яку я натиснув першим. Я можу помилитися, я обов'язково перевіряю це наступного разу, коли опинюсь у ліфті.
Уценна

13

Інша відповідь правильно дає стандартний алгоритм ліфтів, який, в основному, "продовжуйте рухатися в тому ж напрямку, наскільки це можливо довше, і робите кожну необхідну зупинку на шляху".

Існують і інші алгоритми ліфтів. Наприклад, розгляньте багатоквартирний будинок, де квартири дорожчають під час подорожі. Власники будівлі можуть вирішити змінити алгоритм ліфтів, щоб "їхати в тому ж напрямку якомога довше, але лише зупинятися на шляху вниз". Таким чином, якщо у ліфті є люди, які знаходяться у вестибюлі і збираються в 2, 5 і 10, ліфт іде в 10, потім в 5, потім в 2, скидаючи людей на порядок сплати орендної плати. Але звичайно, коли людям, які о 10, залишають свою квартиру, їм частіше доведеться чекати довше, щоб потрапити у вестибюль.

Якщо ви шукаєте ефективне рішення, тоді придумайте метрику вартості та застосуйте купу різних алгоритмів та запустіть моделювання. Не забудьте виміряти не лише середню вартість, але й показники, як найдовший, який потребує будь-який запит. Оптимізація низьких середніх показників іноді може деоптимізувати найгірший випадок, який поганий.


1
Здається, це рідко (інші alogirthms)
FindOutIslamNow

10

Зауважте, що ліфти використовують ті ж алгоритми планування, що й деякі контролери жорсткого диска. Стандартний алгоритм SCAN навіть відомий як алгоритм елеватора . Я думаю, що на практиці алгоритм LOOK є більш поширеним, оскільки він трохи ефективніший, ніж SCAN.


Якщо ви так точно говорите, чи маєте ви професійний досвід впровадження коду для ліфтів? Особливо новіші системи ліфтів? Мені цікаво, якщо після 11 вересня в Нью-Йорку більше пріоритету було відправляти пасажирів проти виховувати їх.
Іван Заброський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.