Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的2opt算法会产生交叉路径?_Java_Algorithm_Optimization - Fatal编程技术网

Java 为什么我的2opt算法会产生交叉路径?

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

所以基本上我已经实现了本页给出的算法的Java版本。然而,我的算法版本似乎产生了一个带有一些交叉的解决方案。页面上的一个是用javascript编写的,它生成了一个没有交叉的解决方案。我不知道我在算法中遗漏了什么。 这是我的算法版本

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
您必须迭代,直到完成整个迭代而不修改路径为止。