使用CPLEX和YALMIP求解二进制矩阵问题出现整数不可行报错
问题原因及解决方法
- 核心原因是工作区存在之前运行残留的YALMIP变量、约束缓存,和当前代码添加的约束产生了冲突,导致求解器判定不可行。你设计的约束逻辑本身没有问题,2×2场景下完全存在可行解。
- 代码存在两处冗余设计,虽不是报错的直接诱因,但会提高故障概率:
- 嵌套循环重复添加非对角线约束:当i≠j时,(i,j)和(j,i)两组下标会重复添加两次
O(i,j)+O(j,i)==1的相同约束 - 连续两次调用
optimize(F),第一次无返回值的调用属于多余操作
- 嵌套循环重复添加非对角线约束:当i≠j时,(i,j)和(j,i)两组下标会重复添加两次
- 补充排查点:如果清理缓存后仍然报错,可检查CPLEX许可证是否有效、YALMIP是否已正确添加CPLEX的路径配置。
修复后的可运行代码
% 清空工作区变量和YALMIP全局缓存 clear all yalmip('clear') N = 2; O = binvar(N,N); F = []; for i = 1:N % 添加对角线元素为0的约束 F = F + (O(i,i) == 0); % 仅遍历i<j的非对角线组合,避免重复添加约束 for j = i+1:N F = F + (O(i,j) + O(j,i) == 1); end end % 显式指定CPLEX为求解器,无目标函数时直接求解可行性 diagnostics = optimize(F, [], sdpsettings('solver','cplex')); if diagnostics.problem == 0 disp('Feasible'); % 打印求解得到的O矩阵 disp(value(O)) elseif diagnostics.problem == 1 disp('Infeasible'); else disp('Something else happened'); disp(diagnostics.problem); end
结果验证
修复后代码运行会返回可行结果,典型输出如下:
Feasible
0 1
0 0
也可能输出对称的另一组可行解,均符合你设定的约束规则。
内容的提问来源于stack exchange,提问作者Aaron_z
相关产品推荐
相关产品推荐

