Перейти к основному содержимому

Узлы модели

Узел — это точка, которую нужно посетить или которая является пунктом старта/финиша транспортного средства. В прикладной интерпретации узлами могут быть клиенты, склады, депо, точки обслуживания, контрольные пункты — всё, между чем строятся маршруты.

Узел в модели маршрутизации — это конкретная сущность с фиксированной идентичностью. Один узел в модели соответствует одной точке в прикладной задаче.

Депо и клиенты

В модели нет специального типа «депо». Депо — это обычный узел, на который ссылается транспортное средство как на свой стартовый или конечный узел. Один и тот же узел может быть депо для нескольких транспортных средств одновременно (классический VRP с одним депо), а может быть и просто промежуточной точкой маршрута.

Это даёт гибкость: одну и ту же модель можно использовать и для VRP с одним депо, и для мульти-депо (несколько разных стартовых узлов у разных транспортных средств), и для задач с открытыми маршрутами (стартовый и конечный узлы — разные).

Индексация и имена

Узлам присваивается порядковый номер, начиная с 0. Номер — это не имя, а индекс, который однозначно соответствует строкам и столбцам матриц транзитов:

  • узел 0 — первый добавленный узел, ему соответствует строка 0 и столбец 0 любой матрицы транзитов;
  • узел 1 — второй добавленный узел, ему соответствует строка 1 и столбец 1;
  • и так далее.
к сведению

Индексация узлов модели маршрутизации 0-based, как и во всех остальных моделях O2. При формировании матриц транзитов соблюдайте 0-based порядок: первая строка матрицы соответствует первому добавленному узлу с индексом 0.

Каждому узлу также присваивается имя. Если имя не указано пользователем, оно генерируется автоматически по шаблону _<индекс> (например, _0, _1, _2). Если имя задано — оно используется и во внутренней идентификации, и при сериализации модели.

Добавление узлов

Узлы добавляются через построитель параметров модели до её создания:

Построитель = О2
.Модели()
.МодельМаршрутизации()
.СоздатьПостроительПараметровМодели();

Построитель.ДобавитьУзел("Депо");
Построитель.ДобавитьУзел("Клиент1");
Построитель.ДобавитьУзел("Клиент2");
Построитель.ДобавитьУзел("Клиент3");

Модель = Построитель.СоздатьМодель();

Метод ДобавитьУзел возвращает индекс добавленного узла (целое число с 0). К узлу впоследствии обращаются по индексу, имени или объекту (получаемому через Модель.Узлы().Получить(...)).

Если имя не нужно, его можно опустить:

Индекс = Построитель.ДобавитьУзел();
к сведению

После вызова Построитель.СоздатьМодель() состав узлов фиксирован. Менеджер Модель.Узлы() предоставляет только методы чтения (Получить, Количество) — добавлять узлы в готовую модель нельзя.

Обращение к узлу

К узлу можно обратиться через менеджер Модель.Узлы() по номеру или имени:

Узел = Модель.Узлы().Получить(0); // по номеру
Узел = Модель.Узлы().Получить("Депо"); // по имени

Это удобно, когда узлы добавляются в одной части кода, а используются — в другой.

Количество узлов

Количество = Модель.Узлы().Количество();

Используется при формировании транзитов-матриц для проверки, что размер таблицы соответствует числу узлов.

Узел и точка маршрута — разные сущности

Узел — это элемент графа, точка пространства (клиент, склад, депо). Точка маршрута (ТочкаМаршрута) — это позиция в конкретном маршруте конкретного транспортного средства.

Один узел может породить несколько точек маршрута. Самый частый случай — общее депо нескольких ТС: узел Депо один, но каждое транспортное средство имеет свою стартовую и финишную точки. Стартовая точка ТС1 и стартовая точка ТС2 — это разные точки маршрута, хотя обе соответствуют одному и тому же узлу Депо.

Поэтому жёсткие границы и значения ресурсов адресуются по точкам маршрута, а не по узлам:

Депо = Модель.Узлы().Получить("Депо");
Клиент1 = Модель.Узлы().Получить("Клиент1");
ТС1 = Модель.ТранспортныеСредства().Получить("ТС1");
ТС2 = Модель.ТранспортныеСредства().Получить("ТС2");

// Стартовые точки для общего депо у каждого ТС свои
СтартТС1 = Модель.ТочкиМаршрута().ПолучитьСтарт(ТС1);
СтартТС2 = Модель.ТочкиМаршрута().ПолучитьСтарт(ТС2);

// Точка маршрута для рядового узла
ТочкаКлиента1 = Модель.ТочкиМаршрута().ПолучитьПоУзлу(Клиент1);

// Ограничение «прибыть в Клиент1 не позже 11:00» — на точку маршрута
Модель.Ограничения().РесурсВТочкеМаршрутаНеБолее(
"Время",
ТочкаКлиента1,
660
);

Менеджер точек маршрута также возвращает финишные точки (ПолучитьФиниш(ТС)) и поддерживает доступ по индексу (Получить(Индекс)) и подсчёт (Количество()).

Полный перечень методов

Полный набор методов менеджера узлов — в разделе Программный интерфейс — Узлы.

Менеджер точек маршрута — в разделе Программный интерфейс — Точки маршрута.