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

Решение модели

Получение объекта решения

Для получения решения достаточно вызвать метод Решить объекта модели:

Решение = Модель.Решить();

Также решение может быть получено через менеджер библиотеки:

Решение = О2.РешитьМодель(Модель);

Метод РешитьМодель менеджера библиотеки позволяет решать не только модель, сформированную программным кодом, но и модель в виде двоичных данных, записанную ранее на диск:

ИмяФайлаМодели = "C:\path\to\my\model.o2m";

Решение = О2.РешитьМодель(ИмяФайлаМодели);

Кроме имени файла могут быть переданы также объекты с типом ДвоичныеДанные, Поток, ФайловыйПоток, ПотокВПамяти.

Параметры поиска решения

В методы Решить и РешитьМодель могут быть переданы дополнительные параметры. Пример:

НастройкиРешателя = О2.СоздатьНастройкиРешателя();
НастройкиРешателя.ЛимитВремени = 10; // <-- искать решение не более 10 секунд
НастройкиРешателя.КоличествоПотоков = 8; // <-- использовать не более 8 потоков

ПараметрыПоиска = О2.СоздатьПараметрыПоиска();

ПараметрыПоиска.Сервис = О2.Сервисы().Локальный();
ПараметрыПоиска.НастройкиРешателя = НастройкиРешателя;

Решение = Модель.Решить(ПараметрыПоиска);

// Или

Решение = О2.РешитьМодель(Модель, ПараметрыПоиска);

Параметры поиска содержат следующие поля:

Имя параметраОписание
СервисПараметр определяет, где именно должны быть выполнены вычисления. Использование различных сервисов подробно описано в данном разделе.
НастройкиРешателяОпределяет используемый решающий алгоритм и его настройки.
НастройкиЛицензированияОпределяет настройки лицензирования при выполнении вычислений.

Настройки решателя

Имя параметраОписание
ЛимитВремениМаксимальное время поиска решения в секундах.
КоличествоПотоковМаксимальное количество потоков при поиске решения. Данный параметр может игнорироваться решателями, не поддерживающими параллельные вычисления.

Настройки лицензирования

Имя параметраОписание
КодЛицензиатаКод клиента (лицензиата), к которому привязаны ёмкостные лицензии. Обязателен при их использовании. Предоставляется клиенту при передаче лицензий.
Параметры поиска решателя маршрутизации

Специфические параметры поиска модели маршрутизации (стратегия первого решения, метаэвристика локального поиска и другие тонкие настройки) передаются через НастройкиРешателя.ДополнительныеНастройки, см. Параметры поиска. Не путайте их с полями НастройкиРешателя выше: ЛимитВремени и КоличествоПотоков управляют тем, где и как долго ищется решение, а ДополнительныеНастройки — тем, каким алгоритмом.

Загрузка готового решения

Если решение модели было получено с помощью консольной утилиты, то оно может быть загружено из файла:

ИмяФайлаРешения = "C:\path\to\my\solution.o2s";

Решение = О2.ЗагрузитьРешение(ИмяФайлаРешения);

Методы работы с консольной утилитой подробно описаны в данном разделе.

Обработка результата

Найденное решение содержит маршруты транспортных средств, пропущенные узлы (если в модели есть дизъюнкции), значения ресурсов на каждой остановке, значения переменных и выражений модели и общую стоимость.

Базовая структура обработки:

Решение = Модель.Решить();

Если Решение.РешениеНайдено() Тогда

СтатусРешения = Решение.Статус();

Для Каждого Маршрут Из Решение.Маршруты() Цикл
Сообщить("Маршрут ТС: " + Маршрут.ТранспортноеСредство);
// ... обход остановок маршрута, обращение к значениям ресурсов ...
КонецЦикла;

Для Каждого Узел Из Решение.ПропущенныеУзлы() Цикл
Сообщить("Пропущен узел: " + Узел);
КонецЦикла;

ОбщаяСтоимость = Решение.ЗначениеЦелевойФункции();
Сообщить("Общая стоимость: " + ОбщаяСтоимость);

Иначе
Сообщить("Решение не найдено!");
КонецЕсли;

Методы объекта решения

Объект решения предоставляет несколько групп методов: для проверки статуса, обхода маршрутов, доступа к значениям ресурсов и получения метаданных. Ниже — обзор; полный набор сигнатур — в разделе Программный интерфейс — Решение.

Статус

Возвращает статус решения:

СтатусРешения = Решение.Статус();

Если СтатусРешения = О2.СтатусыРешений().Оптимальное() Тогда
Сообщить("Найдено оптимальное решение!");
КонецЕсли;

Возможные значения:

