Решение модели
Получение объекта решения
Для получения решения достаточно вызвать метод Решить объекта модели:
Решение = Модель.Решить();
Также решение может быть получено через менеджер библиотеки:
Решение = О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. |
| ВерсияСовместимости | Номер мажорной версии, который должен совпадать у расширения и у решателя. |
| ИдентификаторРешения | Уникальный идентификатор решения, присвоенный решателем. |
| ВерсияРешателя | Номер версии решателя. |
| ТипРешателя | Алгоритм, использованный при решении. |
РезультатПроверки
Возвращает результат валидации данных модели в виде структуры с полями:
| Поле | Описание |
|---|---|
| Успех | Признак успешности прохождения проверки. |
| ОписаниеОшибки | Текстовое описание найденных ошибок. Поле присутствует, если Успех = Ложь. |
Полный перечень методов
Полный набор методов объекта решения с подробным описанием параметров — в разделе Программный интерфейс — Решение.