Инициализировать трехмерную переменную в AMPL

У меня есть переменная Rest, определенная как:

var Rest{I,J,T} >= 0;

где T — множество периодов времени, а I и J — дуги. Мне нужно определить, что каждое значение для I и J, где T = 0, должно быть равно 0. I — это набор узлов предложения, а J — набор узлов спроса.

Я пробовал:

let Rest[*,*,0] default 0;

но это вызвало у меня синтаксическую ошибку. Я пробовал это как в файле .dat, так и в файле .mod, используя как :=, так и :

Я также пытался поместить это в файл .dat

var Rest default 0:=
[*,*,0] 1 City1 0;

но это дало мне ошибку

Error at _cmdno 3 executing "solve" command
(file amplin, line 286, offset 11443):
error processing constraint Constraint1[1,'Leveaniemi',1]:
invalid subscript Rest[1,'City1',0]

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

РЕДАКТИРОВАТЬ: теперь я использую:

var Rest default 0 :=
  [*,*,0] 1 Leveaniemi 0;

которые дают мне ошибку

Error at _cmdno 3 executing "solve" command
(file amplin, line 286, offset 11438):
error processing constraint Constprocessing commands.
Executing on neos-3.neos-server.org
Error (2) in /opt/ampl/ampl -R amplin

(Я использую сервер NEOS, решатель Gurobi). Что это вообще значит? Кроме того, если я объявлю Variable Rest таким образом, это приведет к тому, что каждое решение Rest станет равным 0? Или компилятор интерпретирует это как начальное значение?

РЕДАКТИРОВАТЬ: я попытался реализовать решение, предоставленное vitaut. Однако это не сработало, как указано в комментариях ниже этого ответа. Я понял, что, поскольку я определил T как:

set T := 1 2 3 ... 15;

и поскольку я хотел сделать оператор let при t = 0, я должен это учесть и определить Rest как:

var Rest{I,J,TimeT};

где TimeU представляет собой T объединение набора только с 0 элементом, т.е. TimeU интерпретируется как:

TimeU := 0 1 2 3 ... 15;

Однако с этим исправлением компилятор жалуется, что все мои переменные и параметры уже определены.


person Cenderze    schedule 16.01.2015    source источник


Ответы (1)


Правильный синтаксис команды let:

let {i in I, j in J} Rest[i, j, 0] := 0;

Однако он присвоит начальные значения переменным, которые могут измениться в процессе оптимизации. Если вы хотите, чтобы Rest[i, j, 0] всегда равнялось нулю, вместо этого вы должны использовать ограничение:

s.t. c{i in I, j in J} Rest[i, j, 0] = 0;
person vitaut    schedule 17.01.2015
comment
Спасибо за ответ! Я попытался скопировать и вставить это в свою модель как в файл .mod, так и в файл .dat. В обоих случаях это дало мне ошибку _cmdno 3 при выполнении команды let (файл amplin, обработка команд. Выполнение на neos-2.neos-server.org Ошибка (2) в /opt/ampl/ampl -R amplin - person Cenderze; 19.01.2015
comment
Возможно, вам потребуется поместить команду let в отдельный файл и отправить ее в NEOS как файл команд. - person vitaut; 19.01.2015