Java 为什么我的2opt算法会产生交叉路径?
所以基本上我已经实现了本页给出的算法的Java版本。然而,我的算法版本似乎产生了一个带有一些交叉的解决方案。页面上的一个是用javascript编写的,它生成了一个没有交叉的解决方案。我不知道我在算法中遗漏了什么。 这是我的算法版本Java 为什么我的2opt算法会产生交叉路径?,java,algorithm,optimization,Java,Algorithm,Optimization,所以基本上我已经实现了本页给出的算法的Java版本。然而,我的算法版本似乎产生了一个带有一些交叉的解决方案。页面上的一个是用javascript编写的,它生成了一个没有交叉的解决方案。我不知道我在算法中遗漏了什么。 这是我的算法版本 ArrayList<Record> twoOpt(ArrayList<Record> path) { int N = path.size(); ArrayList<Record> best = new Array
ArrayList<Record> twoOpt(ArrayList<Record> path) {
int N = path.size();
ArrayList<Record> best = new ArrayList<>();
for (Record r : path) { best.add(r); }
for (int i = 1; i < N-2; i++) {
for (int j = i+1; j < N+1; j++) {
if (j-i == 1) continue;
ArrayList<Record> newPath = new ArrayList<>();
for (int k = 0; k < i; k++) {
newPath.add(best.get(k));
}
for (int k = j-1; k >= i; k--) {
newPath.add(best.get(k));
}
for (int k = j; k < N; k++) {
newPath.add(best.get(k));
}
if (cost(newPath) < cost(best)) {
best = newPath;
}
}
}
return best;
}
int cost(ArrayList<Record> path) {
int c = 0;
for (int i = 1; i < path.size(); i++) {
c += path.get(i-1).timeTo(path.get(i));
}
return c;
}
ArrayList twoOpt(ArrayList路径){
int N=path.size();
ArrayList best=新的ArrayList();
对于(记录r:path){best.add(r);}
对于(int i=1;i=i;k--){
newPath.add(best.get(k));
}
对于(int k=j;k
您必须迭代,直到完成整个迭代而不修改路径为止。