Техническое задание на разработку Системы планирования и диспетчеризации поставок жидкого цемента «CementFlow»
1. ВВЕДЕНИЕ
1.1. Наименование проекта
Система автоматизированного планирования и диспетчеризации поставок жидкого цемента «CementFlow» с поддержкой каскадного перерасчёта.
1.2. Краткое описание
Разрабатываемая система предназначена для оптимального распределения грузовиков-миксеров для выполнения заказов на доставку жидкого цемента в течение 12-часовой рабочей смены. Система обеспечивает автоматическое планирование поставок, мониторинг исполнения в реальном времени и интеллектуальный перерасчёт расписания при возникновении сбоев (поломки техники, ДТП, задержки).
1.3. Область применения
Система предназначена для использования:
-
Бетонными заводами и производственными комплексами
-
Логистическими компаниями, специализирующимися на перевозке строительных материалов
-
Диспетчерскими службами строительных компаний
1.4. Цели разработки
-
Повышение эффективности использования парка машин на 25-30%
-
Снижение простоев грузовиков-миксеров на 35-40%
-
Минимизация потерь бетона из-за превышения времени жизни
-
Обеспечение 95% своевременности доставок
-
Сокращение времени реакции на сбои с 30-60 минут до 5-10 минут
2. ОБЩИЕ ТРЕБОВАНИЯ
2.1. Функциональное назначение
Система должна обеспечивать:
2.1.1. Основные функции:
-
Планирование смены - формирование оптимального расписания поставок на 12-часовую смену
-
Распределение грузовиков - автоматический подбор машин для выполнения поставок
-
Мониторинг исполнения - отслеживание статуса поставок в реальном времени
-
Каскадный перерасчёт - автоматическое перепланирование при возникновении сбоев
-
Визуализация - отображение расписания в виде интерактивной диаграммы Ганта
2.1.2. Вспомогательные функции:
-
Управление справочниками (машины, водители, клиенты, объекты)
-
Формирование отчётности и аналитика
-
Интеграция с внешними системами (GPS, ERP, CRM)
-
Уведомления и оповещения
2.2. Пользователи системы
| Роль пользователя | Основные функции | Доступ |
|---|---|---|
| Диспетчер | Полный доступ ко всем функциям планирования и мониторинга | Веб-интерфейс |
| Руководитель смены | Просмотр, утверждение расписания, анализ эффективности | Веб-интерфейс |
| Водитель | Получение заданий, отметка о выполнении этапов, сообщение о проблемах | Мобильное приложение |
| Администратор | Управление пользователями, настройка системы, техническая поддержка | Веб-интерфейс |
| Клиент (опционально) | Просмотр статуса своего заказа, получение уведомлений | Веб-портал/SMS |
3. ТЕХНОЛОГИЧЕСКИЕ ТРЕБОВАНИЯ
3.1. Архитектурные требования
-
Микросервисная архитектура с разделением на независимые модули
-
Событийно-ориентированная архитектура для обработки событий в реальном времени
-
REST API для интеграции с внешними системами
-
Веб-сокеты для обновления интерфейса в реальном времени
-
Поддержка горизонтального масштабирования
3.2. Технологический стек
| Компонент | Технологии |
|---|---|
| Бэкенд | .NET 8, C# 12, ASP.NET Core |
| Фронтенд | React 18 + TypeScript, Redux Toolkit/ Svelte SvelteKit + TypeScript |
| База данных | PostgreSQL 16 (основная), Redis 7 (кэш) |
| Очереди сообщений | RabbitMQ или Azure Service Bus |
| Контейнеризация | Docker, Docker Compose |
| Оркестрация | Kubernetes (опционально) |
| Мониторинг | Grafana, Prometheus |
| CI/CD | GitLab CI/CD или GitHub Actions |
3.3. Требования к производительности
| Параметр | Требование |
|---|---|
| Время отклика API | ≤ 200 мс для 95% запросов |
| Время планирования смены | ≤ 30 секунд для 100 заказов |
| Время каскадного перерасчёта | ≤ 10 секунд |
| Поддержка одновременных пользователей | ≥ 50 диспетчеров |
| Доступность системы | 99.5% (SLA) |
| Время восстановления | ≤ 15 минут |
4. ДЕТАЛЬНОЕ ОПИСАНИЕ ФУНКЦИОНАЛА
4.1. Модуль управления заказами
4.1.1. Создание и редактирование заказов
-
Форма создания заказа с полями:
-
Клиент (выбор из справочника)
-
Объект доставки (адрес, контактное лицо, телефон)
-
Объём бетона (м³)
-
Марка бетона, подвижность
-
Желаемое время доставки (окно или точное время)
-
Приоритет (нормальный, высокий, критический)
-
Особые требования (непрерывная заливка, бетононасос и т.д.)
-
4.1.2. Автоматическое разбиение заказов на поставки
-
Алгоритм разбиения учитывает:
-
Вместимость доступных машин
-
Требование непрерывной заливки
-
Оптимальное заполнение миксера (минимизация остатков)
-
4.2. Модуль планирования
4.2.1. Алгоритм первоначального распределения
Детальное описание приведено в Приложении №1.
Входные данные:
-
Список всех заказов смены
-
Парк доступных машин с характеристиками
-
Расписание работы завода
Этапы алгоритма:
-
Группировка заказов по приоритету и временным окнам
-
Разбиение на поставки с учётом непрерывности заливки
-
Распределение по машинам по критериям:
-
Минимизация порожнего пробега
-
Максимальное использование вместимости
-
Учёт приоритета клиента
-
-
Расчёт временных окон с учётом:
-
Времени жизни бетона (90-120 минут)
-
Времени на погрузку, путь, разгрузку, возврат
-
Буфера на форс-мажор (10-15%)
-
-
Формирование диаграммы Ганта
4.2.2. Критерии выбора машины
Формула оценки приоритета машины:
Score = (W1 × DistanceScore) + (W2 × CapacityUtilization) + (W3 × TimeWindowFit) + PriorityBonus
где:
-
DistanceScore - оценка расстояния до завода (ближе = лучше)
-
CapacityUtilization - коэффициент заполнения миксера
-
TimeWindowFit - соответствие временному окну клиента
-
PriorityBonus - бонус за приоритет клиента
-
W1, W2, W3 - весовые коэффициенты (настраиваемые)
4.3. Модуль каскадного перерасчёта
4.3.1. Типы обрабатываемых событий
-
Поломка машины - машина выходит из строя
-
ДТП - авария с участием машины
-
Задержка на разгрузке - превышение планового времени разгрузки
-
Пробки - увеличение времени в пути
-
Изменение заказа - корректировка клиентом
-
Новая доступная машина - ввод машины в эксплуатацию
4.3.2. Алгоритм перерасчёта
Шаг 1: Анализ воздействия
-
Определение всех затронутых поставок
-
Оценка степени влияния на график
Шаг 2: Локализация проблемы
-
Ограничение области перерасчёта ближайшими поставками
-
Сохранение неизменными поставок, которые не затрагиваются
Шаг 3: Перераспределение
-
Попытка назначить затронутые поставки другим машинам
-
Использование резервного времени и буферов
-
Приоритизация критических поставок
Шаг 4: Каскадный сдвиг
-
Последовательный сдвиг зависимых поставок
-
Контроль накопления задержек
-
Проверка соблюдения времени жизни бетона
Шаг 5: Эскалация
-
Если автоматическое решение невозможно → уведомление диспетчера
-
Предложение вариантов для ручного выбора
4.4. Модуль визуализации
4.4.1. Диаграмма Ганта
Требования к отображению:
-
По горизонтали - временная шкала смены (12 часов)
-
По вертикали - список машин
-
Для каждой машины - цветные блоки поставок
-
Цветовая индикация статуса:
-
Зелёный - выполняется по плану
-
Жёлтый - есть риски/небольшие отклонения
-
Красный - критические отклонения/просрочки
-
Серый - завершено
-
Интерактивные возможности:
-
Drag-and-drop для ручного перемещения поставок
-
Масштабирование (часы/минуты)
-
Фильтрация по клиентам, объектам, статусам
-
Подсказки при наведении (детали поставки)
4.4.2. Карта перемещений
-
Отображение местоположения машин в реальном времени
-
Маршруты движения
-
Точки погрузки и разгрузки
-
Пробки и дорожная обстановка (интеграция с картами)
4.5. Модуль интеграций
4.5.1. Внешние системы
| Система | Тип интеграции | Назначение |
|---|---|---|
| GPS/телематика | REST API/WebSocket | Отслеживание местоположения, статуса машин |
| Картографические сервисы | API (Яндекс.Карты/Google Maps) | Расчёт маршрутов и времени в пути |
| ERP система | REST API | Импорт заказов, экспорт выполненных работ |
| CRM система | REST API | Получение информации о клиентах |
| СМС-сервис | REST API | Уведомления водителей и клиентов |
| Погодный сервис | REST API | Учёт погодных условий в планировании |
5. ТРЕБОВАНИЯ К ДАННЫМ
5.1. Структура базы данных
5.1.1. Основные таблицы:
-
Orders - заказы клиентов
-
Deliveries - поставки (части заказов)
-
Trucks - грузовики-миксеры
-
Drivers - водители
-
Clients - клиенты
-
ConstructionSites - объекты строительства
-
ScheduleSlots - слоты в расписании
-
Events - события системы
-
RoutePoints - точки маршрутов
5.1.2. Требования к хранению:
-
История изменений расписания - 90 дней
-
Архив выполненных поставок - 3 года
-
Логи событий - 30 дней
-
Оперативные данные - в кэше Redis
5.2. Форматы данных
5.2.1. JSON API форматы:
{
"order": {
"id": "ORD-2024-001",
"client": {
"id": "CL-001",
"name": "ООО СтройГрад",
"priority": "high"
},
"site": {
"address": "ул. Строителей, 15",
"coordinates": {"lat": 55.7558, "lng": 37.6176}
},
"details": {
"volume": 15.0,
"concreteGrade": "M300",
"slump": 15,
"requiredWindow": {
"start": "2024-01-15T09:00:00",
"end": "2024-01-15T12:00:00"
},
"continuousPouring": true,
"maxInterval": "PT30M"
}
}
}
6. ТРЕБОВАНИЯ К ИНТЕРФЕЙСУ
6.1. Веб-интерфейс диспетчера
6.1.1. Основной экран:
-
Левая панель - список заказов с фильтрами
-
Центральная область - диаграмма Ганта
-
Правая панель - детали выбранного элемента, уведомления
-
Верхняя панель - управление сменой, поиск, настройки
6.1.2. Экран планирования:
-
Календарь смен
-
Форма массового планирования
-
Инструменты оптимизации
-
Предпросмотр нагрузки на завод
6.1.3. Экран мониторинга:
-
Карта с движением машин
-
Панель статусов в реальном времени
-
Графики загрузки и эффективности
-
Оповещения о проблемах
6.2. Мобильное приложение водителя
6.2.1. Основные экраны:
-
Задания на день - список поставок
-
Текущее задание - детали, карта маршрута
-
Отметки о выполнении - кнопки для отметки этапов
-
Сообщения - связь с диспетчером
-
Проблемы - форма сообщения о сбоях
6.2.2. Функционал:
-
Авторизация по QR-коду или логину
-
Офлайн-работа с последующей синхронизацией
-
GPS-трекинг
-
Фотоотчётность (по требованию)
7. ТРЕБОВАНИЯ К НАДЁЖНОСТИ И БЕЗОПАСНОСТИ
7.1. Надёжность
-
Резервирование всех критических компонентов
-
Автоматическое восстановление после сбоев
-
Ежедневное резервное копирование с хранением 7 дней
-
Мониторинг доступности и производительности
7.2. Безопасность
-
Аутентификация по логину/паролю + 2FA для администраторов
-
Ролевая модель доступа (RBAC)
-
HTTPS для всех соединений
-
Защита от DDoS атак
-
Аудит действий пользователей
-
Шифрование конфиденциальных данных
8. ТРЕБОВАНИЯ К РАЗВЁРТЫВАНИЮ И ЭКСПЛУАТАЦИИ
8.1. Развёртывание
-
Контейнерная поставка всех компонентов
-
Автоматическое развёртывание через CI/CD
-
Документация по установке и настройке
-
Миграционные скрипты для обновлений
8.2. Эксплуатация
-
Техническая поддержка 24/7 для критических инцидентов
-
Обновления - 1 раз в месяц (патчи), 1 раз в квартал (версии)
-
Мониторинг - дашборды, алертинг, логирование
-
Резервное копирование - автоматическое, ежедневно
9. ЭТАПЫ РАЗРАБОТКИ
Этап 1: Прототип и архитектура (1-2 месяца)
-
Разработка архитектуры
-
Создание прототипа алгоритмов планирования
-
Проектирование БД и API
-
Базовый веб-интерфейс
Этап 2: Ядро системы (3-4 месяца)
-
Реализация основных модулей
-
Алгоритмы распределения и перерасчёта
-
Веб-интерфейс диспетчера
-
Интеграция с GPS/картами
Этап 3: Доработка и тестирование (2-3 месяца)
-
Мобильное приложение для водителей
-
Расширенная аналитика
-
Стресс-тестирование
-
Пилотная эксплуатация
Этап 4: Внедрение и поддержка (постоянно)
-
Внедрение у заказчика
-
Обучение пользователей
-
Техническая поддержка
-
Доработки по обратной связи
10. КРИТЕРИИ ПРИЁМКИ
10.1. Функциональные критерии
-
Система корректно планирует смену для 100+ заказов
-
Автоматический перерасчёт выполняется за ≤10 секунд
-
Диаграмма Ганта отображает все поставки без пересечений
-
Интеграция с GPS работает в реальном времени
-
Мобильное приложение работает офлайн
10.2. Нефункциональные критерии
-
Время отклика интерфейса ≤200 мс
-
Система выдерживает нагрузку 50+ одновременных пользователей
-
Доступность 99.5% в рабочее время
-
Данные сохраняются при перезапуске системы
10.3. Приёмочные испытания
-
Тестирование на тестовых данных - 7 дней
-
Пилотная эксплуатация - 14 дней
-
Стресс-тестирование - имитация сбоев и высокой нагрузки
-
Проверка безопасности - пентест
11. ГАРАНТИИ И ПОДДЕРЖКА
11.1. Гарантийный период
-
12 месяцев с момента подписания акта приёмки
-
Исправление критических багов - в течение 24 часов
-
Исправление некритических багов - в течение 5 рабочих дней
11.2. Техническая поддержка
-
Поддержка 24/7 для критических инцидентов
-
Консультации по использованию системы
-
Обновления и доработки по согласованию
-
Резервное копирование и восстановление данных
ПРИЛОЖЕНИЯ
Приложение A: Словарь терминов
-
Слот - временной интервал, выделенный машине для выполнения поставки
-
Каскадный перерасчёт - последовательное перепланирование зависимых поставок
-
Время жизни бетона - период от замеса до начала схватывания (90-120 минут)
-
Непрерывная заливка - требование минимального интервала между поставками на объект
Приложение B: Схемы интеграций
(Диаграммы последовательности и архитектурные схемы)
Приложение C: Макеты интерфейсов
(Визуальные макеты всех экранов системы)
ИСПОЛНИТЕЛЬ: [Наименование организации-исполнителя]
ЗАКАЗЧИК: [Наименование организации-заказчика]
СРОК РАЗРАБОТКИ: 8-12 месяцев
СТОИМОСТЬ РАЗРАБОТКИ: [Сумма] руб.
СРОК ДЕЙСТВИЯ ТЗ: до [Дата]
Документ утверждён:
[Подпись Заказчика] [Подпись Исполнителя]
[Дата] [Дата]
Приложение №1
ДЕТАЛЬНОЕ ОПИСАНИЕ АЛГОРИТМА ПЕРВОНАЧАЛЬНОГО РАСПРЕДЕЛЕНИЯ
1. ОБЩИЙ ПРИНЦИП РАБОТЫ АЛГОРИТМА
Алгоритм первоначального распределения — это многоуровневая жадная эвристика с обратной связью, которая преобразует список заказов клиентов в оптимизированное расписание поставок для всего парка машин на 12-часовую смену. Алгоритм работает по принципу "наиболее ограниченные задачи решаются первыми".
Ключевая идея: Сначала назначаются самые сложные и критичные поставки, затем менее сложные, что позволяет избежать ситуаций, когда критичные задачи невозможно выполнить из-за того, что все ресурсы уже заняты менее важными задачами.
2. ПОШАГОВЫЙ АЛГОРИТМ С РАСЧЁТАМИ
Этап 0: Подготовка данных (Pre-processing)
Входные данные:
-
Список заказов на смену (N заказов)
-
Парк доступных машин (M единиц)
-
Параметры смены (начало T_start, конец T_end, координаты завода)
-
Технологические константы (время погрузки, средняя скорость и т.д.)
Шаг 0.1: Валидация и нормализация данных
Для каждого заказа: 1. Проверить корректность данных 2. Рассчитать минимальное и максимальное время доставки 3. Привести желаемое окно клиента к стандартному формату 4. Вычислить коэффициент срочности = (дедлайн - текущее время) / общее время смены
Шаг 0.2: Сортировка заказов по сложности выполнения
Сложность_заказа = (Приоритет_клиента × 0.4) +
(Коэффициент_срочности × 0.3) +
(Объём_заказа / Стандартный_объём × 0.2) +
(Сложность_логистики × 0.1)
Сортируем заказы по убыванию Сложности_заказа
Этап 1: Разбиение заказов на атомарные поставки
Шаг 1.1: Определение оптимального размера поставки
Для каждого заказа:
Если Объём_заказа ≤ Максимальная_вместимость_машины:
Количество_поставок = 1
Объём_поставки = Объём_заказа
Иначе:
Найти все доступные вместимости машин: C1, C2, ..., Ck
Найти оптимальное разбиение, минимизирующее:
Целевая_функция = α × Количество_поставок +
β × (Сумма_остатков_в_машинах) +
γ × (Максимальный_интервал_между_поставками)
Пример расчёта для заказа 15 м³:
Доступные вместимости машин: 5 м³, 7 м³, 10 м³ Варианты разбиения: 1) 3 × 5 м³ = 15 м³ (остаток 0) ✓ 2) 2 × 7 м³ = 14 м³ (остаток 1 м³ - требует доп. машину 5 м³) 3) 1 × 10 м³ + 1 × 5 м³ = 15 м³ (остаток 0) ✓ Выбираем вариант 3, так как минимизирует количество поставок
Шаг 1.2: Создание сущностей поставок
Для каждой поставки:
1. Присвоить уникальный ID
2. Унаследовать данные от родительского заказа
3. Рассчитать параметры:
- Минимальное время выполнения = Погрузка + Путь_туда + Разгрузка + Возврат
- Время жизни бетона = 90 минут (для стандартного бетона)
- Окончательный дедлайн = MIN(Дедлайн_клиента, Время_начала + Время_жизни)
Этап 2: Группировка поставок для параллельной обработки
Шаг 2.1: Создание групп по ограничениям
Группа А: Поставки с жёсткими временными окнами (нельзя сдвигать) Группа Б: Поставки, требующие непрерывной заливки Группа В: Поставки для VIP-клиентов Группа Г: Стандартные поставки Группа Д: Поставки с гибкими временами Приоритет обработки: А → Б → В → Г → Д
Шаг 2.2: Внутригрупповая сортировка
Для каждой группы сортировка по: 1. Времени начала окна (от более раннего к более позднему) 2. Длительности окна (от более узкого к более широкому) 3. Объёму (от большего к меньшему)
Этап 3: Распределение поставок по машинам
Цикл обработки поставок:
Для каждой поставки в порядке приоритета групп:
Шаг 3.1: Формирование пула кандидатов
Для каждой машины проверяем:
1. Вместимость ≥ Объём_поставки
2. Техническая исправность = true
3. Машина доступна в течение смены
4. Машина может прибыть на завод к нужному времени
Шаг 3.2: Предварительная оценка кандидатов
Для каждой машины-кандидата рассчитываем:
Время_начала_минимальное = MAX(Текущее_свободное_время, Время_прибытия_на_завод)
Время_окончания = Время_начала + Длительность_поставки
Отсеиваем кандидатов, у которых:
- Время_окончания > Окончательный_дедлайн
- Время_окончания > Конец_смены
- Время_разгрузки > Время_начала + Время_жизни_бетона
Шаг 3.3: Детальный расчёт для каждого кандидата
Для каждого оставшегося кандидата:
1. Рассчитать точное время всех этапов:
- Выезд на завод: Время_начала - Путь_до_завода
- Погрузка: 15-20 минут (зависит от объёма)
- Путь к клиенту: Расстояние / Средняя_скорость × Коэффициент_пробок
- Разгрузка: 2-3 минуты на м³
- Возврат: Расстояние_обратно / Средняя_скорость
2. Проверить пересечения с существующими слотами машины
3. Рассчитать буферы:
- Операционный буфер: 10% от времени в пути
- Рисковый буфер: 5-15 минут (зависит от сложности объекта)
Шаг 3.4: Оценка и выбор лучшего кандидата
Оценочная_функция(Машина, Поставка) =
W1 × Оценка_времени +
W2 × Оценка_расстояния +
W3 × Оценка_использования +
W4 × Оценка_качества
Где:
Оценка_времени = 1 / (Время_начала - Идеальное_время_начала)²
Оценка_расстояния = 1 / (Порожний_пробег + 1)
Оценка_использования = Объём_поставки / Вместимость_машины
Оценка_качества = Коэффициент_приоритета_клиента
W1, W2, W3, W4 — настраиваемые веса (по умолчанию: 0.4, 0.3, 0.2, 0.1)
Шаг 3.5: Назначение и фиксация
Если найден подходящий кандидат:
- Закрепляем поставку за машиной
- Создаём слот с рассчитанными временами
- Обновляем доступное время машины
- Добавляем в расписание
Иначе:
- Перемещаем поставку в очередь проблемных
- Записываем причину неудачи
Этап 4: Обработка поставок, требующих непрерывной заливки
Особый алгоритм для заказов с непрерывной заливкой:
Для каждого заказа с требованием непрерывности:
1. Собрать все поставки этого заказа в группу
2. Определить требуемый интервал между поставками (например, ≤30 минут)
3. Найти машины, которые могут выполнить несколько поставок подряд:
- Проверить возможность выполнения N поставок одной машиной
- Рассчитать суммарное время и проверить попадание в окно клиента
4. Если одной машиной невозможно:
- Найти несколько машин с максимально близкими временами разгрузки
- Синхронизировать их расписание для минимизации интервалов
5. Провести корректировку:
- Сдвинуть поставки для соблюдения интервала
- Убедиться, что сдвиг не нарушает другие ограничения
Этап 5: Пост-обработка и оптимизация
Шаг 5.1: Балансировка нагрузки
Для каждой машины рассчитываем: Коэффициент_загрузки = Суммарное_время_работы / Длительность_смены Средний_коэффициент = SUM(Коэффициент_загрузки) / Количество_машин Для машин с Коэффициент_загрузки > Средний_коэффициент + 0.2: Попробовать перенести часть поставок на менее загруженные машины
Шаг 5.2: Минимизация порожних пробегов
Для каждой последовательности поставок у машины: Рассчитать маршрут: База → Завод → Объект1 → Завод → Объект2 → ... Оценить порожний пробег между объектами Попробовать переставить поставки в последовательности для: - Уменьшения расстояния между объектами - Группировки поставок по географическим зонам
Шаг 5.3: Добавление защитных буферов
Для каждого слота в расписании:
Если поставка критичная или объект сложный:
Добавить_буфер = 15-20 минут
Иначе если время в пути > 60 минут:
Добавить_буфер = 10% от времени в пути
Иначе:
Добавить_буфер = 5 минут
Распределить буфер:
- 50% добавить перед разгрузкой (на случай задержек в пути)
- 50% добавить после разгрузки (на случай задержек на объекте)
Этап 6: Обработка проблемных поставок
Шаг 6.1: Анализ причин неудачи
Типичные причины: 1. Нехватка машин нужной вместимости 2. Отсутствие временных окон 3. Противоречивые ограничения 4. Невозможность соблюсти время жизни бетона
Шаг 6.2: Попытка перераспределения
Для каждой проблемной поставки:
1. Ослабить ограничения (если возможно):
- Расширить временное окно
- Разрешить использование машин большей вместимости
- Увеличить максимальный интервал для непрерывной заливки
2. Попробовать занять резервное время других машин
3. Предложить разбить поставку на меньшие частиШаг 6.3: Эскалация к диспетчеру
Если автоматическое распределение невозможно:
1. Сформировать отчёт с причинами
2. Предложить варианты решения:
- Добавить дополнительную машину
- Перенести заказ на другую смену
- Увеличить временное окно
- Изменить параметры заказа
3. Передать задачу диспетчеру для ручного решения
3. МАТЕМАТИЧЕСКАЯ ФОРМАЛИЗАЦИЯ
Основная целевая функция:
Минимизировать: Z = α×Z₁ + β×Z₂ + γ×Z₃ + δ×Z₄ Где: Z₁ = Σ(Время_доставки - Идеальное_время)² # Минимизация отклонений Z₂ = Σ(Порожний_пробег) # Минимизация пробегов Z₃ = Σ(1 - Коэффициент_заполнения)² # Максимизация использования Z₄ = Σ(Штрафы_за_нарушение_ограничений) # Минимизация нарушений
Ограничения:
1. ∀i: Время_начала_слота_i ≥ Время_окончания_слота_{i-1} + Время_перехода
2. ∀i: Время_разгрузки_i ≤ Время_погрузки_i + Время_жизни_бетона
3. ∀j: Σ(Объём_поставок_заказа_j) = Объём_заказа_j
4. ∀k: Σ(Время_работы_машины_k) ≤ Длительность_смены
5. ∀l,m: |Время_разгрузки_l - Время_разгрузки_m| ≤ Максимальный_интервал,
если l и m принадлежат одному заказу с непрерывной заливкой4. ПРИМЕР РАСЧЁТА ДЛЯ КОНКРЕТНОГО СЦЕНАРИЯ
Исходные данные:
-
Смена: 07:00 - 19:00 (12 часов)
-
Парк: 5 машин (вместимости: 5, 5, 7, 7, 10 м³)
-
Завод: Координаты (55.7558, 37.6176)
-
Средняя скорость: 40 км/ч в городе, 60 км/ч за городом
Заказ 1:
-
Клиент: СтройГрад (приоритет: высокий)
-
Объём: 15 м³
-
Объект: 10 км от завода
-
Окно: 09:00 - 12:00
-
Требуется непрерывная заливка, макс. интервал 30 мин
Расчёт алгоритма:
Шаг 1: Разбиение заказа
Оптимальное разбиение: 10 м³ + 5 м³ Обоснование: Минимизация количества поставок (2 вместо 3)
Шаг 2: Расчёт временных параметров для поставки 10 м³
Время погрузки: 10 м³ × 3 мин/м³ = 30 минут Время в пути: 10 км / 40 км/ч = 15 минут Время разгрузки: 10 м³ × 2.5 мин/м³ = 25 минут Возврат: 10 км / 40 км/ч = 15 минут Итого: 30 + 15 + 25 + 15 = 85 минут Буфер: 10% = 9 минут Общее время слота: 94 минуты ≈ 1 час 34 минуты
Шаг 3: Поиск подходящей машины
Кандидаты по вместимости: машины 7 м³ и 10 м³ Машина 1 (7 м³): не подходит - объём 10 > 7 Машина 2 (7 м³): не подходит Машина 3 (10 м³): свободна с 07:00 Расчёт для машины 3: Выезд с базы: 07:00 Прибытие на завод: 07:15 Погрузка: 07:15 - 07:45 Путь к клиенту: 07:45 - 08:00 Разгрузка: 08:00 - 08:25 Возврат: 08:25 - 08:40 Проверка ограничений: ✓ Попадание в окно клиента (08:00 ∈ [09:00-12:00] - требуется корректировка) ✓ Время жизни бетона: 08:00 - 07:45 = 15 минут < 90 минут ✓ Конец слота 08:40 < конец смены 19:00
Шаг 4: Корректировка времени
Требуется сдвинуть на 1 час позже: Погрузка: 08:15 - 08:45 Разгрузка: 09:00 - 09:25 (попадает в окно) Обновлённый слот: 08:00 - 09:40
Шаг 5: Аналогичный расчёт для поставки 5 м³
Выбираем машину 5 м³, начинаем на 30 минут позже первой поставки для соблюдения непрерывной заливки: Разгрузка: 09:25 - 09:40 (интервал 0 минут ✓)
5. ОСОБЕННОСТИ РЕАЛИЗАЦИИ
5.1. Эвристические правила, используемые в алгоритме:
-
Правило ближайшего соседа:
-
После выполнения поставки на объекте, следующая поставка назначается на ближайший объект
-
-
Правило заполнения до конца:
-
Если осталось мало времени до конца смены, назначаются короткие поставки рядом с базой
-
-
Правило резервирования VIP:
-
Для VIP-клиентов резервируется 10% времени у лучших машин
-
-
Правило избегания пиков:
-
Стараться не назначать разгрузку в часы пик (08:00-10:00, 17:00-19:00)
-
5.2. Обработка конфликтов и тупиковых ситуаций:
Тупиковая ситуация: Нельзя назначить поставку без нарушения ограничений
Стратегии выхода:
-
Откат (Backtracking): Отменить последнее назначение и попробовать другой вариант
-
Ослабление ограничений: Временно разрешить небольшое нарушение
-
Разделение проблемы: Разделить сложную поставку на части
-
Перенос на потом: Отложить решение до обработки других поставок
5.3. Оптимизационные улучшения:
-
Локальный поиск: После построения расписания пытаться улучшить его небольшими изменениями
-
Табу-поиск: Запрещать возврат к недавно рассмотренным решениям
-
Имитация отжига: Иногда разрешать ухудшения для выхода из локальных оптимумов
6. ПРОИЗВОДИТЕЛЬНОСТЬ И МАСШТАБИРУЕМОСТЬ
Временная сложность:
O(N × M × K × L) Где: N - количество поставок M - количество машин K - среднее количество временных окон у машины L - сложность проверки ограничений Для типичного сценария (50 поставок, 10 машин): ≈ 50 × 10 × 5 × 10 = 25,000 операций Время выполнения: ~2-3 секунды
Память:
Требуется хранить: - Матрицу назначений: N × M элементов - Расписание каждой машины: M списков по ~10 элементов - Кэш рассчитанных расстояний: ~N² элементов Общий объём: O(N² + M × N) ≈ 100-500 КБ для типичного сценария
7. ВАЛИДАЦИЯ И ТЕСТИРОВАНИЕ АЛГОРИТМА
Тестовые сценарии:
-
Идеальный случай: Все поставки могут быть назначены без конфликтов
-
Предельная загрузка: Количество поставок на пределе возможностей парка
-
Конфликт ограничений: Противоречивые требования клиентов
-
Каскадный сбой: Отказ ключевой машины в начале смены
Метрики качества расписания:
1. Коэффициент использования машин: Должен быть 70-90% 2. Среднее отклонение от идеального времени: Должно быть < 30 минут 3. Количество нарушений ограничений: Должно быть 0 4. Суммарный порожний пробег: Минимизируется 5. Баланс загрузки: Разница загрузки машин < 20%
8. ИНТЕГРАЦИЯ С ДРУГИМИ СИСТЕМАМИ
Алгоритм получает данные из:
-
CRM-системы — информация о клиентах и их приоритетах
-
ERP-системы — данные о заказах и производственных мощностях
-
GPS-трекера — текущее положение машин
-
Картографических сервисов — актуальные данные о пробках и маршрутах
-
Погодных сервисов — прогноз для корректировки времени в пути
9. НАСТРОЙКА И КАЛИБРОВКА
Алгоритм имеет настраиваемые параметры:
# Веса в оценочной функции
WEIGHTS = {
'time_deviation': 0.4, # Важность соблюдения времени
'distance': 0.3, # Важность минимизации пробега
'capacity_utilization': 0.2, # Важность заполнения машины
'client_priority': 0.1 # Важность приоритета клиента
}
# Буферы и допуски
TOLERANCES = {
'time_window': 15, # Допустимое отклонение от окна (мин)
'continuous_pouring': 5, # Допуск по интервалу непрерывности (мин)
'concrete_lifetime': 10 # Запас по времени жизни бетона (мин)
}
# Стратегические параметры
STRATEGY = {
'reserve_vip_capacity': 0.1, # Резерв для VIP-клиентов (10%)
'max_backtracking_depth': 3, # Макс. глубина отката
'optimization_iterations': 100 # Количество итераций оптимизации
}10. ПРАКТИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО РЕАЛИЗАЦИИ
-
Начинать с простого: Сначала реализовать базовый жадный алгоритм без оптимизации
-
Добавлять сложность постепенно: Поэтапно вводить дополнительные ограничения и оптимизации
-
Использовать кэширование: Кэшировать результаты расчёта расстояний и проверок
-
Реализовать инкрементальное обновление: При изменении одной поставки не пересчитывать всё расписание
-
Предусмотреть ручное вмешательство: Возможность диспетчера корректировать автоматические решения
ЗАКЛЮЧЕНИЕ
Алгоритм первоначального распределения представляет собой сбалансированную комбинацию эвристических правил и оптимизационных техник, которая позволяет быстро строить качественное расписание даже для сложных сценариев. Его ключевые преимущества:
-
Гарантированное нахождение решения (если оно существует)
-
Учёт всех технологических ограничений цементной логистики
-
Баланс между оптимальностью и скоростью работы
-
Возможность каскадной обработки — сначала сложные, потом простые задачи
-
Интеграция с системами реального времени для учёта текущей обстановки
Алгоритм является основой всей системы планирования и обеспечивает стабильную работу даже в условиях высокой нагрузки и неопределённости.