もういろいろ面白すぎですね。今日は組合せ最適化問題をVQEで解く際に、複数基底(軸を用いた) Multi-Basis Encoding (MBE) を確認します。これによってVQEで組合せ最適化問題を解く際には、必要量子ビット数が半分になります。
Variational Quantum Optimization with Multi-Basis Encodings
(https://arxiv.org/pdf/2106.13304.pdf)[https://arxiv.org/pdf/2106.13304.pdf]
考えかたは非常にシンプルです。量子コンピュータの量子ビットのうち通常はZ軸のみを使って離散最適化をしますが、それをX軸も利用し、1量子ビットで2軸を使います。量子機械学習では一般的な方法ですが、離散最適化のハミルトニアンを工夫することで離散最適化でも利用できます。
問題はQUBOで実装をし、ハミルトニアンを改造してZとXの相互作用を操作します。仕組みを見てみましょう。
import networkx as nx
import matplotlib.pyplot as plt
#適当なグラフを見てみます。
G = nx.Graph()
edges = [(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(2,3),(2,4),(2,5),(2,6),(2,7),(3,4),(3,5),(3,6),(3,7),(4,5),(4,6),(4,7),(5,6),(5,7),(6,7)]
G.add_edges_from(edges)
#描画します
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos)
<Figure size 432x288 with 1 Axes>
普通はこんな感じです。が、このノードを半分を軸を変えて実装をします。
#適当なグラフを見てみます。
G = nx.Graph()
edges = [(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(2,3),(2,4),(2,5),(2,6),(2,7),(3,4),(3,5),(3,6),(3,7),(4,5),(4,6),(4,7),(5,6),(5,7),(6,7)]
G.add_edges_from(edges)
#描画します
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos, node_color = [0,0,0,0,1,1,1,1])
<Figure size 432x288 with 1 Axes>
どこで色を分けるかは適当で大丈夫です。さて、ここで軸をXZ利用します!そうすると、、、
#適当なグラフを見てみます。
G = nx.Graph()
edges = [("0&4","1&5"),("0&4","2&6"),("0&4","3&7"),("1&5","2&6"),("1&5","3&7"),("2&6","3&7")]
G.add_edges_from(edges)
#描画します
pos = nx.circular_layout(G)
nx.draw_networkx(G, pos)
<Figure size 432x288 with 1 Axes>
なんとノードが半分に減りました!驚くのは早いです。現論文は、、、、
#適当なグラフを見てみます。
G = nx.Graph()
edges = [("0&4","1&5"),("0&4","3&7"),("1&5","2&6"),("2&6","3&7")]
G.add_edges_from(edges)
#描画します
nx.draw_networkx(G)
<Figure size 432x288 with 1 Axes>
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?????
グラフの全結合がローカル結合に!
これぞテンソルネットワークの力。全結合のエンタングルメントをMPSに変換し隣接の結合次元で処理しています。
最後にハミルトニアンを見てみましょう。
コストハミルトニアンがやばいことになってます。軸をまたいでグラフ接続が生まれるので、ZX相互作用がでます。これで1量子ビットの2軸を使った複数基底のグラフ問題実装ができました。QAOAで解く方法イメージつきませんが、実際にはこれをVQEで解いてしまします。NVIDIAのcuQuantumでは1600量子ビット、3500ノード程度のmaxcutがとけているようです。以上です。