用于 TSP 的 3 选项优化代码
3-opt optimization code for TSP
我有这段代码(tsp 问题)适用于 2 选择优化,我想将其更改为 3 选择优化。我知道我必须添加一个 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 选项中的一个)。
相关文章:
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 需要消除这些"else if"并优化代码
- C/C++编译器是否会通过重用最近计算的函数结果来优化代码?
- 如何优化C 代码的以下片段 - 卷中的零交叉点
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- 优化c++代码以添加两个作为字符串的数字
- x86 汇编和优化代码中的 for 循环
- 如何在gcc中设置模板功能的自动优化代码
- 优化代码/实现"for"循环而不是长"if - else if - else"
- 我的粒子群优化代码在 C++ 和 MATLAB 中生成不同的答案
- 优化代码以获取给定范围内可被整数整除的整数数
- if条件下两个字符串比较的优化代码
- Cuda Thrust - 如何使用sort_by_key、merge_by_key和reduce_by_key优化代码
- 如何优化代码中的参数
- 针对大量迭代优化代码
- 编译器在程序集中优化代码时会做什么?即O2标志
- 优化代码(康威的生命游戏)
- 用于 TSP 的 3 选项优化代码
- 如何使用 SSE 或 GLSL 优化"u[0]*v[0] + u[2]*v[2]"代码行
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)