Робототехніка · складські парки роботів («товар до людини»)

Менше роботів, вища продуктивність

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

Спробуйте наживо

01

Огляд

Планувальник руху для складських роботів, що працюють за принципом «товар до людини», просто у вашому браузері. До 400 змодельованих роботів на сітці безперервно отримують нові завдання: забрати мобільний стелаж, привезти його до однієї з 16 станцій комплектації, зачекати, поки з нього відберуть товар, а потім забрати наступний. Зіткнення виключені за побудовою, а в 4 775 запусках із фіксованим seed не сталося жодного взаємного блокування. Додавайте роботів, доки продуктивність не перестане зростати, потім розмітьте односторонні проходи — планувальник враховує їх як ваги, а не як обов’язкові правила, — і дивіться, як зміщується вершина кривої.

На нашому складі з цим планувальником і середнім часом відбору 6 секунд продуктивність сягає максимуму — близько 5 134 подач стелажів на годину. Вершина пласка: за будь-якої кількості від 196 до 235 роботів результат у межах 0,5 % від найкращого, а згладжена крива досягає піку на 214. Далі кожен робот знижує продуктивність, і дедалі сильніше: близько 1 подачі на годину за кожного робота одразу після вершини, близько 4 на робота в районі 250 і близько 7 на робота поблизу 400. За 400 роботів склад видає на 20,5 % менше, ніж у найкращій точці, а 48 % роботів у русі не ближчі до своєї цілі, ніж 8 секунд тому.

Розмітьте проходи як односторонні — як побажання, а не правила, — і той самий склад досягає максимуму 6 439 подач стелажів на годину з 191 роботом: продуктивність на 25,4 % вища, а роботів на 23 менше. Базовий варіант — двосторонній рух в однополосних проходах, якого реальні планування складів уникають, тож виграш очікуваний. Цікаво інше — де він закінчується. Коли відбір сповільнюється до 24 секунд на стелаж, межу задають станції, і розмітка змінює продуктивність щонайбільше на 2,5 % у будь-який бік.

Ці числа стосуються сіткової моделі з цим планувальником. Роботи рухаються синхронно, на одну клітинку розміром 1 метр за секунду, можуть їхати впритул один за одним і не витрачають часу на розгін чи поворот. Блоки зберігання суцільні (роботи ніколи не проїжджають під ними), повернення стелажа на місце об’єднано з наступним рейсом по стелаж, а станції не мають смуг для черги. За найкращого розміру парку склад заповнений приблизно на 40 % — набагато щільніше, ніж працював би реальний парк. Ці числа залежать від руху впритул: з варіантом планувальника, що тримає дистанцію (жоден робот не може заїхати в клітинку в ту саму секунду, коли її залишає інший), найкращим із розмірів парку, які ми запускали, було 80 роботів — близько 1 880 подач на годину, а за 160 роботів настає повний затор (по 10 запусків із фіксованим seed на точку). У реальних парках затори виникають раніше, а інший планувальник змістив би вершину.

02

Що ми створили

  • Планувальник для групи роботів із безперервним надходженням завдань (lifelong) на основі PIBT (успадкування пріоритетів із поверненням, Okumura та ін.), реалізований за статтею. Він працює у Web Worker у вашому браузері, і той самий код планувальника виконав усі симуляції, на яких ґрунтуються основні числа цієї сторінки.
  • М’які односторонні проходи: розмічені напрямки перетворюються на ваги на неорієнтованій сітці. Рух проти напрямку коштує 3 кроки замість 1, тож роботи все одно їдуть проти нього, коли об’їзд був би довшим або коли місце потрібне іншому роботу. Редактор карти відхиляє будь-яку зміну — блокування чи розблокування клітинки, — після якої якийсь коридор опинився б поза всіма циклами: саме цієї умови потребує доведення досяжності в PIBT. Це перевіряє пошук мостів у графі.
  • Синхронне виконання з випадковими затримками. Щосекунди, перш ніж будь-хто рушить, 1 % запланованих переміщень випадково затримується, а роботи, що стоять у черзі за затриманим роботом, затримуються разом із ним, тож жоден робот ніколи не опиняється в зайнятій клітинці. Незалежний валідатор перевіряє кожен крок.
  • Станції комплектації, де час відбору для кожного стелажа вибирається випадково (гамма-розподіл). В інтерактивній візуалізації середнє значення можна перемикати між 3, 6, 12 і 24 секундами.
  • Перебір із 4 740 годинних запусків із фіксованим seed: від 20 до 400 роботів на основному складі, а також більший склад для перевірки. Кожна точка має довірчі смуги 95 %, а вершина — бутстреп-інтервал.
