Goemans-Williamson Algorithmを理解したい
この記事はJij Advent Calendar 2024の6日目の記事です.
QAOAやQuantum Annealingでは,イジングモデルでかけるという理由で,例題でよくMaxcut問題を扱うことが多い.その時に,性能のベースラインとしてよく使われるのが,Goemans-Williamson Algorithmである.このアルゴリズムはそれ自体が非常に面白いので,この記事はGoemans-Williamson Algorithmについて自分が勉強したまとめである.
Maxcut問題
Maxcut問題は,無向グラフ
例えば,以下の左の図のようなグラフが与えられたとする.
右の図のようにノードを塗り分ける(組を作る)ことで,ほとんどの隣り合うノードが別の組に入る分け方が実現できることがわかる.
Maxcut問題は,以下のように定式化することができる.
ノード
このとき,エッジの両端
この性質を用いると,次の数理モデルを作ることができる.
ここで係数の
Goemans-Williamson Algorithm
Goemans-Williamson Algorithm(GW)は,Maxcut問題に対する近似アルゴリズムの一つである[1].このアルゴリズムについては,[2-4]に良い説明があるので,そちらを読む方が有意義かなとは思う.ここでは,[2-4]をベースにして,このアルゴリズムを説明しようと思う.
GWは,
- 問題(1)に対する適当な緩和問題を作る
- 緩和問題の解をうまく丸めて元の問題の解になるようにする
という二つのステップで構成されている.
緩和問題の作成
まずは,問題(1)をベクトル計画問題に緩和した問題を考える.
ベクトル計画問題は,変数がベクトル
問題(1)をベクトル計画問題に緩和した問題は,次のように記述することができる.
問題(1)のどんな実行可能解
また,この問題は
次に,上記のベクトル計画問題をさらに半正定値計画問題に変換する.
上記のベクトル計画問題では,変数は内積
以上から,ベクトル計画問題(2)を半正定値計画問題へと変換した結果得られる問題は,
とかける.ここで,
この半正定値計画は内点法などを用いることで多項式時間で解くことができる.
実際に,上記の半正定値計画問題をソルバーで解きやすくするために標準形に持っていく.
これにはグラフラプラシアン
グラフラプラシアン
と書き直すことができる.
ここでは,上で挙げた簡単な例を解いてみることにする.
import networkx as nx
G = nx.Graph()
G.add_nodes_from([0, 1, 2, 3, 4])
G.add_edges_from([(0, 1), (0, 4), (1, 2), (1, 3), (2, 3), (3, 4)])
pos = {0: (1, 1), 1: (0, 1), 2: (-1, 0.5), 3: (0, 0), 4: (1, 0)}
nx.draw(G, pos, with_labels=True)
グラフラプラシアンは
L = nx.laplacian_matrix(G, nodelist=list(range(5))).todense()
で得ることができる.
さて,これをソルバーで解いてみよう.
ここでは,cvxpy
で実装して,それに付随しているソルバーで解くことにする.
import cvxpy as cp
Y = cp.Variable((5, 5), PSD=True)
constraints = [cp.diag(Y) == 1]
problem = cp.Problem(cp.Maximize(cp.trace(L @ Y) / 2.0), constraints)
problem.solve()
で解くことができる.
ラウンディングアルゴリズム
問題(3)の半正定値計画の解は得られたとして,次にこの解をどのように元の問題の解に戻すのかを考えよう.
得られた解
U, singular_values, Vh = np.linalg.svd(Y.value)
V = (U @ np.diagflat(np.sqrt(singular_values))).T
さて,ベクトル計画問題(2)の最適解
二つのベクトル
よって,ベクトル計画問題の目的関数は,
となる.この目的関数を最大化するには,
そこで,以下の方法で,indexの集合を分類することにする.
初めに
この
この方法についてもう少し詳しく述べよう.
-
かつ\bm{u}_i\cdot \bm{r}\geq 0 \bm{u}_j\cdot \bm{r}\leq 0 -
かつ\bm{u}_i\cdot \bm{r}\leq 0 \bm{u}_j\cdot \bm{r} \geq 0
のどちらかの場合である.
ここで,
つまり,
実際に,この方法で,(1)の解を得てみよう.
r = np.random.normal(size = (5,))
r /= np.linalg.norm(r)
cut = np.ones((5, 1))
for i in range(5):
cut[i] = -1 if r @ V[:, i] <= 0 else 1
ちなみに,実際に得られた結果をプロットしたのが,冒頭に載せた右の図である.
近似率について
さて,最後に近似率について簡単に議論しておこう.
まず初めに,カットされた重みの期待値
である.
ここで,天下り的だが,
で与えられるとしよう.
この定義から
が成り立つ.これを代入すると,
となる.右辺はベクトル計画問題(2)の最適値
が成り立つ.これはアルゴリズムの解の精度と最適値の比に対して,
よって,GWの近似率は
最後に
Jijでは数理最適化・量子コンピュータに関連するソフトウェア開発を行っています。
OSSも複数開発、提供しています。Discordのコミュニティへぜひ参加してください!
また,Jijでは各ポジションを絶賛採用中です!
ご興味ございましたらカジュアル面談からでもぜひ!ご連絡お待ちしております。
数理最適化エンジニア(採用情報)
量子コンピューティングソフトウェアエンジニア(採用情報)
Rustエンジニア(アルゴリズムエンジニア)(採用情報)
研究チームPMO(採用情報)
オープンポジション等その他の採用情報はこちら
参考文献
[1]Michel X Goemans and David P Williamson. “Improved approximation algorithms for maximum
cut and satisfiability problems using semidefinite programming”. In: Journal of the ACM (JACM)
42.6 (1995)
[2]Vijay V Vazirani. Approximation algorithms. Vol. 1. Springer, 2001.
[3]David P Williamson and David B Shmoys. The design of approximation algorithms. Cambridge
university press, 2011.
[4]Matsui Tomomi. “OR 研究の最前線 半正定値計画を用いた最大カット問題の.878 近似解法”. In:
オペレーションズ・リサーチ = Communications of the Operations Research Society of Japan: 経
営の科学 45.3 (Mar. 2000)
Discussion