困扰了快三天的问题,还是没有完全解决,留个坑在这,等下次有时间再来解决吧。希望有知道原因的朋友可以给予指导或者提供解决问题的思路,不甚感激!!!
经过互联网友友的帮助,这个坑填上啦,所有算例的结果和原文均一样!(2024.04.09)
代码放在github上了,有需自取:mumuorMUMU/EVRPTW_GUROBI: GUROBI code for paper " The Electric Vehicle-Routing Problem with Time Windows and Recharging Stations " (github.com)
或者有知道这篇论文源码的同学可以分享一下吗,github上的不太确定是复现的还是源码
这篇论文里的EVRPTW问题的经典模型,采用的也是经典的公开算例集
1. 用cplex求解的结果如下表
用的是github上的一个用cplex建模求解的(不确定是自己复现的还是论文的源码)
E-VRPTW/E-VRPTW.mod at main · jmanzolli/E-VRPTW (github.com)
2. 用Gurobi求解的结果如下表
是自己根据论文里的数学模型和上述cplex例子,用Gurobi的python api写的
算例 | 论文 | Cplex | Gurobi |
C101-5 | m = 2 257.75 | m =3 247.15 | m = 3 (不约束车辆数) 247.15 m =2 (约束m<=2) 257.75 m<=1 无解 |
C103-5 | m=1 176.05 | m = 2 165.67 | m=2(不约束车辆数) 165.67 m = 1(约束m<=1) 无解 |
C206-5 | m=1 242.55 | m = 3 236.58 | m = 3 236.58 m =2 236.58 m =1 245.34 |
C208-5 | m=1 158.48 | m =1 158.48 | |
R104-5 | m =2 136.69 | m =2 136.69 | |
R105-5 | m =2 156.08 | m =2 156.08 | |
R202-5 | m=1 128.78 | m =1 128.78 |
出现的问题如下:
问题一 cplex(246.7)和gurobi(247.15)求解同一个算例得到的目标函数值不一样,但最优解对应的路径是一样的
怀疑是数值精度问题,发现cplex得到的解里面的浮点数都只有一位小数,明显精度不够,于是想到要提高计算精度,但查找了很多资料也没有找到提高计算精度的方式,修改了.ops文件里的"Display presion"也没有用。
最后按图索骥,返回去检查代码所有会产生浮点数计算的地方,发现在计算距离矩阵的时候只保留了一位小数:
修改上述问题,此问题得到了解决!!!!cplex和gurobi求解同一算例得到的目标函数值完全相同!
小结:出现此类问题首先注意是不是数值精度问题;接着考虑两个模型是否完全等价;最后考虑是否cplex和gurobi中的gap(终点)不一样。
问题二 前三个算例和论文里给出的结果不一致
怀疑是设置的车辆数量约束导致的不一样,论文里应该是第一目标都是最小化车辆数,再在最小化车辆数的前提下来最小化总路径长度,但论文给出的数学模型并没有表示出这一点
于是尝试在gurobi中给模型添加总车辆数量的约束(论文中给出的数学并没有这一约束):
于是出现了下表所示的情况,C101-5算例确实如猜想一样,但C103-5算例当设置车辆数为1时,根本无可行解,C206-5算例得到的结果和论文给出的不一样,所以应该不完全是否设置车辆数量约束的问题,。对其他的算例进行测试,发现得到的结果和论文又是一样的,所以不知道前面这三个算例的结果到底问题出在哪里?????
本人目前小白入门,欢迎大家讨论、指教,谢谢!