Узлы модели
Узел — это точка, которую нужно посетить или которая является пунктом старта/финиша транспортного средства. В прикладной интерпретации узлами могут быть клиенты, склады, депо, точки обслуживания, контрольные пункты — всё, между чем строятся маршруты.
Узел в модели маршрутизации — это конкретная сущность с фиксированной идентичностью. Один узел в модели соответствует одной точке в прикладной задаче.
Депо и клиенты
В модели нет специального типа «депо». Депо — это обычный узел, на который ссылается транспортное средство как на свой стартовый или конечный узел. Один и тот же узел может быть депо для нескольких транспортных средств одновременно (классический 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
);
Менеджер точек маршрута также возвращает финишные точки (ПолучитьФиниш(ТС)) и поддерживает доступ по индексу (Получить(Индекс)) и подсчёт (Количество()).
Полный перечень методов
Полный набор методов менеджера узлов — в разделе Программный интерфейс — Узлы.
Менеджер точек маршрута — в разделе Программный интерфейс — Точки маршрута.