跳到主要内容

名古屋工業大学 工学研究科 工学専攻 情報工学系 2024年度 計算機ソフトウェア(データ構造とアルゴリズム)

Author

GPT-5.6 Sol, 祭音Myyura

Description

ある組合せ最適化問題に関する次の問いに答えよ。時間計算量は漸近的に評価する。

各辺に非負の実数値の重みが定義された完全無向グラフが与えられたとき、すべての頂点を巡回して出発点へ戻る最短の単純閉路を求めたい。この問題は (A) 問題 と呼ばれる。頂点数を nn とすると、時計回りと反時計回りを区別した巡回路の組合せ総数は (B) である。各巡回路を試す時間が nn に比例するとき、全巡回路の試行に要する時間は O((C))O(\text{(C)}) となる。

以下では、各辺の重みが頂点間のユークリッド距離であり、三角不等式を満たす (A) 問題を Euc-P と書く。Euc-P に対し、次の近似アルゴリズム Approx-P-Tour を考える。

STEP 1: 完全無向グラフの最小全域木 T を構成する。
STEP 2: 任意の頂点を始点として T 上で深さ優先探索を行い、
初回訪問順に全頂点を一度ずつ巡回して始点へ戻る単純閉路を得る。

STEP 1 では Kruskal のアルゴリズムを用いる。グラフを G=(V,E,c)G=(V,E,c)

V={v1,v2,,vn},E={e1,e2,,em}V=\{v_1,v_2,\ldots,v_n\},\qquad E=\{e_1,e_2,\ldots,e_m\}

とする。cc は辺の重み関数である。

Min-Span-Tree(G=(V,E,c)) {
T <- empty set
for (each v in V) make-set(v)
sort(E,c) // c の昇順に e1,...,em とする
for (i = 1 to m) {
(x,y) <- ei // ei の二端点
if (find(x) != find(y)) {
T <- T union {(x,y)}
union(x,y)
}
}
}

make-set(v) {
p <- v の添字番号
parent[p] <- p
size[p] <- 1
}

find(v) {
p <- v の添字番号
while (parent[p] != p) p <- parent[p]
return p
}

union(u,v) {
p <- find(u); q <- find(v)
if (size[p] >= size[q]) {
parent[q] <- p
size[p] <- size[p] + size[q]
} else {
parent[p] <- q
size[q] <- size[q] + size[p]
}
}

(1)

空欄 (A)--(C) に適切な語句または式を入れよ。

(2)

sort(E,c) に比較に基づくソートを用いる場合、その最悪比較回数の下界を、辺数 mmΩ\Omega 記号を用いて示せ。

(3)

最小全域木 TT の辺重みの総和を WW とする。Euc-P の最適巡回路の重みの下界と、Approx-P-Tour が返す巡回路の重みの上界を、それぞれ WW を用いて具体的に示せ。

(4)

頂点 v1,v2,v3,v4v_1,v_2,v_3,v_4 からなる完全無向グラフの辺重みが次のように与えられている。

v1v2v_1v_2v1v3v_1v_3v1v4v_1v_4v2v3v_2v_3v2v4v_2v_4v3v4v_3v_4
重み885533447766

最小全域木の重み WW、Approx-P-Tour の巡回路とその重み、Euc-P の最適巡回路とその重みを求めよ。なお、次の規則を用いる。

  • eie_i の二端点のうち添字番号が小さい方を xx とする。
  • 深さ優先探索の始点は、最小全域木構成後に find(v)=v\operatorname{find}(v)=v の添字番号となる頂点 vv とする。
  • 未訪問の隣接頂点が複数あるとき、最小全域木へ辺が追加された順に探索する。

Kai

(1)

(A) は巡回セールスマン問題である。始点を一つ固定すると、残り n1n-1 頂点の訪問順は (n1)!(n-1)! 通りであり、逆向きも別の巡回路として数えるので、

(A)=巡回セールスマン,(B)=(n1)!\boxed{\text{(A)}=\text{巡回セールスマン}},\qquad \boxed{\text{(B)}=(n-1)!}

である。一つの巡回路の評価に Θ(n)\Theta(n) 時間かかるため、

n(n1)!=n!n(n-1)!=n!

より、

(C)=n!\boxed{\text{(C)}=n!}

となる。

(2)

辺重みがすべて相異なる入力に限っても、その大小順序は m!m! 通りある。比較決定木の高さを hh とすると、

2hm!,hlog2(m!)=Ω(mlogm).2^h\ge m!,\qquad h\ge \log_2(m!)=\Omega(m\log m).

したがって、最悪比較回数の下界は

Ω(mlogm)\boxed{\Omega(m\log m)}

である。

(3)

最適巡回路から任意の一辺を除くと全頂点を含む全域木になる。その重みは最小全域木の重み WW 以上であるから、最適値を OPT\mathrm{OPT} とすると、

WOPT\boxed{W\le \mathrm{OPT}}

である。

一方、最小全域木の各辺を往復する閉路の重みは 2W2W である。深さ優先探索の初回訪問順へ短絡しても、三角不等式により重みは増えない。Approx-P-Tour の値を LAL_{\mathrm{A}} とすると、

LA2W\boxed{L_{\mathrm{A}}\le 2W}

となる。

(4)

辺を重みの昇順に並べると、

(v1,v4):3,(v2,v3):4,(v1,v3):5,(v3,v4):6,(v2,v4):7,(v1,v2):8(v_1,v_4):3, (v_2,v_3):4, (v_1,v_3):5, (v_3,v_4):6, (v_2,v_4):7, (v_1,v_2):8

である。Kruskal 法は最初の三辺を採用するので、

T={(v1,v4),(v2,v3),(v1,v3)},W=3+4+5=12.T=\{(v_1,v_4),(v_2,v_3),(v_1,v_3)\},\qquad \boxed{W=3+4+5=12}.

同じ大きさの集合を併合するときは union>= 側に入り、各辺の小さい添字側を xx とするため、最終代表元は v1v_1 である。v1v_1 から追加順に深さ優先探索すると、初回訪問順は

v1,v4,v3,v2v_1,v_4,v_3,v_2

となる。したがって、近似巡回路と重みは

v1v4v3v2v1,3+6+4+8=21.v_1\to v_4\to v_3\to v_2\to v_1,\qquad 3+6+4+8=\boxed{21}.

始点を v1v_1 に固定して残り三頂点の 3!=63!=6 通りを調べると、最小は

v1v3v2v4v1v_1\to v_3\to v_2\to v_4\to v_1

とその逆向きであり、

5+4+7+3=19.5+4+7+3=\boxed{19}.

検算

プログラムで Union-Find の parentsize をそのまま実装したところ、採用辺は

(v1,v4), (v2,v3), (v1,v3)

となり、全頂点の代表元は v1v_1、DFS 順は [v1,v4,v3,v2] となった。また、六つの巡回路の重みは方向を含めて

19, 19, 21, 21, 26, 26

であり、近似値 2121 と最適値 1919 を確認した。

Reference