Skip to main content

Вариант 4

Формализация бизнес-процесса планирования и каскадного перераспределения поставок жидкого цемента.

1. Вербальное описание бизнес-процесса и его формализация

Цель системы: Оптимальное и надежное распределение парка грузовиков-миксеров (автобетоносмесителей) для выполнения заказов на доставку жидкого цемента (бетона) в течение рабочей смены (12 часов) с возможностью оперативного перепланирования при сбоях.

Ключевой принцип: Система работает с поставками (слотами) — атомарными единицами работы одной машины для части заказа. Заказ дробится на поставки, которые назначаются на временную диаграмму (аналог диаграммы Ганта) для каждой машины. Непересекаемость слотов у одной машины — главное ограничение.

Основной поток:
1.  Планирование на начало смены: Имеется пул заказов, каждый из которых характеризуется общим объемом, точкой разгрузки (клиентом), желательным временным окном (например, "до 15:00").
2.  Дробление заказов: Для каждого заказа рассчитывается количество необходимых поставок, исходя из стандартного объема машины (например, 5 м³) или доступных машин разной вместимости. Образуется очередь запланированных поставок.
3.  Назначение машин на слоты: Для каждой поставки в очереди система ищет подходящую машину из свободного пула. "Свободность" означает, что у машины есть незанятый временной интервал, достаточный для выполнения этой поставки (с учетом времени на дорогу, разгрузку, форс-мажорный буфер). Критерии выбора машины для слота:
    *   Приоритет 1 (обязательный): Наличие свободного временного окна.
    *   Приоритет 2: Вместимость цистерны (минимизация остатка, соответствие объему поставки).
    *   Приоритет 3: Близость текущего местоположения машины (или точки окончания предыдущей поставки) к точке погрузки завода.
    *   Приоритет 4: Приоритет клиента (может влиять на выбор среди равных по другим параметрам).
4.  Формирование расписания: Назначенные поставки превращаются в слоты в расписании конкретных машин с четко определенным временем: *выезд с завода -> дорога -> разгрузка у клиента -> возврат на завод/следующая точка погрузки*.
5.  Исполнение и мониторинг: В течение смены система отслеживает статус машин и поставок (``Выполняется``, ``Завершена``, ``Задержана``).
6.  Реакция на события (Каскадный перерасчет): При наступлении события (например, поломка машины ``МашинаСломана``) система выполняет:
    *   Снятие слотов: Все будущие слоты этой машины помечаются как ``Свободны`` и возвращаются в пул невыполненных поставок.
    *   Перераспределение: Запускается алгоритм перераспределения для пула невыполненных поставок, но с учетом текущего состояния всех машин: их реального местоположения, занятости в оставшееся время смены.
    *   Оптимизация: Алгоритм пытается "вписать" освободившиеся поставки в существующие расписания других машин, возможно, сдвигая их более поздние слоты (каскадный сдвиг), или назначает на вновь освободившиеся машины.
    *   Уведомления: Все заинтересованные стороны (диспетчер, клиенты при серьезных задержках) получают оповещения об изменениях.

Девиации по мировой практике:
*   Досрочное завершение поставки: Машина возвращается в пул раньше, что может позволить "подтянуть" следующие поставки.
*   Динамическое изменение заказа: Клиент может увеличить/уменьшить объем, что ведет к пересчету числа поставок и перепланированию.
*   Изменение точки разгрузки: Возможно на этапе планирования или даже исполнения (редко).
*   "Жадное" планирование: Некоторые системы оставляют резервные машины в простое для подстраховки, что снижает эффективность, но повышает устойчивость.

2. Список акторов, сущностей, событий и алгоритмов

АКТОРЫ (Роли в системе)
1.  Диспетчер (Пользователь системы): Инициирует планирование, вносит изменения, получает уведомления.
2.  Система планирования (Ядро алгоритма): Главный вычислительный модуль, распределяет слоты и реагирует на события.
3.  Водитель/Машина (Источник данных): Через телематику предоставляет данные о местоположении, статусе выполнения, техническом состоянии.

СУЩНОСТИ (Бизнес-объекты)
1.  Заказ (Order):
    *   Атрибуты: ID, Клиент, Адрес разгрузки, Общий объем (м³), Желаемое время окончания, Приоритет.
2.  Поставка (Delivery / Slot):
    *   Атрибуты: ID, Ссылка на Заказ, Объем поставки (м³), Статус (`Запланирована`, `Назначена`, `В пути`, `Разгрузка`, `Выполнена`, `Отменена`), Расчетное время: `t_погрузки`, `t_начала_разгрузки`, `t_окончания_разгрузки`.
    *   Ключевая идея: Это задача в календаре машины.
3.  Машина (Truck / Vehicle):
    *   Атрибуты: ID, Текущий статус (`Свободна`, `Назначена`, `В пути`, `Разгрузка`, `Неисправна`), Вместимость (м³), Текущее местоположение (GPS), Текущий остаток цемента, Расписание (упорядоченный список слотов `List<Slot>`).
4.  Пул машин (Fleet): Коллекция всех машин. Имеет методы для выборки подмножества по критериям.
5.  Расписание (Schedule): Совокупность расписаний всех машин. Визуализируется как диаграмма Ганта.
6.  Событие (Event):
    *   Атрибуты: Тип, Время возникновения, Связанная Сущность (Машина/Поставка), Данные (например, новая задержка в минутах).

