ZIMPL: объявление 2D-переменной не распознается в ограничении - PullRequest
1 голос
/ 05 марта 2019

У меня реальная проблема с объявлением 2D-переменной в Zimpl.(Параметры вроде бы работают нормально.)

Вот мой MWE:

set I := {1 to 10};
set J := {1 to 5};

param A[I*J] := read InputFile as "n+";
var x[I] binary;
var s[J] binary; # this works but doesn't do what I need
var s2[I*J] binary; # this does what I need but doesn't work

minimize sum<i,j> in I*J with A[i,j] < 5: (s2[i,j] - x[i]) * A[i,j];

# this constraint compiles
subto constraint1:
   forall <j> in J do sum <i> in I with A[i,j] < 5: x[i] <= 1 + s[j];

# this constraint does not compile
subto constraint2:
   forall <j> in J do sum <i> in I with A[i,j] < 5: x[i] <= 1 + s2[i,j];

Когда я пытаюсь создать мой файл lp, я получаю

Error 133: Unknown symbol "i"

Кто-нибудьесть какие-то идеи о том, как я могу заставить работать второе ограничение?Насколько я могу судить, это идентично реализации проблемы с емкостным оборудованием (раздел 6.3) в руководстве пользователя Zimpl.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 06 марта 2019

Чтобы добавить к тому, что написал Джеральд, в суммах ZIMPL всегда учитывается только следующая переменная, поэтому вы должны поставить круглые скобки, чтобы она работала.

2 голосов
/ 06 марта 2019

У вас есть сумма над i в левой части ограничения, но затем ссылка на i также в правой части.Какое значение я ожидаю там?

Что будет работать

forall <j> in J do sum <i> in I with A[i,j] < 5: (x[i] - s2[i,j]) <= 1;

, но я не уверен, что это то, чего вы хотите достичь.

Добавление комментария ЛеонаЧтобы получить более полный ответ:

Чтобы добавить к тому, что написал Джеральд, в суммах ZIMPL всегда учитывается только следующая переменная, поэтому для ее работы необходимо поставить скобки.

0 голосов
/ 18 марта 2019

при сворачивании отсутствует имя. Должно быть свернуто obj: sum ...

...