Java TSP Permute Points

时间:2012-09-05 23:26:17

标签: java permutation points traveling-salesman

为我们实施最近邻启发式(我已经完成)的学校做项目,以及我们进行详尽搜索的旅行销售员问题(然后我们分析算法,他们的时间复杂度等)。我们的老师说要四处寻找使用(或修改)穷举搜索部分的代码,而不是像最近邻部分那样对整个事物进行编程。我环顾四周,只找到与我们的指示无关的东西。 与使用整数的典型问题相反,我们使用点(x,y)。 我的目标是计算最短的排列,并能够知道排列是什么。所以我想要一个数组的数组(包含排列)。

如果有人可以通过详尽的搜索来帮助我,那就太好了。

以下是我的代码摘录(成员变量,计算两点之间距离的函数,以及存储所有点的位置):

private int x;
private int y;
private boolean visited;

public double dist( point pt ){
    int xdist = this.getX() - pt.getX();
    int ydist = this.getY() - pt.getY();
    double xsr = xdist*xdist;
    double ysr = ydist*ydist;
    return Math.sqrt( xsr + ysr );
}

point[] points = new point[n];

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

单个TSP可能的解决方案基本上只是一组城市,代表了访问它们的顺序,没有起始城市。

因此,假定n(城市数量)= 5.然后,一个可能的解决方案被表示为长度为4的数组。现在,您可以订购多少种方式[B,C,D,E]? BCDE,BCED,BDCE,BDEC,...这是4!或24种组合。因此,对于n个城市,您有(n-1)!个组合。 10个城市的362880组合。对于20个城市或10 ^ 17种组合,如果你想将它们全部留在内存中,你将会耗尽内存。

另一个问题是你需要n个嵌套for循环,但是不可能只为那些for循环编写,因为有n个。 (你可以开始写for() for() for() ...。 因此,您的实现可能需要某种walker approach,其中您有一个循环遍历所有组合,就像数字时钟,每个数字代表数组中的1个索引。