СОБЫТИЯ (Event Types)
1.  `ПоставкаЗавершена` — Машина освободилась.
2.  `МашинаСломана` — Требуется снять все будущие слоты и перераспределить.
3.  `ЗадержкаНаПоставке` — Текущая операция затянулась, сдвигает все последующие слоты этой машины и может повлиять на другие.
4.  `НоваяСвободнаяМашина` — Машина введена в эксплуатацию (починена, возвращена из аренды).
5.  `НовыйСрочныйЗаказ` — Требуется вписать в существующее расписание.
6.  `ИзменениеОбъемаЗаказа` — Требуется добавить или отменить поставки.

АЛГОРИТМЫ И ИХ ПАРАМЕТРЫ

Алгоритм 1: Первоначальное распределение (Initial Assignment)
*   Вход: Список заказов, Пул машин (все свободны на начало смены).
*   Выход: Начальное расписание.
*   Логика:
    1.  Преобразовать все заказы в очередь поставок, отсортированную по `Желаемому времени окончания` и `Приоритету клиента`.
    2.  Для каждой поставки в очереди:
        *   Вызвать Функцию поиска машины.
        *   Если машина найдена — закрепить слот за ней, обновить ее расписание и статус.
        *   Если не найдена — отложить поставку в список проблемных (требует ручного вмешательства или расширения пула).
*   Параметры: Весовые коэффициенты для критериев выбора машины (близость, вместимость, приоритет).

Алгоритм 2: Функция поиска машины для слота (FindTruckForSlot)
*   Вход: Поставка (с объемом, точкой разгрузки, расчетной длительностью), Пул машин.
*   Выход: Лучшая машина и конкретное временное окно для слота.
*   Логика:
    1.  Отфильтровать машины по вместимости (`вместимость >= объем_поставки`).
    2.  Для каждой подходящей машины проанализировать ее текущее расписание. Найти все возможные окна между существующими слотами, куда новая поставка может поместиться (с учетом времени на дорогу от предыдущей точки, погрузку, дорогу до клиента, разгрузку + буфер).
    3.  Если окна есть, выбрать из них самое раннее.
    4.  Среди машин, нашедших окна, выбрать лучшую по взвешенной оценке: `Оценка = w1 * (время_начала_окна) + w2 * (коэф_заполнения_цистерны) + w3 * (расстояние_до_завода)`.
*   Параметры: Длительность буфера на форс-мажор (например, 15-20% от времени поставки), веса `w1, w2, w3`.

Алгоритм 3: Каскадный перерасчет (Cascade Rescheduling)
*   Вход: Событие (например, `МашинаСломана`), Текущее расписание.
*   Выход: Обновленное расписание.
*   Логика:
    1.  Локализация последствий: Определить множество поставок, которые требуют переноса (все будущие слоты сломанной машины + потенциально слоты других машин, которые могли бы быть сдвинуты для улучшения плана).
    2.  Освобождение слотов: Удалить эти поставки из расписаний, поместив их в список `ПоставкиКПерепланированию`.
    3.  Перепланирование: Запустить упрощенный алгоритм 1, но:
        *   На вход подается список `ПоставкиКПерепланированию`.
        *   Пул машин рассматривается с их текущим состоянием и частично заполненным расписанием.
        *   Алгоритм пытается вставить поставки в существующие расписания, сдвигая более поздние задачи (каскад). Это может быть реализовано через повторные вызовы `FindTruckForSlot`.
    4.  Валидация: Проверить, что все критичные по времени заказы (например, которые должны быть выполнены до конца смены) все еще выполнимы.
*   Параметры: Глубина перепланирования (только непосредственно затронутые машины или все), флаг разрешения/запрета увеличения длительности смены для конкретных машин.

3. Подводные камни и рекомендации

1.  Сложность каскадного перерасчета: Полный пересчет всей диаграммы Ганта при каждом событии может быть тяжелым. Необходимо ограничивать область перепланирования ("локальный ремонт" расписания).
2.  Нерешаемая ситуация: При множественных сбоях или нехватке машин система может не найти решение. Требуется механизм эскалации к диспетчеру с понятным отчетом о проблеме (например, "Заказ #456 не может быть выполнен в срок").
3.  Качество данных: Точность расчетов времени движения зависит от актуальных данных о пробках. Интеграция с картографическими сервисами (Google Maps, Яндекс.Карты) через API необходима.
4.  Психологический фактор: Частое перепланирование и сдвиги времени для водителей могут демотивировать. Возможное решение — вводить "заморозку" ближайшего слота (например, в течение часа) от текущего момента, чтобы не менять задачи водителю, который уже готовится к рейсу.
5.  Простота vs. Оптимальность: Алгоритмы, описанные выше, являются жадными эвристиками. Они быстрые и дают хорошее решение, но не гарантируют глобальной оптимальности (например, по общему пробегу парка). Для задач такого масштама (десятки машин, сотни поставок) этого обычно достаточно.
6.  Визуализация: Диаграмма Ганта должна обновляться в реальном времени. Цветовая индикация статуса (выполнено, в пути, задержано) и машины (исправна, неисправна) критически важна для диспетчера.

Заключение

Предложенная модель четко разделяет сущности, процессы и события. Она основана на принципах дискретного событийного моделирования и жадного алгоритма планирования с приоритетной очередью. Система реагирует на события через механизм перепланирования, что обеспечивает устойчивость к сбоям. Для реализации стоит начать с прототипа, реализующего основные алгоритмы 1-3, и простой визуализации в виде диаграммы Ганта, что полностью соответствует поставленным требованиям простоты и наглядности.