Любая система жестких правил на складе — это бомба замедленного действия. Таймер привязан исключительно к росту ваших объемов.
Пока вы отгружаете тысячу заказов в сутки, жадные алгоритмы и статичное зонирование работают нормально. На десяти тысячах начинаются пробки из роботов-комплектовщиков, а пикеры бегают из угла в угол за внезапно взлетевшим в топы продаж SKU. На ста тысячах классическая маршрутизация ложится. Вы пытаетесь дописать еще сотню условий в ваш движок правил, но эвристики маршрутизации и размещения товара упираются в потолок. В нестационарной среде, где профиль спроса меняется быстрее, чем перестраивается топология, статика мертва.
Именно здесь возникает понимание, что Reinforcement Learning на складе и в логистике: там, где жёсткие правила уже не справляются — это не исследовательский хайп, а прагматичный ответ на провал классического Operations Research в реалтайме.
Почему MILP умирает, а RL выживает
Если у вас есть статический граф склада, вы можете описать задачу слотирования или балансировки нагрузки как Mixed-Integer Linear Programming (MILP). Математически это безупречно. Практически — решатель (solver) будет искать глобальный оптимум для 50 000 ячеек четыре часа.
А склад живет прямо сейчас. Конвейер забился. Погрузчик перекрыл главную аллею. Упал внезапный B2B-заказ на три палеты, который ломает всю очередь. Ждать оптимума некогда.
Обученный RL-агент делает инференс за миллисекунды. Ему не нужно искать глобальный оптимум при каждом изменении среды, он уже аппроксимировал функцию ценности (Value function) на этапе обучения. В проде он просто прогоняет текущий state через веса нейросети и выдает action. Это принципиальный сдвиг архитектуры: мы переносим вычислительную сложность с момента исполнения на момент обучения. Алгоритм не решает задачу с нуля, он интуитивно «знает», куда отправить AMR (Autonomous Mobile Robot) на основе выученной политики.
Архитектура среды и Reward-хакинг
Самая сложная часть RL в логистике — не выбор алгоритма вроде PPO или SAC, а дизайн самой среды. Агент слеп, он просто максимизирует скалярный сигнал. Ошибетесь в функции награды — получите систему, которая идеально решает не ту задачу.
Пишете награду только за доставленный товар? Агенты начнут блокировать друг друга на перекрестках, пытаясь перехватить приоритетные заказы. Добавляете штраф за время в пути? Они могут вообще забиться в угол и остановиться, чтобы не накапливать отрицательный реворд.
def step(self, action_dict):
rewards = {}
for agent_id, action in action_dict.items():
state = self.agents[agent_id].state
# 1. Попытка движения в занятую ячейку или стену
if self._is_collision(state, action):
rewards[agent_id] = -10.0 # Жесткий штраф за коллизию
continue
# 2. Выполнение полезного действия (пик товара)
if action == ACTION_PICK and self._at_target(agent_id):
rewards[agent_id] = 50.0 # Основной профит
self._update_order_status(agent_id)
continue
# 3. Штраф за простой
# Заставляем агента двигаться к цели, а не стоять на месте
rewards[agent_id] = -0.1
self._update_global_state(action_dict)
return self._get_obs(), rewards, self._is_done(), {}Тонкая настройка баланса между collision_penalty и idle_penalty — это то, где реальная физика склада транслируется в математику. Когда мы в Morana Labs катили мультиагентную маршрутизацию для парка AMR на крупном дарксторе, мы месяц вычищали reward hacking. В симуляторе агенты научились выстраиваться в «живой щит» вокруг зон плотного слотирования, отсекая конкурентов. В метриках симуляции throughput рос в небеса, на практике это означало бы наглухо заблокированные аллеи. Пришлось переписывать state, добавляя локальные карты плотности трафика, и жестко пенализировать скопления без полезной нагрузки.
Sim2Real: почему симулятор вам врет
RL требует миллионов итераций. Обучать агента на реальных железных роботах невозможно — вы физически уничтожите склад в первый же день. Нужна симуляция. Будь то NVIDIA Isaac Sim или кастомный движок на базе дискретно-событийного моделирования (DES) — симулятор всегда идеальнее реальности.
В реальности колеса проскальзывают из-за пыли на бетоне. Wi-Fi теряет пакеты, и p99 latency сети прыгает до двух секунд в мертвых зонах между металлическими стеллажами. Человек-пикер не идет по вектору с постоянной скоростью 1.2 м/с, он останавливается посмотреть в терминал сбора данных.
Разрыв между симуляцией и реальностью (sim2real gap) закрывается через Domain Randomization. При обучении мы намеренно шатаем параметры среды: вливаем гауссовский шум в показания сенсоров, рандомизируем трение, отключаем узлы графа топологии. Агент, выживший в этом хаосе, становится робастным. Поверх нейросети всегда ставится safety wrapper — слой детерминированных эвристик, который на аппаратном уровне запретит роботу выполнить команду движения в человека, даже если сетка почему-то выдаст такой экшен. Безопасность и предсказуемость поведения агента гарантируются жестким кодом, а оптимизация процесса — нейросетью.
Когда классическая оптимизация всё ещё лучше
Не тащите Reinforcement Learning туда, где работает математика 60-х годов. Если топология вашего склада не меняется, ассортимент стабилен, а роботы ездят по выделенным линиям — классический A* и ПИД-регуляторы порвут любую нейросеть по стоимости поддержки и предсказуемости.
Критерии, по которым можно понять, что потолок классики пробит:
- Среда высокодинамична. Постоянные перекрытия зон людьми и техникой, появление новых приоритетных задач поверх исполняемой очереди.
- Масштаб убивает реалтайм. Пересчет оптимальных маршрутов при малейшем сбое для сотни агентов или слотирование 100 000 SKU занимает дольше, чем физическое время реакции системы.
- Кросс-зависимости. Оптимизация одной подсистемы (маршруты) ломает другую (балансировка износа батарей), а ручной тюнинг весовых коэффициентов в if-else деревьях превратился в шаманизм.
Инференс готовой политики всегда уезжает на edge-железо. Модель компилируется в TensorRT и крутится на локальном сервере внутри контура логистического центра или прямо на борту робота на базе Jetson. Ждать ответа от облака нельзя. В логистике 200 миллисекунд сетевой задержки — это пропущенный поворот на крейсерской скорости.