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

Переменные

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

В тексте ниже разделение методов по категориям.

Свободные переменные

Переменные, не привязанные к топологии — пользователь объявляет их явно.

Модель.Переменные().Добавить(Имя = Неопределено) // без диапазона
Модель.Переменные().ДобавитьИзДиапазона(ЛеваяГраница, ПраваяГраница, Имя = Неопределено)
Модель.Переменные().ДобавитьБулеву(Имя = Неопределено) // 0/1
Модель.Переменные().ДобавитьМассив(Размер, ПрефиксИмени = Неопределено)
Модель.Переменные().ДобавитьМассивИзДиапазона(Размер, ЛеваяГраница, ПраваяГраница, ПрефиксИмени = Неопределено)

Константы и булева арифметика

Модель.Переменные().Константа(Значение)
Модель.Переменные().ЗначениеИстина()
Модель.Переменные().ЗначениеЛожь()
Модель.Переменные().Отрицание(Значение) // !x

Ресурсные переменные

Для каждой пары (ресурс, точка маршрута) система автоматически держит три переменные. Менеджер даёт к ним прямой доступ:

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

Маршрутные переменные

Описывают решение маршрутизации как граф «следующая точка → текущая точка»:

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

Получение переменной

Переменная = Модель.Переменные().Получить(Идентификатор);

К переменной обращаются по объекту, имени или индексу.

Пример: «маршрут ТС1 содержит ровно 5 клиентов»

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

// Соберём флаги «точка обслуживается ТС1» для каждого клиентского узла
Флаги = Новый Массив;
Для НомерУзла = 1 По Модель.Узлы().Количество() - 1 Цикл
Узел = Модель.Узлы().Получить(НомерУзла);
Точка = Модель.ТочкиМаршрута().ПолучитьПоУзлу(Узел);

// ТС текущей точки == номер ТС1?
ТС_Точки = Модель.Переменные().ТранспортноеСредствоТочкиМаршрута(Точка);
Флаг = Модель.Выражения().Выражение(ТС_Точки); // упрощённо

Флаги.Добавить(Флаг);
КонецЦикла;

// (Конкретные построения здесь — иллюстративные; для практики
// удобнее опереться на ПризнакПосещения вместе с разрешёнными ТС узла.)

Получение значений из решения

После решения модели текущие значения переменных можно прочитать через объект решения — методы Решение.ЗначениеПеременной(...), Решение.ТочкаПосещена(...), Решение.ТранспортноеСредствоИспользуется(...) и т. п. Подробности — на странице Решение модели.

См. также