はじめに
QAOAというアルゴリズムは量子断熱過程を利用し、二つのハミルトニアンを交換して計算をします。QAOAでは、初期ハミルトニアンを制約をかけたmixerとして使えます。
mixerにXYmixerとして、(XX+YY)/2を設定します。
通常は
「簡単な問題」
から
「難しい問題」
にいきますが、
逆に
「難しい問題」
から
「簡単な問題」
をやってみてできるかどうかやってみました。
問題
このような感じでハミルトニアンを設定し、やってみます。
from blueqat import Circuit
from blueqat import vqe
from blueqat.pauli import X,Y,Z
h = 5*Z[0]-2*Z[0]*Z[1]
step = 2
init = Circuit().h[0].cx[0,1].x[0]
mixer = 0.5*X[0]*X[1] + 0.5*Y[0]*Y[1]
result = vqe.Vqe(vqe.QaoaAnsatz(h,step,init,mixer)).run()
print(result.most_common())
print(result.circuit)
結果は、
(((1, 0), 0.9970150121543512),)
Circuit(2).h[0].cx[0, 1].x[0].cx[0, 1].rz(39.00633185153547)[1].cx[0, 1].rz(-97.51582962883867)[0].h[0].h[1].cx[0, 1].rz(-8.988636280080764)[1].cx[0, 1].h[0].h[1].rx(-1.5707963267948966)[0].rx(-1.5707963267948966)[1].cx[0, 1].rz(-8.988636280080764)[1].cx[0, 1].rx(1.5707963267948966)[0].rx(1.5707963267948966)[1].cx[0, 1].rz(34.522866650015565)[1].cx[0, 1].rz(-86.30716662503892)[0].h[0].h[1].cx[0, 1].rz(-8.64561683891384)[1].cx[0, 1].h[0].h[1].rx(-1.5707963267948966)[0].rx(-1.5707963267948966)[1].cx[0, 1].rz(-8.64561683891384)[1].cx[0, 1].rx(1.5707963267948966)[0].rx(1.5707963267948966)[1]
こうなりました。
逆再生
できるはずです。出た答えの|10>状態をXゲートで作ってからQAOAを逆再生し、|00>に戻るかやってみます。
result2 = (Circuit().x[0] + result.circuit.dagger()).m[:].run(shots=100)
print(result2)
Counter({'00': 100})
無事戻りました!当たり前ですが、ハミルトニアンの交換を逆にしても大丈夫ですね。