用TSPLIB数据Java解决TSP问题

用TSPLIB数据Java解决TSP问题,java,optimization,traveling-salesman,virtual-tour,Java,Optimization,Traveling Salesman,Virtual Tour,基本上,我从TSPLIB获得了一些对称的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

基本上,我从TSPLIB获得了一些对称的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
我从文件中读取这些数据,并为每个点生成一个城市对象

然后我产生个人。这些基本上是从可用城市随机创建的子路径。个人在两个城市之间的旅行,例如城市1->城市2

然后我构建路径,这基本上就是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
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
然后为每个集群创建子排序,如下所示:

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
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
然后将这些小计连接起来,形成一个完整的巡更,如下所示:

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
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.9263047283413,但在这个网站上burma14的最佳成本是3323。我尝试了ulysses16数据集(来自某个网站),但仍然存在相同的问题。我真的很感激任何形式的指导


谢谢。

对于Burma14,问题是“GEO”。这意味着您必须计算地理距离(您将获得lat和long coords)。看。此外,对于TSP,子巡更和最终巡更应在同一位置开始和结束。如果你的目标是学习TSP的工作原理,我建议你先选择一个更简单的问题,而不是计算地理距离。谢谢@RamNarasimhan,这正是我需要的@RamNarasimhan这就是你说的那种事吗?因为我的计算仍然不正确……是的,考虑到两个位置的纬度/经度,您必须使用GCD(大圆距离)。但我给你的建议是避开这一切。选择一个更简单的TSP问题(预先计算的距离为偶数)并解决TSP以测试代码。