在AMPL中初始化3维变量

时间:2015-01-16 08:27:41

标签: ampl

我有一个名为Rest的变量定义为:

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

其中T是时间段的集合,I和J是弧。我需要定义I和J的每个值,其中T = 0必须为0.我是供应节点的集合,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求解器)。这甚至意味着什么?此外,如果我声明一个类似的变量休息会导致每个Rest解决方案变为0吗?或者编译器是否将其解释为起始值?

编辑: 我试图实施vitaut提供的解决方案。但是,如下面的评论中所表达的那样,它没有起作用。我认为,因为我已将T定义为:

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

因为我想在t = 0时做一个let语句,所以我必须考虑到这一点并将Rest定义为:

var Rest {I,J,TimeT};

其中TimeU是T union,只有一个0元素的集合,即TimeU被解释为:

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

然而,修复了这些问题后,编译器会抱怨我已经定义了所有变量和参数。

1 个答案:

答案 0 :(得分:2)

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;