基本上我从 TSPLIB http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/tsp/获得了一些对称 TSP 数据,然后我尝试通过首先对城市进行聚类来构建路径,为每个集群,然后连接集群。但是与最佳值相比,我在整个巡回赛中获得的结果非常低。这让我相信我做错了什么,但这完全超出了我的想象,我不知道为什么会发生这种情况。
这是数据文件“Burma14”:
1 16.47 96.10
2 16.47 94.44
3 20.09 92.54
4 22.39 93.37
5 25.23 97.24
6 22.00 96.05
7 20.47 97.02
8 17.20 96.29
9 16.30 97.38
10 14.05 98.12
11 16.53 97.38
12 21.52 95.59
13 19.41 97.13
14 20.09 94.55
我从文件中读取这些数据并为每个点生成一个城市对象。
然后我制作个人。这些基本上是从可用城市随机创建的子路径。两个城市之间的个人旅行,例如 City1 -> City2。
然后我构建路径,这基本上是 TSP 的解决方案。
首先,集群生成如下:
1 cluster cities [City_3, City_4]
2 cluster cities [City_1, City_8, City_9, City_11, City_2, City_10]
3 cluster cities [City_5, City_6, City_12]
4 cluster cities [City_7, City_13, City_14]
然后为每个集群创建子旅游,如下所示:
SubTour: | [[City_4, City_3]] |
Cost: 2.445178930058085
SubTour: | [[City_10, City_9], [City_9, City_11], [City_11, City_8], [City_8, City_1], [City_1, City_2]] |
Cost: 6.29233886113867
SubTour: | [[City_12, City_6], [City_6, City_5]] |
Cost: 4.107068449867602
SubTour: | [[City_14, City_7], [City_7, City_13]] |
Cost: 3.5647520864865525
然后将这些 subtours 连接起来形成一个 Complete Tour,如下所示:
Complete Tour: [| [[City_14, City_7], [City_7, City_13]] |, | [[City_12, City_6], [City_6, City_5]] |, | [[City_4, City_3]] |, | [[City_2, City_1], [City_1, City_8], [City_8, City_11], [City_11, City_9], [City_9, City_10]] |]
Complete Tour Cost: 34.92630477283413
这就是我计算欧几里得距离的方式:
public static double calculateDistance(double x1, double y1, double x2, double y2){
double xDistance = Math.abs(x1 - x2);
double yDistance = Math.abs(y1 - y2);
double distance = Math.sqrt( (xDistance*xDistance) + (yDistance*yDistance) );
return distance;
}
我真的真的不明白为什么我的最佳成本是 34.92630477283413 但这个网站上http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/STSP.html对于 burma14 的最佳成本是 3323。我已经尝试过 ulysses16 数据集(来自某个网站)我仍然有同样的问题。我真的很感激任何形式的指导帮助。
谢谢你。