为何CPLEX返回不满足约束的解?数组含重复值时x得1
问题分析
你提供的CPLEX OPL代码如下:
int n=6; int a[1..n] = [12,0,10,4,10,8]; dvar int x in 0..1; maximize x; subject to { forall(i,j in 1..n) (i!=j && a[i]==a[j]) => x==0; }
按照约束逻辑,数组a中存在重复值(10出现两次),此时应生成x==0的约束,最优解应为x=0,但你得到x=1,核心原因集中在代码语法或实际运行的代码差异上,具体分析如下:
HTML转义字符导致语法错误:你提供的代码中使用了
&&(HTML转义后的&&),若直接复制到CPLEX OPL环境中,&&属于非法语法。部分场景下CPLEX不会直接报错,但会忽略存在语法错误的约束块,导致模型仅保留变量x和最大化目标,此时最优解自然是x=1。约束写法或逻辑偏差:若实际代码中误将蕴含式方向写反(如写成
x==0 => (i!=j && a[i]==a[j])),或把x==0写成x==1,会导致约束失效甚至逻辑反转,使得x=1成为可行解。数组定义与描述不符:若你实际运行时数组
a的定义与提供的不一致(比如第二个10被误写为其他数值),则数组无重复元素,所有约束的前提条件为假,蕴含式自动满足,此时最大化x会得到x=1。
验证方式:将代码中的&&替换为&&,确认数组a定义正确后重新运行,CPLEX应返回x=0的最优解。
内容的提问来源于stack exchange,提问作者Josh.K
相关产品推荐
相关产品推荐

