我试图用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
/;
答案 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
我希望有所帮助! 鲁兹