03

Стек технологій

JavaScript (ES-модулі) у Web Worker · three.js · Node.js worker threads для переборів · Python і NumPy для статистики

04

Цифри

ПоказникЯк ми це виміряли
5 134 на годину

Вершина кривої пропускної здатності: двосторонні проходи, середній час відбору 6 s. Один стелаж, поданий на станцію комплектації, — це одна подача; один крок сітки вважається однією секундою. Це максимум згладженої кривої (LOESS), побудованої за 1 400 годинними запусками з фіксованим seed з кількістю роботів від 20 до 400 (інтервал 95 %: від 5 130 до 5 139).

Від 196 до 235 роботів

Пласка вершина: будь-який розмір парку в цьому діапазоні дає результат у межах 0,5 % від найкращого. Згладжена крива досягає піку на 214 роботах (бутстреп-інтервал від 213 до 216); за іншої ширини згладжування ця точка зміщується в межах від 212 до 216.

−1 → −7 на робота

Скільки коштує кожен доданий робот, за апроксимаційною кривою, з бутстреп-інтервалами 95 %:

  • 214 → 235 роботів: −1,2 на годину (від −1,4 до −1,0)
  • 235 → 260 роботів: −3,7 на годину (від −4,0 до −3,5)
  • 260 → 300 роботів: −5,7 на годину (від −6,1 до −5,4)
  • 300 → 400 роботів: −7,1 на годину (від −7,3 до −6,8)
−20,5 %

Пропускна здатність за 400 роботів (4 080 на годину) порівняно з вершиною, за тією самою апроксимаційною кривою.

+25,4 %

Виграш у вершині завдяки розміченим одностороннім проходам: 6 439 на годину з 191 роботом. Виміряно ще на 1 400 запусках із фіксованим seed на тому самому складі з тими самими налаштуваннями; бутстреп-інтервал 95 % — від 25,3 % до 25,5 %.

У межах 2,5 %

За часу відбору 24 s склади з розміткою і без неї відрізняються не більш ніж на 2,5 % за будь-якого розміру парку (по 10 запусків із фіксованим seed на точку). 16 станцій обмежують продуктивність до 2 400 на годину.

35 % → 48 %

Частка роботів у русі, які не ближчі до своєї цілі, ніж 8 s тому, за 214 і за 400 роботів (двосторонні проходи, по 10 годинних запусків із фіксованим seed). Це сірі клітинки у фільмі та в інтерактивній візуалізації.

0 зіткнень

У 4 775 запусках із фіксованим seed (21,2 мільйона змодельованих кроків, із випадковою затримкою від 0 до 5 % запланованих переміщень) незалежний валідатор на жодному кроці не виявив двох роботів в одній клітинці, обміну місцями чи перестрибування. Планувальник і правило виконання виключають це за побудовою.

0 взаємних блокувань у 4 775 запусках

Спостережено, а не доведено. Після 10-хвилинного прогріву в жодному запуску не було 5-хвилинного відрізка без завершеного відбору. За часу відбору 6 s жоден робот у русі не стояв на місці довше ніж 111 s. За часу відбору 24 s найгірший випадок — 316 s: робот чекав у черзі до зайнятої станції. Серед 4 775 запусків — 35 запусків по 10 змодельованих годин кожен із 400 роботами.

0,11 ms

Середній час планування одного кроку для 400 роботів (Node.js на ноутбуці Apple M1 Pro, під час перебору). Той самий код у настільному Chrome на цьому ноутбуці витрачав від 0,13 до 0,4 ms на крок.

05

Кадри

06

Спробуйте наживо

Інтерактивна візуалізація, що працює у вашому браузері. Нічого не завантажується, доки ви її не відкриєте.

Спробувати наживо Завантажити 0,9 MB

Маєте схоже завдання?

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

Розкажіть нам Робототехніка