You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CPLEX和YALMIP求解二进制矩阵问题出现整数不可行报错

问题原因及解决方法
  • 核心原因是工作区存在之前运行残留的YALMIP变量、约束缓存,和当前代码添加的约束产生了冲突,导致求解器判定不可行。你设计的约束逻辑本身没有问题,2×2场景下完全存在可行解。
  • 代码存在两处冗余设计,虽不是报错的直接诱因,但会提高故障概率:
    1. 嵌套循环重复添加非对角线约束:当i≠j时,(i,j)和(j,i)两组下标会重复添加两次O(i,j)+O(j,i)==1的相同约束
    2. 连续两次调用optimize(F),第一次无返回值的调用属于多余操作
  • 补充排查点:如果清理缓存后仍然报错,可检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:45:04