Переменные
Переменная — неизвестная числовая величина, значение которой определяет решатель. Переменные служат базовыми элементами модели. Над ними формулируются линейные выражения, ограничения и целевая функция.
В прикладном коде переменная заменяет то, что в традиционном алгоритмическом подходе подбирали бы перебором, эвристикой или ручной настройкой.
Типы переменных
Линейная модель оперирует тремя типами переменных:
- Непрерывная переменная — принимает любые вещественные значения в заданных границах. Применяется для делимых количественных величин: объёмы, доли, мощности, стоимости.
- Целочисленная переменная — принимает только целые значения в заданных границах. Применяется, когда дробные значения теряют прикладной смысл: число произведённых партий, число рейсов, число единиц оборудования.
- Булева переменная — частный случай целочисленной с диапазоном
{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"
);
Массивы переменных естественно сочетаются с построителем выражений при описании балансов, ресурсных лимитов и взвешенных целевых функций по периодам, продуктам, маршрутам.