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

Выражения

Выражение — это линейная комбинация переменных модели (свободных, ресурсных, маршрутных). Выражения — это «строительный материал» для:

  • выражений-ограничений — условий вида ЗначениеРавно, ЗначениеБольше, ВсеРазличные и т. п.;
  • условий опциональных интервалов;
  • продвинутых сценариев работы с целевой функцией и сериализацией решения.

В большинстве типовых задач прямая работа с выражениями не требуется: ресурсы, транзиты и стандартные ограничения покрывают сценарии VRP/VRPTW/PDP. Менеджер Выражения() нужен, когда требуется тонкое условие, не выражаемое стандартными средствами — например, «посетили либо Клиент1, либо Клиент2, но не обоих».

Получение менеджера

Выражения = Модель.Выражения();

Основные методы

Модель.Выражения().Выражение(Значение) // преобразовать любое значение в выражение
Модель.Выражения().Константа(Значение) // выражение-константа
Модель.Выражения().Терм(Выражение, Коэффициент) // выражение × коэффициент
Модель.Выражения().Сумма(Выражения1, Выражения2, Выражения3, Выражения4) // сумма
Модель.Выражения().ВзвешеннаяСумма(Выражения, Коэффициенты) // взвешенная сумма
Модель.Выражения().СоздатьПостроительВыражений() // отдельный построитель для сложных выражений

Выражение(Значение) принимает:

  • число — превращается в константу;
  • булево — превращается в 0/1;
  • объект переменной — используется как переменная;
  • строку — разбирается как линейная нотация ("x + 2 * y - 1").

Пример: «посетили строго одного из двух клиентов»

Построим выражение «сумма флагов посещения Клиент1 и Клиент2» и наложим ограничение «равно 1»:

Клиент1 = Модель.Узлы().Получить("Клиент1");
Клиент2 = Модель.Узлы().Получить("Клиент2");

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

ФлагКлиента1 = Модель.Переменные().ПризнакПосещения(ТочкаКлиента1);
ФлагКлиента2 = Модель.Переменные().ПризнакПосещения(ТочкаКлиента2);

СуммаФлагов = Модель.Выражения().Сумма(ФлагКлиента1, ФлагКлиента2);

Модель.Ограничения().ЗначениеРавно(СуммаФлагов, 1);

См. также