Skip to main content

Техническое задание на разработку Системы планирования и диспетчеризации поставок жидкого цемента «CementFlow»

1. ВВЕДЕНИЕ

1.1. Наименование проекта

Система автоматизированного планирования и диспетчеризации поставок жидкого цемента «CementFlow» с поддержкой каскадного перерасчёта.

1.2. Краткое описание

Разрабатываемая система предназначена для оптимального распределения грузовиков-миксеров для выполнения заказов на доставку жидкого цемента в течение 12-часовой рабочей смены. Система обеспечивает автоматическое планирование поставок, мониторинг исполнения в реальном времени и интеллектуальный перерасчёт расписания при возникновении сбоев (поломки техники, ДТП, задержки).

1.3. Область применения

Система предназначена для использования:

  • Бетонными заводами и производственными комплексами

  • Логистическими компаниями, специализирующимися на перевозке строительных материалов

  • Диспетчерскими службами строительных компаний

1.4. Цели разработки

  1. Повышение эффективности использования парка машин на 25-30%

  2. Снижение простоев грузовиков-миксеров на 35-40%

  3. Минимизация потерь бетона из-за превышения времени жизни

  4. Обеспечение 95% своевременности доставок

  5. Сокращение времени реакции на сбои с 30-60 минут до 5-10 минут

2. ОБЩИЕ ТРЕБОВАНИЯ

2.1. Функциональное назначение

Система должна обеспечивать:

2.1.1. Основные функции:

  1. Планирование смены - формирование оптимального расписания поставок на 12-часовую смену

  2. Распределение грузовиков - автоматический подбор машин для выполнения поставок

  3. Мониторинг исполнения - отслеживание статуса поставок в реальном времени

  4. Каскадный перерасчёт - автоматическое перепланирование при возникновении сбоев

  5. Визуализация - отображение расписания в виде интерактивной диаграммы Ганта

2.1.2. Вспомогательные функции:

  1. Управление справочниками (машины, водители, клиенты, объекты)

  2. Формирование отчётности и аналитика

  3. Интеграция с внешними системами (GPS, ERP, CRM)

  4. Уведомления и оповещения

2.2. Пользователи системы



Роль пользователя Основные функции Доступ
Диспетчер Полный доступ ко всем функциям планирования и мониторинга Веб-интерфейс
Руководитель смены Просмотр, утверждение расписания, анализ эффективности Веб-интерфейс
Водитель Получение заданий, отметка о выполнении этапов, сообщение о проблемах Мобильное приложение
Администратор Управление пользователями, настройка системы, техническая поддержка Веб-интерфейс
Клиент (опционально) Просмотр статуса своего заказа, получение уведомлений Веб-портал/SMS

3. ТЕХНОЛОГИЧЕСКИЕ ТРЕБОВАНИЯ

3.1. Архитектурные требования

  1. Микросервисная архитектура с разделением на независимые модули

  2. Событийно-ориентированная архитектура для обработки событий в реальном времени

  3. REST API для интеграции с внешними системами

  4. Веб-сокеты для обновления интерфейса в реальном времени

  5. Поддержка горизонтального масштабирования

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.

Входные данные:

  • Список всех заказов смены

  • Парк доступных машин с характеристиками

  • Расписание работы завода

Этапы алгоритма:

  1. Группировка заказов по приоритету и временным окнам

  2. Разбиение на поставки с учётом непрерывности заливки

  3. Распределение по машинам по критериям:

    • Минимизация порожнего пробега

    • Максимальное использование вместимости

    • Учёт приоритета клиента

  4. Расчёт временных окон с учётом:

    • Времени жизни бетона (90-120 минут)

    • Времени на погрузку, путь, разгрузку, возврат

    • Буфера на форс-мажор (10-15%)

  5. Формирование диаграммы Ганта

4.2.2. Критерии выбора машины

Формула оценки приоритета машины:

Score = (W1 × DistanceScore) + (W2 × CapacityUtilization) + (W3 × TimeWindowFit) + PriorityBonus

где:

  • DistanceScore - оценка расстояния до завода (ближе = лучше)

  • CapacityUtilization - коэффициент заполнения миксера

  • TimeWindowFit - соответствие временному окну клиента

  • PriorityBonus - бонус за приоритет клиента

  • W1, W2, W3 - весовые коэффициенты (настраиваемые)

4.3. Модуль каскадного перерасчёта

4.3.1. Типы обрабатываемых событий

  1. Поломка машины - машина выходит из строя

  2. ДТП - авария с участием машины

  3. Задержка на разгрузке - превышение планового времени разгрузки

  4. Пробки - увеличение времени в пути

  5. Изменение заказа - корректировка клиентом

  6. Новая доступная машина - ввод машины в эксплуатацию

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. Основные таблицы:

  1. Orders - заказы клиентов

  2. Deliveries - поставки (части заказов)

  3. Trucks - грузовики-миксеры

  4. Drivers - водители

  5. Clients - клиенты

  6. ConstructionSites - объекты строительства

  7. ScheduleSlots - слоты в расписании

  8. Events - события системы

  9. 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. Основные экраны:

  1. Задания на день - список поставок

  2. Текущее задание - детали, карта маршрута

  3. Отметки о выполнении - кнопки для отметки этапов

  4. Сообщения - связь с диспетчером

  5. Проблемы - форма сообщения о сбоях

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. Функциональные критерии

  1. Система корректно планирует смену для 100+ заказов

  2. Автоматический перерасчёт выполняется за ≤10 секунд

  3. Диаграмма Ганта отображает все поставки без пересечений

  4. Интеграция с GPS работает в реальном времени

  5. Мобильное приложение работает офлайн

