在 AMPL 中初始化 3 维变量
Initialize 3 dimension variable in 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 求解器)。这到底是什么意思?另外,如果我这样声明一个变量 Rest,它会导致每个 Rest 解决方案都变为 0 吗?还是编译器将其解释为起始值?
编辑:
我试图实现 vitaut 提供的解决方案。但是,正如该答复下方的评论中所述,它没有用。我认为,因为我将 T 定义为:
set T := 1 2 3 ... 15;
因为我想在 t = 0 时做一个 let 语句,我必须考虑到这一点并将 Rest 定义为:
var Rest{I,J,TimeT};
其中 TimeU 是 T 并集只有一个 0 元素的集合,即 TimeU 被解释为:
TimeU := 0 1 2 3 ... 15;
然而,在修复这些问题后,编译器会抱怨我的所有变量和参数都已定义。
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;
我有一个名为 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 并集只有一个 0 元素的集合,即 TimeU 被解释为:
TimeU := 0 1 2 3 ... 15;
然而,在修复这些问题后,编译器会抱怨我的所有变量和参数都已定义。
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;