📦 Оптимізатор Розміщення на Складі — Угорський Алгоритм Наживо
Спостерігайте, як справжній угорський алгоритм розв'язує оптимальне призначення між товарами й місцями зберігання, щоб мінімізувати загальну відстань відбору, повторно розв'язуючи задачу наживо при зміні даних про частоту замовлень.
Про Оптимізатор Розміщення на Складі
Розміщення (слотування) — це логістична задача визначення того, яке місце зберігання має займати кожен товар (SKU) усередині складу. Якщо зробити правильно, комплектувальники витрачають менше часу на ходьбу; якщо неправильно, час переміщення — часто найбільша окрема стаття витрат у виконанні замовлень — роздувається. Ця симуляція формулює слотування як класичну задачу призначення: N товарів, N місць зберігання та матриця вартості, де cost(i,j) = частота_замовлень(товар i) × відстань_від_доку(слот j). Мета — знайти взаємно однозначне призначення товарів слотам, що мінімізує загальну вартість.
Замість наближення ця симуляція запускає справжній угорський алгоритм (Кун–Манкрес) на стороні клієнта в JavaScript: подвійні потенціали рядків/стовпців, побудова чергуючогося дерева та доповнювальні шляхи, точно як описано в літературі з дослідження операцій — розв'язуючи призначення до справжнього глобального оптимуму за час O(N³). Поряд працює жадібний базовий варіант (найзавантаженіший товар забирає свій найдешевший ще вільний слот, повторити), тож ви можете кількісно побачити, скільки вартості точний алгоритм заощаджує порівняно з наївною евристикою. Рандомізуйте дані про частоту замовлень або змініть розмір задачі й спостерігайте, як обидва розв'язки — і розрив між ними — оновлюються наживо.
Часті питання
Що таке задача призначення?
Задача призначення запитує: маючи N агентів і N завдань та вартість c(i,j) призначення агента i завданню j, знайти взаємно однозначне призначення, що мінімізує загальну вартість. Тут агенти — це товари, а завдання — місця зберігання, з вартістю, що дорівнює частоті замовлень товару, помноженій на відстань цього слота від доку. Повний перебір усіх N! можливих призначень можливий лише для крихітних N — уже 10 товарів означають 3 628 800 перестановок. Угорський алгоритм розв'язує точний оптимум за поліноміальний час, O(N³), незалежно від N.
Як насправді працює угорський алгоритм?
Класична формула Куна–Манкреса підтримує потенціал рядка u(i) і потенціал стовпця v(j) для кожного агента й завдання, такий що c(i,j) − u(i) − v(j) завжди невід'ємний і дорівнює нулю саме на ребрах, використаних поточним частковим паруванням. Починаючи з порожнього парування, вона повторно вирощує чергуюче дерево з непарованого рядка, відстежуючи мінімальний зазор до будь-якого недосяжного стовпця. Коли цей зазор ненульовий, потенціали коригуються рівномірно по всьому дереву, тож з'являється нове ребро з нульовою вартістю, розширюючи дерево без повторення роботи. Коли досягається непарований стовпець, алгоритм доповнює — перемикає статус паровано/непаровано вздовж шляху — збільшуючи парування на одиницю. Після N доповнень кожен агент паровано, і потенціали засвідчують оптимальність за LP-двоїстістю.
Чому жадібне призначення зазвичай гірше?
Жадібна евристика призначає товари слотам по одному — наприклад, найзавантаженіший товар першим, найдешевший ще вільний слот — і ніколи не переглядає ранні вибори. Це швидко (O(N² log N)), але недалекоглядно: раннє жадібне рішення може закріпити дешевий слот за товаром, який насправді його не потребував, змушуючи набагато пізніший товар зайняти дорогий залишковий слот. Угорський алгоритм розглядає всю матрицю одночасно через свої потенціали, тож жадібна стратегія ніколи не може перевершити його за загальною вартістю — він доказово оптимальний. Панель статистики цієї симуляції показує відсотковий розрив між ними наживо.
Що представляють подвійні потенціали u і v?
u(i) і v(j) походять із двоїстої задачі лінійного програмування задачі призначення. Інтуїтивно, u(i) — це нижня межа того, скільки має коштувати агент i незалежно від того, яке завдання він отримає, а v(j) — подібна межа для завдання j. Алгоритм збільшує ці потенціали в міру дослідження, завжди зберігаючи c(i,j) ≥ u(i) + v(j). Коли знайдено повне парування, де кожне паровано ребро задовольняє рівність, сума потенціалів дорівнює загальній вартості парування — доводячи, що дешевшого парування не може існувати, за слабкою LP-двоїстістю.
Чому розміщення на складі важливе в реальній логістиці?
У реальному розподільчому центрі час переміщення комплектувальника до й від місць зберігання є одним із найбільших компонентів вартості виконання замовлень — часто понад половина загального часу праці. Розміщення високочастотних, швидкорухомих SKU близько до доку чи станції пакування, а повільних — далі, може суттєво скоротити загальну відстань переміщення без будь-яких змін у будівлі чи процесі відбору. Це саме та задача призначення, яку розв'язує ця симуляція: мінімізувати суму (частота замовлень × відстань переміщення) для взаємно однозначного відображення товарів на слоти.
Чи масштабується алгоритм до тисяч SKU?
Класичний угорський алгоритм O(N³) комфортно обробляє від кількох сотень до кількох тисяч позицій за мілісекунди-секунди. Реальні системи управління складом із десятками тисяч SKU зазвичай використовують еквівалентний варіант Йонкера–Волгенанта (швидші константи, той самий клас складності) або розкладають задачу на зони/проходи, розв'язувані незалежно, оскільки рішення про розміщення зазвичай переоптимізуються періодично (щотижня/щомісяця), а не в реальному часі.
Це той самий алгоритм, що використовується для інших задач парування?
Так — угорський алгоритм розв'язує будь-яке збалансоване дводольне досконале парування мінімальної вартості, тож ідентична машинерія застосовується до планування завдань (робітники до змін), спортивного/екзаменаційного парування та багатооб'єктного трекінгу (зіставлення виявлень із відстежуваними ідентичностями кадр за кадром, наприклад, у трекерах на основі фільтра Калмана, поширених у комп'ютерному зорі). Змінюється лише визначення матриці вартості; логіка редукції рядків/стовпців та доповнювальних шляхів залишається незмінною.
Справжня матриця вартості (частота замовлень × відстань слота) розв'язується справжнім алгоритмом Куна–Манкреса — подвійні потенціали, чергуючі дерева, доповнювальні шляхи — і порівнюється наживо з жадібним базовим варіантом на плані складу й тепловій карті матриці вартості.
3D · рушій Three.js / WebGL · ціль 60 кадрів/с · працює повністю на клієнті, без встановлення