СтатусРасшифровка
ОшибочнаяМодельРешение не найдено: в данных модели обнаружены ошибки.
РешениеОтсутствуетРешающий алгоритм достоверно определил, что допустимого решения не существует (например, временные окна несовместны с матрицей времени).
ОптимальноеРешение найдено и достоверно определено, что оно оптимально.
ДопустимоеРешение найдено, но за отведённое время не удалось доказать его оптимальность.

РешениеНайдено

Возвращает Истина, если статус решения — Оптимальное или Допустимое:

Если Решение.РешениеНайдено() Тогда
// ... обработка маршрутов
КонецЕсли;

Если требуется строго оптимальное решение, следует проверять статус явно.

Маршруты и Маршрут

Маршруты() возвращает массив маршрутов всех транспортных средств модели. Маршрут(ТС) — маршрут конкретного транспортного средства (по объекту, имени или номеру):

ВсеМаршруты = Решение.Маршруты();
МаршрутТС1 = Решение.Маршрут("ТС1");
МаршрутПервого = Решение.Маршрут(0);

Транспортное средство, оставшееся в депо (не использованное), также возвращается в Маршруты(), но его маршрут содержит только стартовую и конечную остановки.

ПропущенныеУзлы

Возвращает массив узлов, не вошедших ни в один маршрут. Узлы попадают в этот список только при наличии в модели дизъюнкций — без них все узлы обязательны и пропуск означал бы недопустимость решения:

Для Каждого Узел Из Решение.ПропущенныеУзлы() Цикл
Сообщить("Пропущен: " + Узел);
КонецЦикла;

ЗначениеРесурса

Возвращает значение указанного ресурса в конкретной точке маршрута. Принимает ТочкаМаршрута — объект, полученный через менеджер ТочкиМаршрута():

Клиент1 = Модель.Узлы().Получить("Клиент1");
ТочкаКлиента1 = Модель.ТочкиМаршрута().ПолучитьПоУзлу(Клиент1);

ВремяПрибытия = Решение.ЗначениеРесурса(ТочкаКлиента1, "Время");
ОстатокГруза = Решение.ЗначениеРесурса(ТочкаКлиента1, "Груз");

Сообщить("В Клиент1 прибыли в " + ВремяПрибытия + " мин., остаток груза: " + ОстатокГруза);

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

Значения переменных и выражений

Для прямого доступа к переменным и выражениям модели объект решения предоставляет три метода:

Решение.КоличествоПеременных() // число переменных в модели
Решение.ЗначениеПеременной(Переменная) // значение конкретной переменной
Решение.ЗначениеВыражения(Выражение) // значение линейного выражения

Используются, когда модель построена через менеджер переменных или менеджер выражений. Для стандартных сценариев VRP/VRPTW обычно достаточно ЗначениеРесурса и навигации по маршрутам.

Навигация по решению

Несколько методов адресно отвечают на вопросы о точках маршрута и транспортных средствах:

Решение.СледующаяТочкаМаршрута(ТочкаМаршрута) // следующая точка после данной
Решение.ТранспортноеСредствоВТочкеМаршрута(ТочкаМаршрута) // какое ТС обслуживает данную точку
Решение.ТочкаПосещена(ТочкаМаршрута) // была ли точка посещена в решении
Решение.ТранспортноеСредствоИспользуется(ТС) // было ли ТС задействовано

ЗначениеЦелевойФункции

Возвращает оптимизированную итоговую стоимость решения — сумму стоимостей дуг по всем маршрутам, фиксированных стоимостей задействованных транспортных средств, штрафов дизъюнкций и штрафов за выход за мягкие границы значений ресурсов:

ОбщаяСтоимость = Решение.ЗначениеЦелевойФункции();

МетаданныеРешения

Возвращает структуру с метаданными решения:

ПолеОписание
ИдентификаторМоделиУникальный идентификатор модели, присвоенный при её создании.
ТипМоделиТип модели.
ВерсияРасширенияВерсия расширения библиотеки O2.
ВерсияСовместимостиНомер мажорной версии, который должен совпадать у расширения и у решателя.
ИдентификаторРешенияУникальный идентификатор решения, присвоенный решателем.
ВерсияРешателяНомер версии решателя.
ТипРешателяАлгоритм, использованный при решении.

РезультатПроверки

Возвращает результат валидации данных модели в виде структуры с полями:

ПолеОписание
УспехПризнак успешности прохождения проверки.
ОписаниеОшибкиТекстовое описание найденных ошибок. Поле присутствует, если Успех = Ложь.

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

Полный набор методов объекта решения с подробным описанием параметров — в разделе Программный интерфейс — Решение.