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

Переменные

Переменная — неизвестная числовая величина, значение которой определяет решатель. Переменные служат базовыми элементами модели. Над ними формулируются линейные выражения, ограничения и целевая функция.

В прикладном коде переменная заменяет то, что в традиционном алгоритмическом подходе подбирали бы перебором, эвристикой или ручной настройкой.

Типы переменных

Линейная модель оперирует тремя типами переменных:

  • Непрерывная переменная — принимает любые вещественные значения в заданных границах. Применяется для делимых количественных величин: объёмы, доли, мощности, стоимости.
  • Целочисленная переменная — принимает только целые значения в заданных границах. Применяется, когда дробные значения теряют прикладной смысл: число произведённых партий, число рейсов, число единиц оборудования.
  • Булева переменная — частный случай целочисленной с диапазоном {0, 1}. Применяется как индикатор принятия дискретного решения: открыть ли склад, включить ли позицию в план, выбран ли вариант.

Доступность типов определяется подклассом модели: в LP допустимы только непрерывные, в IP — только целочисленные, в MIP — все три типа.

Границы переменной

Каждая переменная определена на интервале [ниж, верх]. Содержательно заданные границы — самый дешёвый и наиболее эффективный способ ускорить поиск:

  • они сокращают пространство поиска: значения, заведомо не имеющие прикладного смысла, отсекаются;
  • они улучшают качество LP-релаксации в задачах целочисленного и смешанно-целочисленного программирования. Чем теснее границы, тем меньше ветвей придётся перебрать методу ветвей и границ;
  • они уменьшают численную нестабильность. Переменные с диапазоном в десятки порядков (например, неограниченные сверху) — типичный источник плохо обусловленных систем уравнений внутри решателя.

В большинстве прикладных задач содержательные границы известны заранее. Производимый объём ограничен мощностью оборудования и спросом, бюджетная доля — единицей, число партий — оперативным горизонтом. Эти величины передаются в модель явно, а не оставляются на значения по умолчанию (±∞).

ОбъёмПродукции = Модель.Переменные().ДобавитьИзДиапазона(
0, // нижняя граница: отрицательный объём бессмыслен
МощностьСутки, // верхняя граница: суточная мощность установки
"ОбъёмПродукции"
);
Содержательные границы

Если в модели есть переменные с диапазоном [0, ∞), проверьте, действительно ли верхняя граница неизвестна. Часто она следует из бизнес-задачи: лимит склада, мощность канала, бюджет, оперативный горизонт. Замена на содержательное значение даёт ускорение поиска в разы без изменения задачи.

Булева переменная как индикатор

В смешанно-целочисленных моделях булева переменная — основной механизм моделирования дискретных решений. Через булевы переменные выражаются:

  • признак принятия решения — открыть ли склад, активировать ли производственную линию, включить ли позицию в маршрут. Значение 1 соответствует «да», 0 — «нет».
  • индикатор активности ограничения — в составе приёмов моделирования (big-M, дизъюнкция, кусочно-линейные функции) булева переменная управляет тем, какие ограничения действуют в найденном решении.
  • признак выбора одного варианта из набора — в наборе булевых переменных с ограничением Σ yᵢ = 1 ровно одна переменная принимает значение 1 (выбранный вариант).
СкладАктивен = Модель.Переменные().ДобавитьБулеву("СкладАктивен");

Подавляющее большинство практических MIP-формулировок построено на сочетании непрерывных переменных-объёмов и булевых переменных-индикаторов. Типичные приёмы такого сочетания описаны в разделе Приёмы моделирования.

Имена переменных

Каждой переменной присваивается имя. Если имя не указано пользователем, оно генерируется автоматически по шаблону _<индекс> — например, _0, _1, _2. Индекс — порядковый номер регистрации в модели, начиная с 0.

Имя используется в двух сценариях:

  • обращение к значению переменной из решения по имени — без сохранения ссылки на объект переменной;
  • запись имени в строковом линейном выражении — например, "2*x + y - 5".

Если переменные впоследствии читаются по имени или включаются в строковые выражения, осмысленные имена назначаются явно: "расход_материала", "объём_цех_1". При массовой регистрации в цикле, когда работа идёт через сохранённые объекты, автогенерируемых имён обычно достаточно.

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

В большинстве прикладных задач переменные нужны массивами: для каждого периода планирования, для каждой пары «склад × продукт», для каждой операции производственного плана.

Поэлементная регистрация в таких случаях избыточна. Библиотека предоставляет фабрики массивов: они создают сразу указанное число переменных одного типа с общей схемой именования.

ПериодыПлана = 12;

ОбъёмПоПериодам = Модель.Переменные().ДобавитьМассивИзДиапазона(
ПериодыПлана,
0,
МощностьМесяц,
"ОбъёмПоПериодам" // имена: "ОбъёмПоПериодам0" ... "ОбъёмПоПериодам11"
);

Массивы переменных естественно сочетаются с построителем выражений при описании балансов, ресурсных лимитов и взвешенных целевых функций по периодам, продуктам, маршрутам.

См. также