【问题标题】:AMPL syntax error - constraint over indexed setAMPL 语法错误 - 对索引集的约束
【发布时间】: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


【解决方案1】:

正如您已经发现的那样,条件应该在索引表达式的末尾:

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}

按照 Geoffrey Brent 的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多