Переменные
Менеджер Модель.Переменные() даёт прямой доступ к решающим переменным модели. Обычная работа с моделью маршрутизации не требует этого слоя — стандартные сценарии (грузоподъёмность, временные окна, дизъюнкции) покрываются ресурсами, транзитами и ограничениями. Менеджер переменных нужен в трёх случаях:
- построение нестандартных выражений и выражений-ограничений;
- получение значений булевых флагов посещения/использования из решения;
- продвинутые сценарии целевой функции и сериализации.
В тексте ниже разделение методов по категориям.
Свободные переменные
Переменные, не привязанные к топологии — пользователь объявляет их явно.
Модель.Переменные().Добавить(Имя = Неопределено) // без диапазона
Модель.Переменные().ДобавитьИзДиапазона(ЛеваяГраница, ПраваяГраница, Имя = Неопределено)
Модель.Переменные().ДобавитьБулеву(Имя = Неопределено) // 0/1
Модель.Переменные().ДобавитьМассив(Размер, ПрефиксИмени = Неопределено)
Модель.Переменные().ДобавитьМассивИзДиапазона(Размер, ЛеваяГраница, ПраваяГраница, ПрефиксИмени = Неопределено)
Константы и булева арифметика
Модель.Переменные().Константа(Значение)
Модель.Переменные().ЗначениеИстина()
Модель.Переменные().ЗначениеЛожь()
Модель.Переменные().Отрицание(Значение) // !x
Ресурсные переменные
Для каждой пары (ресурс, точка маршрута) система автоматически держит три переменные. Менеджер даёт к ним прямой доступ:
Модель.Переменные().НакопленныйРесурс(Ресурс, ТочкаМаршрута) // значение ресурса в точке
Модель.Переменные().ПриращениеРесурса(Ресурс, ТочкаМаршрута) // прирост между точкой и следующей
Модель.Переменные().ЗапасРесурса(Ресурс, ТочкаМаршрута) // неиспользованный резерв ожидания
Маршрутные переменные
Описывают решение маршрутизации как граф «следующая точка → текущая точка»:
Модель.Переменные().СледующаяТочкаМаршрута(ТочкаМаршрута) // переменная-индекс следующей точки
Модель.Переменные().ТранспортноеСредствоТочкиМаршрута(ТочкаМаршрута) // переменная-индекс ТС, обслуживающего точку
Модель.Переменные().ПризнакПосещения(ТочкаМаршрута) // булева: точка посещена?
Модель.Переменные().ПризнакИспользованияТранспортногоСредства(ТС) // булева: ТС задействовано?
Получение переменной
Переменная = Модель.Переменные().Получить(Идентификатор);
К переменной обращаются по объекту, имени или индексу.
Пример: «маршрут ТС1 содержит ровно 5 клиентов»
ТС1 = Модель.ТранспортныеСредства().Получить("ТС1");
// Соберём флаги «точка обслуживается ТС1» для каждого клиентского узла
Флаги = Новый Массив;
Для НомерУзла = 1 По Модель.Узлы().Количество() - 1 Цикл
Узел = Модель.Узлы().Получить(НомерУзла);
Точка = Модель.ТочкиМаршрута().ПолучитьПоУзлу(Узел);
// ТС текущей точки == номер ТС1?
ТС_Точки = Модель.Переменные().ТранспортноеСредствоТочкиМаршрута(Точка);
Флаг = Модель.Выражения().Выражение(ТС_Точки); // упрощённо
Флаги.Добавить(Флаг);
КонецЦикла;
// (Конкретные построения здесь — иллюстративные; для практики
// удобнее опереться на ПризнакПосещения вместе с разрешёнными ТС узла.)
Получение значений из решения
После решения модели текущие значения переменных можно прочитать через объект решения — методы Решение.ЗначениеПеременной(...), Решение.ТочкаПосещена(...), Решение.ТранспортноеСредствоИспользуется(...) и т. п. Подробности — на странице Решение модели.
См. также
- Выражения — выражения строятся над переменными.
- Ограничения — выражения-ограничения принимают переменные.
- Решение модели — извлечение значений переменных из найденного решения.
- Программный интерфейс — Переменные.