私はこれが本の中であまり明確ではないことに同意します(読者がすぐに遭遇するので、これは少し残念です-私の版の7ページ)。
ここでの難しさは、最近接ペア ヒューリスティック自体にあるとは思いません。重要なのは、ヒューリスティック自体が問題の解決策ではないことに注意することです! 本で完全に説明されていないアルゴリズムの一部 (おそらく最も重要な部分) のみ (おそらく、これは間違ったアルゴリズムとして意図されているため)。ヒューリスティックを使用すると、接続する必要がある頂点のペアを取得できますが、接続する順序は取得できません。そのためには、さらに何かが必要です。
完全を期すために、ここに本の問題文があります
問題: ロボット ツアーの最適化
入力: 平面上のn点の集合S
出力: セットS内の各ポイントを訪れる最短のサイクル ツアーは?
現在、最も近いペアのヒューリスティックは、本で定義され、ここで引用されているように、ツアー自体ではなく、接続のセット/リストのみを提供するため、必要なソリューションではありません。ツアーを取得するには、さらに何かを行う必要があります。この戦略を使用した全体的な (欠陥のある!) ソリューションは、次のようになります。
1) Initialize the output list of vertexes to visit as the empty list (call it RET).
2) Obtain the list of connections (vertex pairs) given by ClosestPair (let it be L)
3) If L is empty, jump to 12
4) Remove an arbitrary connection from L (call it C1).
5) Choose an arbitrary vertex from C1 (call it V1)
6) Append V1 to RET
7) Remove from L the other connection that contains V1 (call it C2)
8) Choose the other vertex from that connection (call it V2)
9) append V2 to RET
10) Set V1=V2
11) If L is not empty, jump back to 7
12) return RET
または疑似コードで
Alg(P): # P is the input set of points
RET = []
L = ClosestPairs(P)
if(L.empty()):
return RET
C1 = L.getAndRemoveRandomElement()
V1 = C1.getRandomVertex()
RET.append(V1)
while(!L.empty()):
C2 = L.getAndRemoveElementContaining(V1)
V2 = C2.getTheOtherVertex(V1)
RET.append(V2)
V1 = V2
return RET