AMPL语法错误 - 对索引集的约束

时间:2017-09-11 08:42:03

标签: indexing set constraints ampl

首先,这是一个演示我的问题的简单示例:

# .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},

所以我无法改变立场。 有没有人知道为什么会发生这种错误,以及是否有办法绕过它?

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}

正如杰弗里布伦特所建议的那样。