将2 opt swap转换为3 opt swap

时间:2016-05-19 09:39:22

标签: java algorithm traveling-salesman

我正在为旅行商问题编写3-opt算法,我已经有2-opt工作,我试图将其转换为3-opt。 我不知道如何交换3分,有人可以帮帮我吗?

我的代码:

private void ThreeOptSwap(int i, int k, int l) {
    int size = route.size();
    new_Route = new ArrayList<Point>();
    new_Route.addAll(route);
    // 1. take route[0] to route[i-1] and add them in order to new_route
    for ( int c = 0; c <= i - 1; c++ )
    {
        new_Route.set(c, route.get(c) );
    }

    // 2. take route[i] to route[k] and add them in reverse order to new_route
    int dec = 0;
    for ( int c = i; c <= k; c++ )
    {
        new_Route.set( c, route.get( k - dec ) );
        dec++;
    }

    // 3. take route[k+1] to end and add them in order to new_route
    for ( int c = k + 1; c < size; c++ )
    {
        new_Route.set( c, route.get( c ) );
    }
}

1 个答案:

答案 0 :(得分:0)

您不必交换三个点,而是交换路线的三个边缘,这就是您在此处遇到问题的原因。例如,假设您的巡演是0,1,...,i,i + 1,...,j,j + 1,...,k,k + 1,...,n,0。 您需要做的是删除三个边[i,i + 1],[j,j + 1]和[k,k + 1]并尝试重建您的游览(请注意,如果您尝试使用所有可能性重建,你也将实施2-OPT,你也将回到当前的巡回演出)。 幻灯片39上有一个示例here

相关问题