CPLEX中如何实现数学唯一性符号并编写对应forall语句?
CPLEX 实现唯一性约束的正确写法
CPLEX OPL 没有单独内置数学里的唯一性符号,你需要的逻辑可以通过sum求和约束和forall遍历组合实现,针对你给出的需求场景,分两种常见实现方式:
- 场景1:要求集合
M中全局仅有1个元素被选中
你需要先定义0-1决策变量x[m]表示元素m是否被选中,直接写求和约束即可:sum(m in M) x[m] == 1; - 场景2:对每个
m in M,要求m对应的可选选项中仅有1个被选中
假设J[m]是每个m对应的可选选项集合,x[m][j]为0-1决策变量表示m是否选中选项j,写法如下:forall(m in M) { sum(j in J[m]) x[m][j] == 1; }
如果你需要实现的是排列类场景(所有决策变量的取值互不重复),可以直接调用CPLEX内置的allDifferent约束,示例如下:
// 定义x[m]的取值范围是1到M的元素总数 dvar int x[M] in 1..card(M); // 约束所有x[m]的取值互不相同 constraints allDifferent(x);
补充说明:如果允许存在元素不被选中的情况,只需要把求和约束的右值从==1修改为<=1即可。
内容的提问来源于stack exchange,提问作者Francesca
相关产品推荐
相关产品推荐

