CPLEX中带后缀元组的求和语句报错问题咨询
解决CPLEX中带后缀元组的求和约束报错问题
嘿,我一眼就看出你这段代码的问题所在了——核心是CPLEX不允许在元组集合的遍历模式里直接混用外部循环变量,你原来的写法把外部的i和h直接塞进了元组索引里,CPLEX没法正确解析这种混合写法。
问题原因拆解
你写的sum(<<w, i>, h> in assignment)这里,i和h是外层forall(<i, h> in order)的循环变量,但你试图把它们直接作为元组的一部分来遍历assignment集合。CPLEX的语法规则里,遍历元组集合时,要么完整匹配元组的结构(用新的变量名解构元组元素),要么通过where子句来筛选符合条件的元组,不能直接把外部变量硬塞进遍历的模式里。
解决方案
根据你的元组结构,我给你两种修正写法,你可以对应自己的实际定义来用:
情况1:如果assignment是自定义命名元组
假设你的元组定义是类似这样的:
tuple Assignment { int w; int i; int h; } {Assignment} assignment = ...; // 你的元组集合
那约束应该改成用where子句过滤出和外层循环i、h匹配的元组:
forall(<i, h> in order) { sum(a in assignment where a.i == i && a.h == h) J[a] <= production[<i, h>]; }
情况2:如果assignment是匿名后缀元组(比如{<<int, int>, int>} assignment;)
这种情况下,你需要先解构元组的元素,再用where过滤匹配的i和h:
forall(<i, h> in order) { sum(<<w, ai>, ah> in assignment where ai == i && ah == h) J[<<w, ai>, ah>] <= production[<i, h>]; }
额外注意点
- 确保
J的索引结构和assignment的元组完全匹配,比如如果J是三维数组J[w][i][h],那求和里应该写成J[w][ai][ah]而不是J[<<w, ai>, ah>],别搞混索引方式。 - 如果你的
assignment元组结构和我假设的不一样(比如元素顺序不同),记得调整where里的匹配条件,保证对应元素和外层变量一致。
内容的提问来源于stack exchange,提问作者Khải Duy
相关产品推荐
相关产品推荐

