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

Переменные модели

Переменные модели - это заранее неизвестные величины, которые должны быть вычислены решателем. Для переменных действуют следующие утверждения:

  • переменные являются целыми числами;
  • значени переменных лежат в диапазоне возможных значений типа Int64, т.е. в диапазоне [-264, 264);
  • для каждой переменной может быть задано подмножество допустимых значений (домен);
  • переменным могут быть назначены уникальные имена для их использованы при написании выражений;

Пример создания переменной:

Переменная = Модель.Переменная("x");

Сообщить(
СтрШаблон(
"Содана переменная. Имя переменной: %1. Номер переменной: %2.",
Переменная.Имя, // --> "x"
Переменная.Номер // --> 1
)
);

Булевы переменные

Среди переменных модели отдельно выделяются булевы переменные. Булевы переменные являются частным случаем обычных переменных и могут использоваться там же, где используются обычные переменные. Булевы переменные всегда определены в диапазоне [0, 1].

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

Пример использования:

ПеременнаяX         = Модель.Переменная("x");
ПеременнаяY = Модель.Переменная("y");

СуммаПоложительна = Модель.БулеваПеременная();

Модель.Ограничения().Соотношение("x + y > 0", СуммаПоложительна); // <-- используем булеву переменную как триггер

В указанном примере устанавливается условное ограничение: x + y > 0. Данное ограничение будет проверяться решателем только в том случае, если значение триггерной переменной равно 1 (истина).

Булевы выражения

Булевы выражения - это выражения, значения которых ограничены значениями 0 (ложь) и 1 (истина). К логическим выражениям относятся:

Логический выражения так же как и булевы переменные могут быть использованы при установке условных ограничений. Пример:

ПеременнаяX         = Модель.Переменная("x");
ПеременнаяY = Модель.Переменная("y");

СуммаПоложительна = Модель.БулеваПеременная(); // <-- регистрируется новая перменная
СуммаНеПоложительна = Модель.Отрицание(СуммаПоложительна); // <-- используется уже существующая переменная

Модель.Ограничения().Соотношение("x + y > 0", СуммаПоложительна); // <-- используем булеву переменную как триггер
Модель.Ограничения().Соотношение("x + y <= 0", СуммаНеПоложительна); // <-- используем отрицание как триггер

Добавление переменных

Для добавления переменных предусмотрено несколько методов объекта модели. Методы содержат опциональный параметр "Имя", который позволяет задать уникальное имя переменной. Если имя переменной не указать явно, то имя будет присвоено автоматически по шаблону "_{НомерПеременной}", где "НомерПеременной" - порядковый номер переменной, начиная с единицы.

Переменная

Данный метод создает переменную, значение которой может меняться в широком дипазоне [-248, 248).

Переменная = Модель.Переменная();

ПеременнаяДиапазона

Данный метод создает переменную, значения которой могут меняться в установленном аргументами диапазоне [ЛеваяГраница, ПраваяГраница]. Для упрощения модели рекомендуется задавать максимально узкие диапазоны переменных, т.к. это упрощает задачу решателя.

Переменная = Модель.ПеременнаяДиапазона(0, 15);

ПеременнаяДомена

Данный метод создает переменную, значения которой содержатся в определенном домене (подмножестве целых чисел). Перед созданием переменной необходимо определить домен. Работа с доменами описана в разделе "Домены"

ДоступныеЗначения = О2.Утилиты().Массив(5, 13, 31);

Домен = Модель.Домены().СписокЗначений(ДоступныеЗначения);

Переменная = Модель.ПеременнаяДомена(Домен);

Константа

Данный метод создает переменную, которая может принимать только одно значение, то есть константу.

Переменная = Модель.Константа(55);

БулеваПеременная

Метод создает и регистрирует в модели новую булеву переменную.

ДоступныеЗначения = О2.Утилиты().Массив(5, 13, 31);

Домен = Модель.Домены().СписокЗначений(ДоступныеЗначения);

Переменная = Модель.ПеременнаяДомена(Домен);

ЗначениеИстина

Данный метод создает булеву переменную, которая может принимать только значение 1 (истина).

Переменная = Модель.ЗначениеИстина();

ЗначениеЛожь

Данный метод создает логическое выражение, которое всегда принимает значение 0 (ложь).

Переменная = Модель.ЗначениеЛожь();

Отрицание

Данный метод реализует логическое отрицание булевого выражения.

ЗаданиеВыполнено    = Модель.БулеваПеременная();
ЗаданиеНеВыполнено = Модель.Отрицание(ЗаданиеВыполнено);

МассивПеременных

Метод создает указанное количество переменных и возвращает их в виде массива. Значения всех переменных могут изменяться в диапазаоне [-248, 248).

Переменные = Модель.МассивПеременных(3, "x");   // <-- переменные с именами "x1", "x2", "x3"

МассивПеременныхДиапазона

Метод создает указанное количество переменных и возвращает их в виде массива. Значения всех переменных ограничены диапазоном [ЛеваяГраница, ПраваяГраница].

Переменные = Модель.МассивПеременныхДиапазона(
3, // <-- размер массива
10, // <-- левая граница значений
15, // <-- правая граница значений
"x" // <-- префикс имени переменной
);

МассивПеременныхДомена

Метод создает указанное количество переменных и возвращает их в виде массива. Значения всех переменных ограничены указанным доменом.

Домен = Модель.Домены().СписокЗначений(
О2.Утилиты().Массив(5, 15, 35, 54)
);

Переменные = Модель.МассивПеременныхДомена(3, Домен, "x");

МассивБулевыхПеременных

Метод создает указанное количество булевых переменных и возвращает их в виде массива.

БулевыПеременные = Модель.МассивБулевыхПеременных(3, "x");     // <-- переменные с именами "x1", "x2", "x3"

ДобавитьСловарь

Метод создает и регистрирует в модели сопоставление (словарь), при котором каждому значению указанной переменной однозначно сопоставляется булева переменная с определенным индексом.

Таким образом верно утверждение:

Если "Переменная = Индекс", то "БулевыПеременные[Индекс] = Истина".

Утверждение работает в обе стороны.

Дополнительно можно указать смещение. При указании смещения верно утверждение:

Если "Переменная = Индекс + Смещение", то "БулевыПеременные[Индекс] = Истина".

Пример:

НомерДняНедели = Модель.ПеременнаяДиапазона(0, 6);

ДниНедели = Новый Массив(7);

Для К = 0 По 6 Цикл
ДниНедели[К] = Модель.БулеваПеременная();
КонецЦикла;

Модель.ДобавитьСловарь(НомерДняНедели, ДниНедели);

В данном примере создается переменная, имеющая 7 возможных значений и массив булевых переменных из 7-ми элементов. После регистрации словаря установка переменной в значение "5" будет автоматически означать установку булевой переменной с индексом "5" в значение Истина, а всех остальных булевых переменных в значение Ложь.