Разработка AI-системы оптимизации cross-docking
Cross-docking — принципиально другой режим логистики: груз не хранится, а немедленно перегружается с принимающего дока на отправляющий. Окно операции — 2–4 часа. AI координирует потоки так, чтобы входящие и исходящие машины встречались без ожидания.
Специфика задачи cross-docking
Классический склад оптимизирует хранение и сборку. Кросс-докинг оптимизирует синхронизацию:
- Входящие потоки: TIR-поставщиков с 50–200 артикулами
- Исходящие потоки: региональные развозные машины по торговым точкам
- Задача: какой груз с какой машины → на какую машину, в какой последовательности
Типы кросс-докинга:
- Pre-distribution: поставщик уже маркирует товар под конкретные магазины
- Post-distribution: разбивка на терминале AI-системой
- Opportunistic: смешанный склад использует кросс-докинг для части потока
AI-планировщик операций
Временна́я синхронизация прибытия
ML-прогноз времени прибытия каждого TIR (ETA) → составление слота разгрузки для каждого дока:
from ortools.sat.python import cp_model
import numpy as np
def schedule_crossdock(
inbound_trucks, # [{id, eta, items: [(sku, qty)], dock_time_min}]
outbound_trucks, # [{id, departure, required_items: [(sku, qty)]}]
n_docks=20,
planning_horizon=480 # минут
):
"""Оптимизация назначения доков и расписания перегрузки"""
model = cp_model.CpModel()
# Переменная: время начала разгрузки каждой входящей машины
unload_start = {}
unload_end = {}
for truck in inbound_trucks:
earliest = max(0, int(truck['eta']))
latest = planning_horizon - truck['dock_time_min']
unload_start[truck['id']] = model.NewIntVar(earliest, latest, f"us_{truck['id']}")
unload_end[truck['id']] = model.NewIntVar(
earliest + truck['dock_time_min'], planning_horizon, f"ue_{truck['id']}"
)
model.Add(unload_end[truck['id']] == unload_start[truck['id']] + truck['dock_time_min'])
# Назначение доков: каждый входящий грузовик получает один из N доков
dock_assign = {}
for truck in inbound_trucks:
dock_assign[truck['id']] = model.NewIntVar(0, n_docks - 1, f"dock_{truck['id']}")
# Ограничение: на одном доке одновременно не более одной машины
intervals = {}
for truck in inbound_trucks:
intervals[truck['id']] = model.NewOptionalIntervalVar(
unload_start[truck['id']], truck['dock_time_min'],
unload_end[truck['id']], True, f"interval_{truck['id']}"
)
# No-overlap на каждом доке
for dock in range(n_docks):
trucks_at_dock = [intervals[t['id']] for t in inbound_trucks
if dock_assign.get(t['id'])] # упрощение
if len(trucks_at_dock) > 1:
model.AddNoOverlap(trucks_at_dock)
# Цель: минимизировать задержку исходящих машин
delays = []
for out_truck in outbound_trucks:
ready_time = model.NewIntVar(0, planning_horizon, f"ready_{out_truck['id']}")
# Машина готова когда все нужные SKU разгружены
required_unload_times = [
unload_end[in_t['id']] for in_t in inbound_trucks
if any(sku in [i[0] for i in in_t['items']]
for sku in [r[0] for r in out_truck['required_items']])
]
for t in required_unload_times:
model.Add(ready_time >= t)
delay = model.NewIntVar(0, planning_horizon, f"delay_{out_truck['id']}")
model.Add(delay >= ready_time - out_truck['departure'])
delays.append(delay)
model.Minimize(sum(delays))
solver = cp_model.CpSolver()
solver.parameters.max_time_in_seconds = 30.0
status = solver.Solve(model)
return solver, model, unload_start, dock_assign
Оптимизация физической разбивки груза
Сортировка потоков на конвейере:
Автоматические сортировочные конвейеры (cross-belt sorter, tilt tray sorter) направляют коробки по доковым каналам. AI управляет:
- Приоритет срочных доков (отправление через 30 мин — сначала туда)
- Балансировка: не создавать затор на одном канале
- Прогноз завершения сортировки по каждому исходящему рейсу
Динамическая переработка плана:
Задержка входящей машины → пересчёт плана для исходящих:
- Какие машины могут подождать 30–60 мин (допуск по временному окну доставки)?
- Какие части отправки можно скомплектовать из других машин?
- Нужно ли перенести отправку на следующий рейс?
Метрики и интеграция
KPI кросс-докингового терминала:
- Throughput: количество паллет/час через терминал
- Cross-dock ratio: % грузов через кросс-доки vs. хранение
- Dock door utilization: % времени, когда дверь занята
- On-time departure rate: % машин, отправившихся по расписанию
Интеграции:
- TMS (транспортные задания, ETA обновления)
- WMS (ярлыки, сортировка)
- Весы / сканеры на воротах (автоматическая идентификация)
- Видеоналитика на доках: подтверждение завершения разгрузки/погрузки
Срок разработки: 4–6 месяцев для полного планировщика кросс-докинга с интеграцией в TMS/WMS и системы сортировки.







