成员为集合的两个集合的逐成员并集求解(CPLEX代码报错)
问题描述
我有两个成员为集合的集合,需要生成它们的逐成员并集:
Sub_odd_odd:所有奇数节点的奇数子集,共128个成员Sub_even_even:所有偶数节点的偶数子集,共7个成员
目标是定义新集合Sub_odd_even,包含前两个集合中每个成员对的并集,示例如下:
A=[{1,2,3},{4}] B=[{6}] AB = [{1,2,3,6},{4,6}]
尝试了以下CPLEX代码,均报错:
int num_odd_even1 = card(Sub_even_even); int num_odd_even2 = card(Sub_odd_odd); int num_odd_even = odd_even1 * odd_even2 {int} Sub_odd_even = {i * j | i in Sub_odd_odd, j in Sub_even_even}; {int} Sub_odd_even = {foreach (i in Sub_odd_odd, j in Sub_even_even) i * j}; {int} Sub_odd_evev[oe in num_odd_even] = {item(Sub_odd, i-1) | i in 1..subr and j in 1..subre};
解决方法
在CPLEX OPL中实现该需求,需注意以下要点:
- 修正集合类型:
Sub_odd_odd和Sub_even_even的类型应为{{int}}(集合的集合),而非{int}(普通整数集合),否则无法存储子集成员。 - 正确的并集推导式:使用
union操作符合并每个成员对,集合推导式本身支持遍历逻辑,无需额外foreach:
// 假设Sub_odd_odd和Sub_even_even已定义为{{int}}类型 {{int}} Sub_odd_even = { i union j | i in Sub_odd_odd, j in Sub_even_even };
错误原因解析:
- 用
i * j是算术乘法,不是集合合并操作,完全不符合需求 - 集合推导式内不能嵌套
foreach,属于语法错误 - 最后一段代码存在变量名拼写错误(
Sub_odd_evev)、未定义变量(subr/subre),且数组式集合定义逻辑错误
- 用
可选:统计总成员数:
如果需要计算新集合的总成员数,变量名要保持一致:
int num_odd = card(Sub_odd_odd); int num_even = card(Sub_even_even); int num_total = num_odd * num_even;
内容的提问来源于stack exchange,提问作者Mohammad Omidi
相关产品推荐
相关产品推荐

