如何在CPLEX中筛选大小为奇数的奇节点子集
筛选奇节点集中大小为奇数的子集解决方案
问题说明
已获取图的奇节点集合并生成其所有子集,需从中筛选出大小为奇数的子集。现有两种实现思路:第一种可运行但会生成空集合,第二种暂未正确编写,基础生成子集的代码如下:
range SS=1..ftoi(2^n_odd-1); {int} Sub_odd[s in SS] = {item(odd_nodes,i-1) | i in 1..n_odd : (s div ftoi(2^(i-1))) mod 2 == 1};
方案修正与实现
方案1:避免生成空集合
原方案会输出空集合,可通过提前过滤条件,仅为符合要求的子集赋值,跳过空集合的生成:
{int} Sub_odd_odd[s in SS: card(Sub_odd[s]) mod 2 == 1] = Sub_odd[s];
这样定义的Sub_odd_odd仅包含元素个数为奇数的子集,不会混入空集合。
方案2:正确实现子集集合的筛选
原方案使用union会将所有符合条件的子集合并为一个大集合,若需要保留每个子集作为独立元素,需用集合的集合类型存储,修正代码如下:
{{int}} Sub_odd_odd = {Sub_odd[s] | s in SS : card(Sub_odd[s]) mod 2 == 1};
这里{{int}}表示存储集合的集合,每个元素都是一个元素个数为奇数的奇节点子集。
内容的提问来源于stack exchange,提问作者Mohammad Omidi
相关产品推荐
相关产品推荐

