c++ - TSP 的 3-opt 优化代码

标签 c++ traveling-salesman

我有这段代码(tsp 问题)适用于 2-opt 优化,我想将其更改为 3-opt 优化。我知道我必须添加一个 for,但不太了解第三个 for 的范围。你能帮助我吗?

    double bestDecrement = tsp.infinite;
    // intial and final position are fixed (initial/final node remains 0)
    for ( uint a = 1 ; a < currSol.sequence.size() - 2 ; a++ ) 
    {
        int h = currSol.sequence[a-1];
        int i = currSol.sequence[a];
        for ( uint b = a + 1 ; b < currSol.sequence.size() - 1 ; b++ ) 
        {
            int j = currSol.sequence[b];
            int l = currSol.sequence[b+1];
            double neighDecrement = - tsp.cost[h][i] - tsp.cost[j][l] + tsp.cost[h][j] + tsp.cost[i][l] ;
            if ( neighDecrement < bestDecrement ) 
            {
                bestDecrement = neighDecrement;
                move.from = a;
                move.to = b;
            }
        }
    }

最佳答案

基本上,您正在寻找 3 个边缘来移除然后重新插入。例如:

for ( uint a = 1 ; a < currSol.sequence.size() - 3 ; a++ ) 
    ...
    for ( uint b = a + 1 ; b < currSol.sequence.size() - 2 ; b++ ) 
        ...
        for ( unit c = b + 1 ; c < currSol.sequence.size() - 1 ; c++)
            ...

更棘手的部分是确定新的成本,因为有一些可行的重新插入(而不是 2-opt 中只有一个)。

关于c++ - TSP 的 3-opt 优化代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28282958/

相关文章:

c++ - 循环语句的困惑

c++ - 为什么这个随机数生成器不是线程安全的?

c++ - Gstreamer Appsink 没有从管道获取数据

c++ - 帧率独立加速/减速?

javascript - TSP-like Puzzle 的求解器,可能在 Javascript 中

python - scipy 中的旅行商

algorithm - 这个 MSP 是 TSP 的一个实例吗?

c++ - 为什么 Qt 应用程序不给我异常或错误?

genetic-algorithm - TSPTW与遗传算法

algorithm - 不限制访问次数的旅行商问题