Matlab+gurobi求解出现数值问题:numerical problems

本来以为matlab+gurobi求解只会出现unfeasible的问题,没想到今天遇到了numerical problem?!

 在使用matlab+yalmip+gurobi求解MILP问题时,可以求得解(解有数值,但解不满足约束)出现了报错“numerical problems”。

 原因分析:

数值问题(不良数据)

打印警告信息如下: 

 在yalmip官网上发现相关的解释,当模型中出现坏数据时(极大数和极小数,或者没有定义范围引起的大小数,1e9),求解器工作可能会出现数值问题。

这是因为求解器以浮点数值的有限精度工作,这意味着大多数计算一直到加法和减法,都只是近似值。当求解器工作时,这些小错误会累积起来,在某些数据错误的模型中,这可能会导致失败,即numerical problems。链接如下: Debugging numerical problems - YALMIP

 解决方案:

 1.改良模型或消除不良模型

 例如,定义更合适的变量范围;或者,给没有定义范围的变量添加范围。

  2.修改求解器的NumericFocus参数

然而,由于模型是根据实际问题建立的,很多时候一些系数无法修改。这时,为了避免数值问题,提高求解的精度,可以修改 NumericFocus参数。

NumericFocus参数控制代码尝试检测和管理数字问题的程度。数值越大,数值计算更加精确,但花费时间也更多。默认为0,范围:0-3。可以通过以下代码修改:ops=sdpsettings('solver','gurobi','verbos',0,'gurobi.NumericFocus' , 3);

至此,问题解决。日志如下:

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
最短路径问题是指从一个起点到一个终点,经过若干个中间节点,使得路径上的边权之和最小。本文将介绍如何使用YALMIP和gurobi求解最短路径问题。 首先,需要安装YALMIP和gurobi,并将它们与MATLAB集成。然后,定义问题的变量和约束条件。假设有n个节点和m条边,其中边e的起点为i(e),终点为j(e),权重为w(e)。定义变量x(e)表示边e是否在路径中出现,即x(e)=1表示边e在路径中,x(e)=0表示边e不在路径中。则问题可以表示为: minimize ∑e∈E w(e)·x(e) subject to x(e)∈{0,1} for all e∈E ∑e∈δ+(i) x(e) - ∑e∈δ-(i) x(e) = {1 if i=s, -1 if i=t, 0 otherwise} for all i∈V-{s,t} 其中,E表示边集,V表示节点集,s表示起点,t表示终点,δ+(i)表示以节点i为起点的边集,δ-(i)表示以节点i为终点的边集。 然后,需要使用YALMIP来定义问题,并使用gurobi求解。代码如下: ```matlab % 定义变量和参数 n = 5; % 节点数 m = 7; % 边数 s = 1; % 起点 t = 5; % 终点 i = [1 1 2 2 3 4 4]; % 边的起点 j = [2 3 3 4 5 5 3]; % 边的终点 w = [2 1 3 2 1 3 1]; % 边的权重 x = binvar(m,1); % 定义变量x(e) obj = w*x; % 定义目标函数 constr = []; for k = 1:n if k == s % 起点 constr = [constr, sum(x(find(i==k))) - sum(x(find(j==k))) == 1]; elseif k == t % 终点 constr = [constr, sum(x(find(i==k))) - sum(x(find(j==k))) == -1]; else % 中间节点 constr = [constr, sum(x(find(i==k))) - sum(x(find(j==k))) == 0]; end end % 定义问题 ops = sdpsettings('solver','gurobi'); optimize(constr,obj,ops); % 输出结果 value(obj) value(x) ``` 运行上述代码,可以得到最优解为4,路径为1->2->4->5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值