为我们实施最近邻启发式(我已经完成)的学校做项目,以及我们进行详尽搜索的旅行销售员问题(然后我们分析算法,他们的时间复杂度等)。我们的老师说要四处寻找使用(或修改)穷举搜索部分的代码,而不是像最近邻部分那样对整个事物进行编程。我环顾四周,只找到与我们的指示无关的东西。 与使用整数的典型问题相反,我们使用点(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];
非常感谢任何帮助。
答案 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个索引。