gurobi不可解溯源——大M法中M取值问题

解决分段线性化模型求解冲突:调整M值策略,
文章讲述了作者在使用Gurobi解决模型时遇到分段线性化导致的不可解问题,通过调整M值(取10-100倍于变量量级),解决了大部分冲突,强调了M值对数值问题的影响和设置的重要性。

跑模型的时候用了分段线性化和用户均衡条件,都是用大M法线性化的,结果总是不可解。输出冲突约束发现都是分段线性化那部分的,但乍一看又很莫名其妙,看不出有哪几个约束冲突。

输出的部分冲突约束:

想验算一下,用如下代码输出模型的所有约束:

m.write("model.lp")

根据输出文件里的w_rs_q取值进行验算,发现部分x_a与该项系数乘积落在分段临界处。此处以0.1为间隔进行分段线性化,部分乘积结果刚好在0.1或0.2附近,距离临界分段点误差很小(小于gurobi默认的Tol=1e-5)。感觉涉及到了gurobi求解误差问题,考虑从数值问题角度处理。

搜索了很多帖子,发现数值问题可能由于大M法中M取值不当引起,如数学模型tricks | 大M法线性化注意事项

受到启发,将M改为相关变量的10-100倍。我代码中的分段线性化最大为3,所以取M=10。由于代码中多次用到了M,每处变量的量级不同,都更改工作量有点大,故其它地方都先暂时改小为1e5。再次求解,可解次数增加了!(我代码是迭代的)

但还有几次不可解的情况,继续输出冲突约束:

看到这次的冲突中出现了用户均衡部分的内容,故技重施。这里的变量最大值约为几十,故M用100,再次求解。

每一次迭代都可解了!万岁!卡了一个月找不到问题,终于解决了QAQQQ

总结:冲突约束物理意义不明显且涉及到M值时,考虑M设置不当的原因,将M改为相关变量的10-100倍,不能太大或太小。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值