GAMS - Целочисленная переменная как индекс

Рассмотрим параметр A, который принимает неотрицательный индекс и возвращает целое число. Я хотел бы использовать значение A в процессе оптимизации, поэтому я создал целочисленную переменную B. Моя цель - использовать B в качестве аргумента для A, чтобы оптимизатор мог выбрать лучший индекс для оптимизации модели.

Следующий код - это пример того, что я пытаюсь сделать:

parameter A(*)  "Parameter A"   /
    0 0,
    1 10,
    2 30,
    3 45,
    4 82
    /;

display A;

integer variable B  "Integer B, used as an index for parameter A";
free variable z     "Variable to maximize";

equations profit    "Profit";

profit..    z =e= A(B);

model m / all /;
solve m using MIP maximizing z;

Когда я пытаюсь его скомпилировать, GAMS возвращает следующую ошибку в строке, где я определяю уравнение profit:

Set expected

Есть ли способ добиться того, что я пытаюсь сделать?


person Cynnexis    schedule 18.10.2018    source источник
comment
Можно заметить, что связь между индексом A и его значениями не является линейной, что означает, что мы не можем перебирать A и умножать значение на B.   -  person Cynnexis    schedule 18.10.2018


Ответы (1)


Вы можете использовать n двоичных переменных вместо целочисленной переменной (где в решении только одна может быть 1) и связать их с A. Это может выглядеть так:

Set i /0*4/;

parameter A(i)  "Parameter A"   /
    0 0,
    1 10,
    2 30,
    3 45,
    4 82
    /;

display A;

binary variable B(i);
free variable z     "Variable to maximize";

equations profit    "Profit"
          oneB;


profit..    z =e= sum(i,A(i)*B(i));
oneB..      sum(i,B(i)) =l= 1;

model m / all /;
solve m using MIP maximizing z;
person Lutz    schedule 19.10.2018