如何声明数组EX2的各元素取值均属于集合EX1
OPL 实现变量取值属于指定集合/数组的正确写法
你原有代码存在两个核心问题,导致约束无法生效:
execute {}是OPL的脚本执行块,仅用于数据预处理、结果后处理逻辑,不能在块内声明模型约束;同时belongs to不是OPL的合法约束语法。- 如果EX2是需要求解的决策变量,不能声明为普通
int类型(普通int是固定值的数据数组),必须用dvar关键字声明为决策变量。
正确实现代码如下:
int NNN = ...; range N = 1..NNN; int BBB = ...; range B = 1..BBB; // 固定数据数组EX1,赋值为1~NNN的整数 int EX1[N]; execute { for( var i in N) EX1[i] = i; } // 将EX2声明为整数决策变量 dvar int EX2[B]; // 所有模型约束统一写在subject to块中 subject to { forall(i in B) { // 内置约束限定EX2[i]的取值必须属于EX1包含的值集合 allowedValues(EX2[i], EX1); } }
补充说明
- 你的场景里EX1本身就是1~NNN的连续整数序列,和range N的值域完全一致,可以直接简化变量声明,不需要额外写约束:
// 直接限定EX2每个元素的取值范围为1..NNN dvar int EX2[B] in N; allowedValues是OPL专门针对离散取值约束优化过的内置接口,比手动写多个||连接的等值判断求解效率更高,适合值域较大的场景。
内容的提问来源于stack exchange,提问作者MO MO MA
相关产品推荐
相关产品推荐

