1

我正在尝试使用集合操作(​​在我的情况下为“-”操作)动态定义一些集合。但是,“-”操作似乎只适用于执行阶段,并且在定义其他集合时使用此集合时,gams 失败并出现以下错误:644 set.ident or #.ident has undefined data。我认为问题在于使用减号操作定义的集合直到执行阶段才会创建。

我找不到在编译阶段创建集合的解决方案。任何帮助表示赞赏,下面有一个最小的可重复示例。

set alphabet /
"a"
"b"
"c"
/;

set a(alphabet) /
"a"
/;

sets bc(alphabet);
bc(alphabet) = alphabet(alphabet) - a(alphabet);

set test1(alphabet)
/
#a
/;

set test2(alphabet)
/
#a
#bc
/;

set test3(alphabet)
/
set.a
/;

set test4(alphabet)
/
set.a
set.bc
/;
4

1 回答 1

1

你是对的,“bc(字母)=字母(字母)-a(字母);” 是一个执行时间语句。在 GAMS 中直接在编译时进行集合减法并不那么容易(与有效的集合加法相反)。但如果您使用最新的 GAMS 系统 (24.9),您可以使用新的 嵌入式代码工具来执行此操作:

set alphabet /
"a"
"b"
"c"
/;

set a(alphabet) /
"a"
/;

sets bc(alphabet);

$onEmbeddedCode Python:
  gams.set("bc", list(set(gams.get("alphabet")) - set(gams.get("a"))))
$offEmbeddedCode bc

我希望这会有所帮助!卢茨

于 2017-10-05T08:41:14.943 回答