首先,这是一个演示我的问题的简单示例:
# .mod file
param N;
set TIME := 1 .. N;
set C ordered;
param tbar {C};
var X {C,TIME} >= 0;
minimize cost: sum {c in C} X[c,N];
subject to C1 {c in C: ord(c)>1, t in 1 .. N-1}:
X[c,t+1] = X[c,t] + 3;
这是.dat文件:
param N := 10;
set C := C1 C2 C3;
param tbar :=
C1 2
C2 3
C3 3 ;
我收到语法错误
test.mod, line 9 (offset 142):
syntax error
context: subject to C1 {c in C: >>> ord(c)>1, <<< t in 1 .. N-1}:
如果我将索引的位置更改为
{t in 1 .. N-1, c in C: ord(c)>1},
它工作正常。问题是,我想要
{c in C: ord(c)>1, t in tbar[c] .. N-1},
所以我无法改变立场。 有没有人知道为什么会发生这种错误,以及是否有办法绕过它?
答案 0 :(得分:0)
正如您已经发现的那样,条件应该在索引表达式的末尾:
subject to C1 {c in C, t in 1 .. N-1: ord(c)>1}:
X[c,t+1] = X[c,t] + 3;
如果您想在c
之类的后续表达式中使用tbar[c]
作为下标而且未为c = first(C)
定义,那么您可以
{c in (C diff {first(C)}), t in tbar[c] .. N-1}
正如杰弗里布伦特所建议的那样。