Переменные линейной модели имеют много общего c числовыми параметрами. И первые, и вторые являются символами, обозначающими числа, которые могут использоваться в арифметических выражениях. Значения параметров предоставляются разработчиком модели или вычисляются на основании других значений. Значения переменных определяются оптимизирующим алгоритмом (решателем).
Синтаксически, объявления переменных аналогичны объявлениям параметров, за исключением того, что они начинаются с ключевого слова var, а не param.
Объявления переменных начинаются с ключевого слова var и имеют следующий вид:
var name alias indexing attributes;
Необязательные attributes объявлений переменных могут быть разделены запятыми. Эти атрибуты включают в себя:
binary integer symbolic >=, =, >=, := or default expr coeff indexing constraint-expr cover indexing constraint obj indexing objective expr in sexpr suffix sufname expr
Как и в случае с параметрами, integer ограничивает переменную целочисленными значениями, а binary ограничивает ее "0" или 1.
Фразы >= и <= определяют границы, а фраза := - начальное значение. Фраза default определяет значение по умолчанию для начальных значений, которые могут быть предоставлены в разделе данныx data. default и := являются взаимоисключающими. Фраза = expr разрешена, только если ни один из предыдущих атрибутов не появляется. Каждая суффиксная фраза sufname expr определяет начальное значение для ранее объявленного суффикса sufname. Если указано значение symbolic, тогда атрибуты, требующие числового значения, например >= expr, исключаются. Если in sexpr появляется без symbolic, заданное выражение sexpr должно быть объединением интервалов и дискретных наборов чисел. В любом случае in sexpr ограничивает переменную, чтобы она находилась в sexpr. Фразы coeff и obj предназначены для генерации коэффициентов по столбцам (Подробнее о столбчатых формулировках можно прочитать в главе "Столбчатые формулировки".). Они определяют коэффициенты, которые должны быть помещены в указанное ограничение или цель, которые должны быть предварительно объявлены с использованием заполнителя to_come. Объем индексации ограничен фразой и может иметь специальную форму:
{if lexpr}
которая вносит вклад в коэффициент, только если lexpr истинно. Фраза cover эквивалентна фразе coeff, в которой выражение expr равно 1.
Дуги - это специальные сетевые переменные, объявленные с ключевым словом arc вместо var. Они могут вносить коэффициенты в ограничения узла через необязательные дополнительные фразы в следующих формах:
from indexing node expr to indexing node expr
Эти фразы аналогичны по синтаксису фразе coeff, за исключением того, что последнее выражение является необязательным. его пропуск - то же самое, что и значение 1.
var Make{p in PROD} >= 0, <= market[p];
Это объявление создает индексированную коллекцию переменных Make[p], по одной для каждого элемента p набора PROD. Логические операторы >= или <=, являются наиболее распространенными в объявлениях переменных для линейных программ. Эффект этих операторов заключается в наложении ограничения на допустимые значения переменных. В частности, >=0 подразумевает, что всем переменным Make[p] должны быть присвоены неотрицательные значения решателем. Фраза <= market[p] говорит о том, что для каждого продукта p, - значение, заданное для Make[p] не может превышать значение параметра market[p].
Объявление переменной на основании четных или нечетных значений набора
param N:=5; set W ordered:=1..N; var K{w in W: w mod 2 = 1}>=0; или проще var K{w in W by 2}>=0;
If-then-else в объявлении переменных
param n=3; set N = 1..n; set N4 = 1..n*4; set K:= 1..20; var X{N,N} integer in K; var P{i in N4} = if i <= n then sum{j in N} X[i,j] else if i > n and i <= 2*n then if(i mod n = 0) then sum{j in N} X[j,n] else sum{j in N} X[j,i mod n]; display P;