2015-01-16 9 views
1

У меня есть переменная называется Остальной определяется как:Инициализировать 3 измерения переменная в AMPL

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

где Т представляет собой совокупность периодов времени и 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] 

Заранее благодарим!

EDIT: я теперь использовать:

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 

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

EDIT: Я попытался реализовать решение, предоставленное Vitaut. Однако это не сработало, как выражено в комментариях ниже этого ответа. Я полагал, что, так как я определил Т как:

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

и так как я хотел сделать заявление LET при Т = 0, я должен объяснить, что и определить Rest как:

вар Rest { I, J TIMET};

, где TimeU Т Союз набор с только 0 элементом, т.е. TimeU интерпретируется как:

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

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

ответ

1

Правильный синтаксис команды, пусть это

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; 
+0

Спасибо за ответ! Я попытался скопировать и вставить это в мою модель, как в .mod, так и в .dat. В обоих случаях это дало мне ошибку Ошибка в _cmdno 3 Выполнение команды «let» (файл amplin, команды обработки. Выполнение на neos-2.neos-сервере.org Ошибка (2) in/opt/ampl/ampl -R amplin – Cenderze

+0

Я отредактировал свое оригинальное сообщение. – Cenderze

+1

Возможно, вам нужно будет поместить команду let в отдельный файл и отправить его в NEOS в качестве файла команд. – vitaut

 Смежные вопросы

  • Нет связанных вопросов^_^