3

我有一个名为 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 求解器)。这甚至意味着什么?此外,如果我声明一个这样的变量 Rest 是否会导致每个 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;

然而,随着这些修复,编译器抱怨我所有的变量和参数都已经定义了。

4

1 回答 1

3

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;
于 2015-01-17T20:00:13.223 回答