TSPのHeld-Karpアルゴリズムの時間の複雑さ


9

Michael HeldとRichard M. Karpによる「シーケンス問題への動的プログラミングアプローチ」を調べたところ、TSPのアルゴリズムの複雑さが(∑k=2n−1k(k−1)(n−1k))+(n−1)(p。199)、それらは係数kどこで取るのですか?私が正しく理解していれば、k−1は都市の各サブセットの追加数を意味します。それでは、各加算演算が未知のk演算と結合されるのはなぜですか?どういうわけか最小値を取ることに関係していると思いますが、最小値を計算することはそれほど多くの操作を必要としないようです。

次のように保持し、カープと独立ベルマン実行によって動的プログラミングアルゴリズム:各ペアのための(S,ci)を経由する経路を意味し、c1、すべての要素Sとで終端ci計算

OPT[S,ci]=min{OPT[S∖{ci},cj]+d(cj,ci):cj∈S∖{ci}},

ここで、d(cj,ci)は、都市cjとc_iの間の距離を意味しciます。次に、紙の公式では、kはSのサイズを意味しますS。

回答:


5

以下の補遺、k(k−1)項を明確化:

したがって、式の項を調べると、(類推として)項は、最初の位置に1を持つ 1 を含むすべてのバイナリ文字列の列挙であると想定でき。言い換えれば、バイナリ文字列の各位置に、問題の都市の特定の1つが、現時点で検討している正確なサブセットにあるかどうかの選択を表すようにします。したがって、5つの都市の場合、10101はサブセット{1,3,5}に対応します。(n−1k)kn

したがって、{1、...、 }のすべてのサブセットにわたって計算するには、サイズ= 2(つまり、2つの1を含むサイズバイナリ文字列)の各バイナリサブセット(つまり、バイナリ文字列を通じてカウント)を数えるだけです。サイズ= 3、次にサイズ= 4、...サイズ= n。(サイズ= 1のサブセットには最初の都市のみが含まれている必要があります。したがって、部分距離を計算することは関係ありません。1からの距離->サブセット内の他のすべての都市-> 1は正確に0であるためです。)nn

都市を持つ各サブセットで、最大候補最適な部分パスを考慮する必要があります。具体的には、最適な合計パスは、特定のサブセットを通過し、最初の都市を除く都市のいずれかに到達する可能性があります。次に、そのような候補サブパスごとに、そのポイントまでの最適なツアーを、前のいずれかの最小サイズとして計算します。size=サブパスとそのサブパスのターミナルシティからの距離現在の候補サブパスのターミナル都市。これにより、比較が必要になります。私の項と間の不一致kk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)リンクされている分析の用語は表記上の違いです(定義が与えられていれば、異なる範囲で合計します)。ただし、少なくとも、その用語の2次の複雑さを示す必要があります。k


非常に興味深い-数分前に、C ++でこの正確なアルゴリズムのコーディングを完了しました。(そのため、純粋な理論の接線を少し実際的な議論に許してください。)

時間とスペースがかかります-少なくとも私の実装では。実際には、必要なスペースが急速に増えると、必要な時間よりもはるかに苦痛になります。たとえば、私のPC(4 GBのRAM)では、最大24都市-それ以上の都市でインスタンスを解決できますが、メモリが不足します。O(2nn2)O(2nn)

もちろん、私は単に悪いプログラマーである可能性もあり、実際には私よりも上手にできるかもしれません。:)

編集:質問の1つの詳細についてもう少し詳しく:項は、最悪の場合、以前のサブセットからの部分的な最適距離を計算する必要があるという事実に由来します(多くてもそれらの ;は、現在のリンクにリンクした分析でを合計したものであることに注意してください。これには、最悪の場合でも、合計のサイズサブセットとの比較が必要です。k(k−1)nknO(k)k−1O(k2)

また、私の説明が十分に明確でなかった場合は、Vaziraniのすばらしい講義ノート(PDF)を以下に示します。Held-Karpの分析を含むTSPの説明については、P。188までスクロールしてください。


はいもちろん!私は今、そのことをばかげて考えています。回答を更新します。私は実際にその正確なコメントを実際に聞いたことがあり、それについて考えずにそのまま渡しただけです。そして、そうです。ファイルへの書き込み/ファイルからの読み取りにより、事実上、任意の数の都市を自由に高くすることができます。...実際の目的でTSPインスタンスを解決しようとしない限り、心配する価値のない痛みでもあります。鉱山は明らかに実用的な目的ではありませんでした。;)
— ダニエルアポン

2
Bjorklundアルゴリズムを実装する時間:)
— Suresh Venkat

@Suresh:いい考えです!
— ダニエルアポン

@Daniel Apon「部分的な最適距離」を計算するときに比較が必要な理由を正確に教えてください。
— Oleksandr Bondarenko

@Oleksandr:もちろん、私はそれを私の回答の一番上に追加します。
— ダニエルアポン

0

メインノート


「最適パスの 距離combination of k cities」では
なく、
「combination of k cities AND forの最適パスの距離」を計算して保存することに注意してくださいend-point city from this combination。
それを理解すると、次の式の最初の2つの乗数の意味がわかります。

第1段階

第一段階の動作の数である:

∑k>=2(n−1k−1)⏟choose city combinationof size = k−1⋅(k−1)⏟choose city to be the lastfrom k−1 citiesin chosen combination⋅((n−1)−(k−1))⏟choose citythat is not in chosen combinationto add to path

和手段で上付き文字がありませんfor all k>=2 that is valid for binomial coefficient。したがって、合計の最後の有効なnullでない項は、 に対するものになります。最初の都市に接続する都市の。最初の都市に接続する都市があります。最後に、この項を合計に追加します。k=n−1

(n−1n−2)⋅(n−2)⋅1
n−1

数式を変換して、Held-Karpウィキペディアのページにもある指定した形式に変換し ます。

∑k>=2(n−1k−1)⋅(k−1)⋅((n−1)−(k−1))=∑k>=2(n−1)!(k−1)!(n−k)!⋅(k−1)⋅(n−k)=∑k>=2(n−1)!k!(n−1−k)!⋅k⋅(k−1)=∑k>=2(n−1k)⋅k⋅(k−1)
二項係数を操作すると、次のようになり: したがって、最初の操作の数フェーズは
∑k>=2(n−1k)⋅k⋅(k−1)=∑k>=2(n−1)!k!(n−1−k)!⋅k⋅(k−1)=∑k>=2(n−3)!(k−2)!(n−3−(k−2))!⋅(n−1)⋅(n−2)=(n−1)⋅(n−2)∑k>=2(n−3k−2)=(n−1)⋅(n−2)⋅2n−3
(n−1)⋅(n−2)⋅2n−3+(n−1)

第二段階

第2フェーズでは、距離の計算と同時に、第1フェーズで作成したマークによって最適なパスを復元します。

「のcombination of k cities ANDのためのend-point city from this combination」最適なパスごとに、最後から2番目の都市を保存しました。

最適な経路を後戻りするために私たちは「のために最後から2番目の都市を返すために、いくつかのデータ構造を依頼する必要があるcombination of k cities とのためにend-point city from this combination」。したがって、このデータ構造はのようなものでなければなりません
Map<combination of k cities, Map<last city, second-to-last city>>。combination of k citiesたとえば、のインデックスとして使用できますbinary_string[city id]=1 if city id is in combination。したがって、のすべての要素を調べてcombination of k cities、データ構造の組み合わせとインデックスを特定する必要があります。これにより、第2フェーズの操作数が得られ。

∑k>=2n−1k=(n)(n−1)2−1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.