10.2. Нефункциональные критерии

  1. Время отклика интерфейса ≤200 мс

  2. Система выдерживает нагрузку 50+ одновременных пользователей

  3. Доступность 99.5% в рабочее время

  4. Данные сохраняются при перезапуске системы

10.3. Приёмочные испытания

  1. Тестирование на тестовых данных - 7 дней

  2. Пилотная эксплуатация - 14 дней

  3. Стресс-тестирование - имитация сбоев и высокой нагрузки

  4. Проверка безопасности - пентест

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: Балансировка нагрузки

text
Для каждой машины рассчитываем:
  Коэффициент_загрузки = Суммарное_время_работы / Длительность_смены
  
Средний_коэффициент = 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: Эскалация к диспетчеру

text
Если автоматическое распределение невозможно:
  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. Эвристические правила, используемые в алгоритме:

  1. Правило ближайшего соседа:

    • После выполнения поставки на объекте, следующая поставка назначается на ближайший объект

  2. Правило заполнения до конца:

    • Если осталось мало времени до конца смены, назначаются короткие поставки рядом с базой

  3. Правило резервирования VIP:

    • Для VIP-клиентов резервируется 10% времени у лучших машин

  4. Правило избегания пиков:

    • Стараться не назначать разгрузку в часы пик (08:00-10:00, 17:00-19:00)

5.2. Обработка конфликтов и тупиковых ситуаций:

Тупиковая ситуация: Нельзя назначить поставку без нарушения ограничений

Стратегии выхода:

  1. Откат (Backtracking): Отменить последнее назначение и попробовать другой вариант

  2. Ослабление ограничений: Временно разрешить небольшое нарушение

  3. Разделение проблемы: Разделить сложную поставку на части

  4. Перенос на потом: Отложить решение до обработки других поставок

5.3. Оптимизационные улучшения:

  1. Локальный поиск: После построения расписания пытаться улучшить его небольшими изменениями

  2. Табу-поиск: Запрещать возврат к недавно рассмотренным решениям

  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. Идеальный случай: Все поставки могут быть назначены без конфликтов

  2. Предельная загрузка: Количество поставок на пределе возможностей парка

  3. Конфликт ограничений: Противоречивые требования клиентов

  4. Каскадный сбой: Отказ ключевой машины в начале смены

Метрики качества расписания:

text
1. Коэффициент использования машин: Должен быть 70-90%
2. Среднее отклонение от идеального времени: Должно быть < 30 минут
3. Количество нарушений ограничений: Должно быть 0
4. Суммарный порожний пробег: Минимизируется
5. Баланс загрузки: Разница загрузки машин < 20%

8. ИНТЕГРАЦИЯ С ДРУГИМИ СИСТЕМАМИ

Алгоритм получает данные из:

  1. CRM-системы — информация о клиентах и их приоритетах

  2. ERP-системы — данные о заказах и производственных мощностях

  3. GPS-трекера — текущее положение машин

  4. Картографических сервисов — актуальные данные о пробках и маршрутах

  5. Погодных сервисов — прогноз для корректировки времени в пути

9. НАСТРОЙКА И КАЛИБРОВКА

Алгоритм имеет настраиваемые параметры:

python
# Веса в оценочной функции
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. ПРАКТИЧЕСКИЕ РЕКОМЕНДАЦИИ ПО РЕАЛИЗАЦИИ

  1. Начинать с простого: Сначала реализовать базовый жадный алгоритм без оптимизации

  2. Добавлять сложность постепенно: Поэтапно вводить дополнительные ограничения и оптимизации

  3. Использовать кэширование: Кэшировать результаты расчёта расстояний и проверок

  4. Реализовать инкрементальное обновление: При изменении одной поставки не пересчитывать всё расписание

  5. Предусмотреть ручное вмешательство: Возможность диспетчера корректировать автоматические решения

ЗАКЛЮЧЕНИЕ

Алгоритм первоначального распределения представляет собой сбалансированную комбинацию эвристических правил и оптимизационных техник, которая позволяет быстро строить качественное расписание даже для сложных сценариев. Его ключевые преимущества:

  1. Гарантированное нахождение решения (если оно существует)

  2. Учёт всех технологических ограничений цементной логистики

  3. Баланс между оптимальностью и скоростью работы

  4. Возможность каскадной обработки — сначала сложные, потом простые задачи

  5. Интеграция с системами реального времени для учёта текущей обстановки

Алгоритм является основой всей системы планирования и обеспечивает стабильную работу даже в условиях высокой нагрузки и неопределённости.