1、问题缘由
首先指出,在CPLEX的OPL语言中,不支持range定义的范围的取并集运算,但是想要获得不连续的range 范围应该怎样做呢?
2、解决方法
使用not in
将连续范围进行打断,迂回实现取并集的操作。下面通过一段例子来具体结束。
range T1 = 1..4; range T2 = 7..9; range T3 = 5..6; range T4 = 1..9; dvar int x[T4][T4]; subject to { forall(j in T1)sum(i in T4:i not in T3)x[i][j] == 1; }
上面代码中,可以实现range范围T1和T2的并集,通过i in T4:i not in T3
将全集中的某个range集合去除之后得到其他range范围的并集。