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