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

Линейные выражения

Линейное выражение — линейная комбинация переменных модели вида a₁·x₁ + a₂·x₂ + ... + c, где коэффициенты aᵢ и константа c — целые числа. Ограничения, целевая функция и подсказки решателю формулируются над выражениями.

Произведение двух переменных в линейном выражении не допускается. Если по смыслу задачи требуется произведение, оно вводится через специальное ограничение ПроизведениеРавно с дополнительной переменной-результатом.

Что считается выражением

В качестве линейного выражения в API принимаются:

  • переменная модели — рассматривается как выражение 1·x + 0;
  • число — константа интерпретируется как выражение с нулевыми коэффициентами при переменных;
  • строка в нотации линейного выражения — например, "2*x + 3*y - 5";
  • булево выражение — булева переменная или её отрицание интерпретируются как 0 или 1;
  • объект «ЛинейноеВыражение» — построенный менеджером выражений или построителем.

В простых случаях ограничения принимают переменные и числа напрямую — отдельная сборка выражения не требуется. Явная сборка применяется, когда выражение длинное, формируется в цикле или используется многократно.

Способы задания выражений

Строковая нотация

Запись выражения строкой с использованием имён переменных:

Пx = Модель.Переменные().Добавить("x");
Пy = Модель.Переменные().Добавить("y");

Модель.Ограничения().ЗначениеРавно("2*x - 3*(2 + 7*y) + 15", 45);

В строках поддерживаются операции +, -, * и круглые скобки. Деление не поддерживается. Имена переменных подставляются буквально, поэтому имена назначаются явно либо используется автогенерируемое имя вида _0, _1 (см. Имена переменных).

Строковая нотация удобна для коротких выражений и для случаев, когда выражение приходит из внешнего источника (например, из настройки в справочнике 1С). На больших моделях её применение менее эффективно: интерпретация строки выполняется при каждом вызове.

Менеджер выражений

Менеджер выражений собирает объект линейного выражения из массивов переменных и коэффициентов одной командой. Менеджер доступен через свойство Выражения() объекта модели:

Пx = Модель.Переменные().Добавить("x");
Пy = Модель.Переменные().Добавить("y");

// Сумма выражений: x + y + 2y + (x + 3y)
Сумма = Модель.Выражения().Сумма(
О2.Утилиты().Массив(Пx, Пy, Модель.Выражения().Терм(Пy, 2), "x + 3*y")
);

Методы менеджера:

  • Выражение — преобразование переменной, числа или строки в объект выражения;
  • Константа — выражение из одного целочисленного значения;
  • Терм — выражение «коэффициент × выражение»;
  • Сумма — сумма массива выражений;
  • ВзвешеннаяСумма — сумма «коэффициент × выражение» по двум массивам.

Менеджер применяется, когда состав выражения известен заранее.

Построитель выражений

Построитель собирает выражение инкрементально, по слагаемому. Построитель применяется, когда выражение формируется в цикле:

// Имеется массив "Переменные"
Построитель = Модель.Выражения().СоздатьПостроительВыражений();

Для К = 0 По Переменные.ВГраница() Цикл
Построитель.ДобавитьТерм(Переменные[К], К + 1);
КонецЦикла;

Выражение = Построитель.ПолучитьВыражение();

Методы построителя — Добавить, Вычесть, Умножить, ДобавитьКонстанту, ДобавитьТерм, ДобавитьСумму, ДобавитьВзвешеннуюСумму. Итоговый объект возвращается вызовом ПолучитьВыражение().

В отличие от менеджера, построитель не создаёт промежуточные объекты выражений на каждое слагаемое. Слагаемые добавляются во внутренний буфер, а итоговый объект формируется один раз. На больших моделях это даёт ощутимый выигрыш по времени и памяти.

Когда какой способ применять

СценарийПодходПричина
Короткое выражение, известно заранееСтрокаКомпактная запись без введения временных переменных.
Выражение получено из настройки или справочникаСтрокаСовмещается с текстовым представлением во внешнем источнике.
Сумма по фиксированному массиву переменныхМенеджер (Сумма / ВзвешеннаяСумма)Одна команда без цикла, читаемо на любом числе слагаемых.
Длинное выражение, собираемое в циклеПостроительНе создаёт промежуточные объекты выражений; быстрее на больших моделях.
Многократное использование одного выраженияМенеджер или построитель + сохранение объектаВыражение собирается один раз и передаётся в несколько ограничений и в целевую функцию.

Иллюстрация: суммарная стоимость заказов

Подсчёт суммарной стоимости заказа по двум массивам — количеств позиций (переменные) и цен позиций (целые числа) — выполняется взвешенной суммой:

// Имеются массивы "КоличестваПозиций" (переменные) и "ЦеныПозиций" (целые числа)

ОбщаяСтоимость = Модель.Выражения().ВзвешеннаяСумма(
КоличестваПозиций,
ЦеныПозиций
);

Модель.ЦелеваяФункция().Минимизировать(ОбщаяСтоимость);

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

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

Полный набор методов работы с линейными выражениями приведён в разделах Программный интерфейс — Менеджер выражений и Программный интерфейс — Построитель выражений.