我是optaplanner的新手。我试图修改vrp示例[无论是CVRP还是VRPTW]以支持不仅仅是欧几里德距离作为节点之间的边缘权重。我使用的是最新发布的optaplanner 6.0.0.CR5。关于如何更改节点之间边缘权重的任何建议都将非常受欢迎。
由于
答案 0 :(得分:1)
有几种方法可以解决这个问题。所有人都认为你有一个GPS系统(如谷歌地图)可以很容易地返回2点A和B之间的距离。
请注意,GPS的系统责任是决定从A到B的实际道路(这不是NP完全问题,GPS系统已经针对它进行了优化)。 OptaPlanner决定做A,B,C,D ......的顺序(这是NP完全的)。
A)计算距离(不推荐)
只需通过拨打GPS系统替换get Location.get...Distance(Location)
方法。
缺点:通常这种方法每秒被调用数千次,而你的GPS系统不会快速返回答案,大大降低了你的平均分数。
B)预先计算距离并将其存储在内存中
在课程Location
中,添加Map<Location, int> dinstanceMap
以保持与其他Location
的距离。在致电Map
之前填写solve()
,并get...Distance()
实施return distanceMap.get(otherLocation)
。
缺点:内存扩展:如果客户太多,您将获得OutOfMemory异常。
解决方法:对于每个Location
,仅在该地图中添加1000个最近的位置。过滤移动选择器,使其永远不会尝试连接不在彼此的地图中的2个位置。这可能会影响结果的质量。
C)预先计算距离并将其存储在磁盘上并将其缓存在内存中
与B)相同,但由于距离矩阵太大,请将其存储在磁盘上。如果最近没有询问过,请使用缓存仅从磁盘中获取值。