【发布时间】:2023-03-18 23:36:01
【问题描述】:
首先,这是一个演示我的问题的简单示例:
# .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},
所以我不能改变位置。 有谁知道为什么会发生此错误以及是否有解决方法?
【问题讨论】:
-
我找到了解决方案。条件必须在末尾: {c in C, t in tbar[c] .. N-1: ord(c)>1} 有效。
-
这里的另一种选择是不带条件地表达它。像 {c in (C diff {first(C)}), t in tbar[c] .. N-1} 这样的东西应该可以工作。在此示例中,您选择哪个版本可能并不重要,但对于大型索引集,立即消除这些情况而不是生成它们然后通过条件再次删除可能更有效。
标签: indexing set constraints ampl