Линейные выражения
Из переменных, определенных в модели, могут быть составлены выражения. Для выражений действуют следующие утверждения:
- Выражения должны быть линейными, вида Σaixi + b. Перемножение переменных между собой не допускается;
- Все компоненты выражений: переменные, коэффициенты и константы, должны быть целыми числами в диапазоне [-264, 264).
Способы определения линейных выражений
Во многих процедурах и функциях библиотеки О2 в качестве входных аргументов выступают "линейные выражения" или массивы из "линейных выражений". В качестве линейных выражений в таком случае могут передаваться:
- Непосредственно переменные, определенные в модели, т.к. переменная - это частный случай линейного выражения;
- Числовые значения, например число "5", т.к. константы - это частный случай линейного выражения, где все коэффициенты при переменных равны "0";
- Строки, содержащие линейные выражения. Правила формирования описаны ниже;
- Булевы выражения. При этом "ЛОЖЬ" будет интерпретирована как "0", а ИСТИНА как "1";
- Объекты с типом "ЛинейноеВыражение", полученные с помощью методов менеджера линейных выражений (описан далее) или с помощью методов отдельного построителя выражений (описан далее).
Строковые определения выражений
При использовании строк для определения линейных выраженений допускается использовать:
- имена переменных;
- числовые литералы;
- символы математических операций "+", "-" и "*", деление не допускается;
- круглые скобки "(" и ")" для обозначения приоритета операций.
- Пример №1
- Пример №2
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
// устанавлиаем ограничение на значение линейного выражения
// 2x - 3(2 + 7y) + 15 = 45
Модель.Ограничения().ЗначениеРавно("2*x - 3*(2 + 7*y) + 15", 45);
// если не указываем имена переменных, они будут назначены автоматически
П1 = Модель.Переменная();
П2 = Модель.Переменная();
Выражение = СтрШаблон("%1 + %2", П1.Имя, П2.Имя); // -> "_1 + _2"
// устанавлиаем ограничение на значение линейного выражения
// _1 + _2 > 10
Модель.Ограничения().ЗначениеБольше(Выражение, 10);
Работа со строковыми выражениями требует дополнительных вычислительных ресурсов на их интерпретацию, поэтому при формировании больших моделей лучше формировать выражения методами менеджера выражений или построителя выражений, особенно если выражения формируются итеративно в циклах.
Менеджер выражений
Менеджер выражений позволяет создать линейное выражение из переменной, константы или уже имеющегося линейного выражения.
Менеджер выражений доступен через объект модели:
МенеджерВыражений = Модель.Выражения();
В менеджере выражений предусмотрены следующие методы для работы с выражениями:
Выражение
Преобразует указанное в аргументе выражение в объект с типом "ЛинейноеВыражение".
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражение1 = Модель.Выражения().Выражение("2*x + 3*y + 5");
Выражение2 = Модель.Выражения().Выражение(467);
Выражение3 = Модель.Выражения().Выражение(Пx);
Константа
Преобразует указанное целое число в объект с типом "ЛинейноеВыражение".
Выражение = Модель.Выражения().Константа(467);
Терм
Создает линейное выражение, являющееся результатом домножения другого линейного выражения на указанный целочисленный коэффициент.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Терм1 = Модель.Выражения().Терм(Пx, 2);
Терм2 = Модель.Выражения().Терм(Пy, 3);
Терм3 = Модель.Выражения().Терм("x - 2*(3 + y)", 8);
Сумма
Создает линейное выражение, являющееся суммой указанных в аргументе линейных выражений.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить(Пy);
Выражения.Добавить(Модель.Выражения().Терм(Пy, 2));
Выражения.Добавить("x + 3*y");
Сумма = Модель.Выражения().Сумма(Выражения);
ВзвешеннаяСумма
Создает линейное выражение, являющееся суммой указанных в аргументе линейных выражений, домноженных на весовые коэффициенты. Коэффициенты должны быть целыми числами.
Пx = Модель.Переменная("x");
Пy = Модель.Переменная("y");
Выражения = Новый Массив();
Выражения.Добавить(Пx);
Выражения.Добавить(Пy);
Выражения.Добавить(Модель.Выражения().Терм(Пy, 2));
Выражения.Добавить("x + 3*y");
Коэффициенты = Новый Массив();
Коэффициенты.Добавить(3);
Коэффициенты.Добавить(1);
Коэффициенты.Добавить(3);
Коэффициенты.Добавить(5);
Сумма = Модель.Выражения().ВзвешеннаяСумма(Выражения, Коэффициенты);
Построитель выражений
Построитель выражений позволяет создавать линейные выражения инкрементально, например, добавляя слагаемые в цикле. Построитель выражений может быть создан через специальный метод менеджера выражений СоздатьПостроительВыражений(). После окончания формирования линейного выражения результирующее выражение может быть получено методом ПолучитьВыражение().
Построитель = Модель.Выражения().СоздатьПостроительВыражений();
Одновременно может быть создано несколько построителей для формирования отдельных линейных выражений.
В построителе выражений предусмотрены следующие методы:
Добавить
Добавляет указанное в аргументе выражение к уже накопленным данным.
// Имеем массив "Переменные", состоящий из переменных, ранее определенных в модели
Построитель = Модель.Выражения().СоздатьПостроительВыражений();
Для Каждого Перменная Из Переменные Цикл
Построитель.Добавить(Перменная);
КонецЦикла;
Выражение = Построитель.ПолучитьВыражение();
Вычесть
Вычетает указанное в аргументе выражение из уже накопленных данных.
Умножить
Умножает накопленное в построителе линейное выражение на указанный в аргументе коэффициент. Коэффициент должен быть целым числом.
ДобавитьКонстанту
Добавляет константу к уже накопленному в построителе линейному выражению. Константа должна быть целым числом.
ДобавитьТерм
Добавляет к уже накопленному в построителе линейному выражению терм (другое выражение, домноженное на указанный коэффициент). Коэффициент должен быть целым числом.
// Имеем массив "Переменные", состоящий из переменных, ранее определенных в модели
Построитель = Модель.Выражения().СоздатьПостроительВыражений();
Для К = 0 По Переменные.ВГраница() Цикл
Перменная = Переменные[К];
Построитель.ДобавитьТерм(Перменная, К + 1);
КонецЦикла;
Выражение = Построитель.ПолучитьВыражение();
ДобавитьСумму
Добавляет к уже накопленному в построителе линейному выражению сумму из указанных в аргументе выражений.
ДобавитьВзвешеннуюСумму
Добавляет к уже накопленному в построителе линейному выражению сумму из указанных в аргументе выражений с учетеом их весовых коэффициентов. Весовые коэффициенты должны быть целыми числами.
ПолучитьВыражение
Возвращает итоговый объект с типом "ЛинейноеВыражение", соответствующий накопленным данным в построителе.
ИтоговоеВыражение = Построитель.ПолучитьВыражение();
Очистить
Очищает все данные, накопленные в построителе выражений.
Построитель.Очистить();