NISQは飽きた(大した計算ができない)ので、汎用量子計算に移行します。ということで、おさらいをします。汎用計算でもイジングモデルを利用した組合せ最適化に取り掛かりたいと思います。
1、時間発展
基本的にNISQで組合せ最適化問題を解く時には、QAOAという変分アルゴリズムを使いますが、汎用量子コンピュータでは、変分原理に応じて最適化パラメータ化せずに、時間発展という手法でスケジュールを決めて、パラメータを決めて計算します。
2、定式化
定式化は2種類あります。ハミルトニアンと呼ばれる式を作りますが、解きたい問題のイジングハミルトニアンと探索の方法を決めるドライバーハミルトニアンがあります。文献やウェブサイトでは、解きたい問題のいじんぐハミルトニアンの作り方は最近よく出てきますが、ドライバーハミルトニアンの使い方はあまり出てこなさそうですね。
3、量子断熱時間発展
上記のハミルトニアンを決めたら、ドライバーハミルトニアンに対応する固有状態を準備します。そして、量子断熱時間発展と呼ばれる計算をします。二つのハミルトニアンをスケジュールに応じて入れ替えながら計算をします。計算をすることで状態ベクトルが変化し、最適解の状態ベクトルの要素の振幅が大きくなります。
4、参考計算確認
時間発展計算を確認してみます。
参考
https://qiita.com/gyu-don/items/c51a9e3d5d16a6d5baf6
今回はXYmixerをドライバーとして、初期状態を|01>と|10>の重ね合わせからスタートします。そして、ドライバーをXYmixerを使って適当な問題でやっていきます。
from blueqat import Circuit, pauli, vqe
from blueqat.pauli import qubo_bit as q
from math import pi
import numpy as np
def an(index):
return 0.5 * pauli.X[index] + 0.5j * pauli.Y[index]
def cr(index):
return 0.5 * pauli.X[index] - 0.5j * pauli.Y[index]
op = (cr(1) * an(0) + cr(0) * an(1)).to_expr().simplify()
print(op)
x = []
y00 = []
y01 = []
y10 = []
y11 = []
evos = [term.get_time_evolution() for term in op.terms]
for i in range(100):
c = Circuit().h[0].cx[0, 1].x[1]
for evo in evos:
evo(c, i / 100 * pi)
c.rz(i / 100 * pi)[1]
for evo in evos:
evo(c, i / 100 * pi)
c.rz(i / 100 * pi)[1]
state = c.run()
_a, _b, _c, _d = list(np.abs(state) ** 2)
x.append(i)
y00.append(_a)
y10.append(_b)
y01.append(_c)
y11.append(_d)
import matplotlib.pyplot as plt
plt.plot(x, y00, label='|00>')
plt.plot(x, y10, label='|10>')
plt.plot(x, y01, label='|01>')
plt.plot(x, y11, label='|11>')
plt.legend()
plt.show()
こうなりました。これはシミュレーションなので、最大化は特にしていませんが、10と01の振幅が変化しているのがわかります。今回は量子重ね合わせを使って初期状態が準備され、mixerとして01と10の入れ替えが行われているので、00と11は最初から解として除外されて、組合せ最適化が時間発展されています。
ハミルトニアンの作り方やドライバーの作り方、スケジュールや時間発展演算子の扱いなどいろいろなところを考慮する必要があり、QAOAよりも発展性がありそうなので楽しみです。以上です。