巡回セールスマン問題|バックトラッキング:N順列(最小枝刈り)

巡回セールスマン問題TSP):一連の都市と都市の各ペア間の距離が与えられた場合、各都市を1回訪問して開始都市に戻る最短ループを解きます。

これは組み合わせ最適化におけるNP-ハード問題です


 1.アイデア

       バックトラッキングアルゴリズムは、完全なトラバーサルを整理し、秩序正しく、合理的に実行することです。明らかに、TSPは一度に異なる都市を通過します。各都市を通過する順序を選択すると、ループの総距離に影響します。したがって、TSP問題の解空間は全体の配置なので、すべての点の配置をトラバースする必要があります。

       状況をnポイントでソートするためにトラバースする必要があります。n-1回選択する必要があります。決定ツリーの非常に鮮やかな配置を作成できます。iであるツリーのi番目のレイヤー

 ポジションの選択には(n-i + 1)の選択肢があるはずです。たとえば、次の例は、数値123のすべての順列をたどる決定木です。


第二に、擬似コードの実装

       最初にすべての数値が順不同でx配列に格納されているとします。ディシジョンツリーのi番目のレベルは、i番目のレベルの選択です。i番目のレベルに移動するとき、1〜i-1桁の数が決定されている(x配列に格納されている)ため、i番目のレベルのみを選択できます。 x [i]〜x [n]。

       これが実際に最小の問題のある剪定操作です。現在の値が記録された最小値よりも小さい場合のみ、次のレベルの検索に進みます。

backtrack(int t) {  //搜索树的第t层:确定第 t 位的选择
    if(t > n) {
        //遍历的终点
        return;
    }
    for i = t : n
        change x[i] and x[t]  //选则第 i个数为 第 t 位
        if 满足限制条件和界限条件
            backtrack(t + 1)  //继续选择下一位
        change x[i] and x[t]  //换回来哦
}

 

おすすめ

転載: blog.csdn.net/weixin_43787043/article/details/106065477