使用位掩码迭代 Held-karp 算法中的所有潜在起始位置
Iterate through all potential starting positions in Held-karp algorithm utilizing a bit-mask
我有兴趣在此处找到基于 C 实现的 held-karp 算法:https://www.math.uwaterloo.ca/~bico/papers/comp_chapterDP.pdf in javascript。但是,此实现仅使用一个起始位置。我已经尝试了多种方法来移动所有起始位置(图中的所有节点),但是,因为实现使用位掩码作为访问节点集,起始位置 1 和 0 不会在每次调用函数 solve 时改变,因为0 & anynumber
将始终为 0。
function tsp_hk(dist){
let n = dist.length;
let opt = []; //array [endPoint][set] representing the optimum paths
//Initialize array values
for(let i = 0; i < n; i++){
opt[i] = [];
opt[i][1 << (i)] = dist[i][n-1];
}
function solve(set, end){
if(opt[end][set] === undefined){
let R = set & ~(1 << end);
let minv = 99999;
for (let i = 0; i < n; i++){
if(!(R & (1 << i))) continue;
let s = solve(R, i);
let v = s + dist[i][end];
if(v < minv) minv = v;
}
opt[end][set] = minv;
}
return opt[end][set];
}
let bestlen = 99999;
let N = (1 << (n-1))-1;
for(let t = 0; t < n-1; t++){
let s = solve(N,t);
let len = s + dist[t][n-1];
if(len < bestlen) bestlen = len;
}
return bestlen;
}
如果第一个节点是节点0,你想把节点2作为你的起始节点,那么就把第0行和第2行,第0列和第2列互换。修改邻接矩阵而不是修改算法。
我有兴趣在此处找到基于 C 实现的 held-karp 算法:https://www.math.uwaterloo.ca/~bico/papers/comp_chapterDP.pdf in javascript。但是,此实现仅使用一个起始位置。我已经尝试了多种方法来移动所有起始位置(图中的所有节点),但是,因为实现使用位掩码作为访问节点集,起始位置 1 和 0 不会在每次调用函数 solve 时改变,因为0 & anynumber
将始终为 0。
function tsp_hk(dist){
let n = dist.length;
let opt = []; //array [endPoint][set] representing the optimum paths
//Initialize array values
for(let i = 0; i < n; i++){
opt[i] = [];
opt[i][1 << (i)] = dist[i][n-1];
}
function solve(set, end){
if(opt[end][set] === undefined){
let R = set & ~(1 << end);
let minv = 99999;
for (let i = 0; i < n; i++){
if(!(R & (1 << i))) continue;
let s = solve(R, i);
let v = s + dist[i][end];
if(v < minv) minv = v;
}
opt[end][set] = minv;
}
return opt[end][set];
}
let bestlen = 99999;
let N = (1 << (n-1))-1;
for(let t = 0; t < n-1; t++){
let s = solve(N,t);
let len = s + dist[t][n-1];
if(len < bestlen) bestlen = len;
}
return bestlen;
}
如果第一个节点是节点0,你想把节点2作为你的起始节点,那么就把第0行和第2行,第0列和第2列互换。修改邻接矩阵而不是修改算法。