common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

Blueqat 0.4.1の状態ベクトル指定機能を使ったQAOA

Yuichiro Minato

2021/03/14 01:35

#量子ゲート

こんにちは、量子コンピュータで組合せ最適化問題を解くときには、量子もつれを作るのが大変ですよね。今回はシミュレータ限定の機能ですが、状態ベクトルを指定できるblueqat0.4.1の状態ベクトル指定機能を使った最適化計算をしてみます。

量子断熱時間発展計算

QAOAという手法を使うことによって組合せ最適化問題を解くことができます。量子断熱時間発展計算を組合せ最適化に応用する際には固有値問題を解きますが、二つのハミルトニアンの固有状態を入れ替えることによって実現します。

Hψ=E0ψH\lvert \psi \rangle = E_0 \lvert \psi \rangle

これらのハミルトニアンの入れ替えは、時間発展演算子を利用して行うことができます。blueqatにはもともとQAOAを実行するためのモジュールが搭載されています。詳しくはこちらを。 https://blueqat.com/yuichiro_minato2/6b55bf5d-e38f-4091-8ede-1d431c47cbbd

例題

下記のようなハミルトニアンを解いてみます。

H=2q14q0q1H = 2q_1-4q_0q_1

これをQAOAで解くには簡単です。

!pip install -U blueqat
Requirement already up-to-date: blueqat in /opt/conda/lib/python3.8/site-packages (0.4.1)

Requirement already satisfied, skipping upgrade: numpy~=1.12 in /opt/conda/lib/python3.8/site-packages (from blueqat) (1.19.1)

Requirement already satisfied, skipping upgrade: scipy>=1.1.0 in /opt/conda/lib/python3.8/site-packages (from blueqat) (1.4.1)
from blueqat import vqe from blueqat.pauli import qubo_bit as q h = 2*q(1)-4*q(0)*q(1) step = 2 result = vqe.Vqe(vqe.QaoaAnsatz(h, step)).run() print(result.most_common(12))
(((1, 1), 0.9860565903728655), ((0, 0), 0.00889310546028347), ((1, 0), 0.002827633674376718), ((0, 1), 0.002222670492473824))

これで解けました。

次にmixer

mixerといって探索方法を変えてみます。mixertとそれに対応する初期状態を準備します。

from blueqat import Circuit from blueqat.pauli import X, Y, Z, I #mixer and init state mixer = 0.5*X[0]*X[1] + 0.5*Y[0]*Y[1] init = Circuit().h[0].cx[0,1].x[0] h = 2*q(1)-4*q(0)*q(1) step=2 result = vqe.Vqe(vqe.QaoaAnsatz(h, step, init, mixer)).run() print(result.most_common(12))
(((1, 0), 0.9999999999999982), ((0, 1), 9.423425026165962e-24), ((0, 0), 3.8518598887749797e-32), ((1, 1), 2.7733391199176196e-32))

上記の初期状態は01と10のもつれ状態でした。これが3量子ビットになると難しくなります。さらに4量子ビットの重ね合わせとなるとさらに難しくなります。これらを簡単に処理するには、初期状態を簡単に準備する必要がありますが、これをゲートの組合せで書くのは結構大変です。上記のもつれ回路は、

Circuit().h[0].cx[0,1].x[0]
Circuit(2).h[0].cx[0, 1].x[0]

で書かれていました。また、QAOAの回路は、

result.circuit
Circuit(2).h[0].cx[0, 1].x[0].cx[0, 1].rz(53.25395365275599)[1].cx[0, 1].rz(-53.25395365275599)[0].h[0].h[1].cx[0, 1].rz(41.8426392831675)[1].cx[0, 1].h[0].h[1].rx(-1.5707963267948966)[0].rx(-1.5707963267948966)[1].cx[0, 1].rz(41.8426392831675)[1].cx[0, 1].rx(1.5707963267948966)[0].rx(1.5707963267948966)[1].cx[0, 1].rz(76.90434407245218)[1].cx[0, 1].rz(-76.90434407245218)[0].h[0].h[1].cx[0, 1].rz(-13.282324298900074)[1].cx[0, 1].h[0].h[1].rx(-1.5707963267948966)[0].rx(-1.5707963267948966)[1].cx[0, 1].rz(-13.282324298900074)[1].cx[0, 1].rx(1.5707963267948966)[0].rx(1.5707963267948966)[1]

となっていました。これを新機能を追加して書きなおしてみます。

import numpy as np # 状態ベクトルvecを用意 vec = np.array([0, 1, 1, 0]) / np.sqrt(2) # True: 正規化されている np.allclose(np.vdot(vec, vec), 1)
True

正規化されていることを確認して、状態ベクトルに01と10のもつれを準備しました。まずはこれをそのまま実行してみると、

#初期の状態ベクトルを指定して計算します。 Circuit(2).m[:].run(shots=100, initial=np.array([0, 1, 1, 0])/np.sqrt(2))
Counter({'10': 53, '01': 47})

きちんともつれ回路が実行できました。状態ベクトルだけを見てみても、

Circuit(2).run(initial=np.array([0, 1, 1, 0])/np.sqrt(2))
array([0.        +0.j, 0.70710678+0.j, 0.70710678+0.j, 0.        +0.j])

きちんと実行できているのが確認できます。

そして、先ほどのQAOA回路のansatzを実行します。初期のもつれ回路を外した回路に、初期状態ベクトルを入力とした回路につなげてみると(途中RzzやRxxに短く書き直している部分があります)、

c = Circuit(2).rzz(28.48504526568177)[0,1].rz(-28.48504526568177)[0].rxx(-13.395826737916892)[0,1].rx(-1.5707963267948966)[0].rx(-1.5707963267948966)[1].rzz(-13.395826737916892)[0,1].rx(1.5707963267948966)[0].rx(1.5707963267948966)[1].rzz(29.964021341813513)[0,1].rz(-29.964021341813513)[0].rxx(-9.00039424636803)[0,1].rx(-1.5707963267948966)[0].rx(-1.5707963267948966)[1].rzz(-9.00039424636803)[0,1].rx(1.5707963267948966)[0].rx(1.5707963267948966)[1].m[:] c.run(shots=1000, initial=vec)
Counter({'10': 918, '01': 82})

このようになりました。これは、半々で出るはずの01と10から、時間発展で最適化問題を解いているために、10という答えが優先してサンプルが多く出ています。このように、QAOAを状態ベクトルスタートでできました。これによってより大きな問題でも効率的にシミュレーションテストできるようになり、30量子ビット程度の問題でも効率的に組合せ最適化の実装ができるようになります。ぜひやってみてください。今回は以上です。

© 2024, blueqat Inc. All rights reserved