跑模型的时候用了分段线性化和用户均衡条件,都是用大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倍,不能太大或太小。
解决分段线性化模型求解冲突:调整M值策略,
文章讲述了作者在使用Gurobi解决模型时遇到分段线性化导致的不可解问题,通过调整M值(取10-100倍于变量量级),解决了大部分冲突,强调了M值对数值问题的影响和设置的重要性。
3万+

被折叠的 条评论
为什么被折叠?



