编译阶段的动态集合操作

时间:2017-10-04 08:15:31

标签: gams-math

我试图用set操作动态定义一些集合(在我的例子中是“ - ”操作)。但是,“ - ”操作似乎仅在执行阶段应用,并且在定义其他集时使用此集时,gams失败并出现以下错误: 644 set.ident或#.ident具有未定义的数据。我认为问题是在执行阶段之前不会创建使用减号操作定义的集合。

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

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
/;

1 个答案:

答案 0 :(得分:1)

你是对的," bc(字母)=字母(字母) - a(字母);"是执行时间声明。在编译时直接在GAMS中进行集合减法并不是那么容易(与有效的集合添加相比)。但是如果您使用最近的GAMS系统(24.9),则可以使用新的embedded code facility来执行此操作:

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

我希望有所帮助! 鲁兹