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

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

量子断熱時間発展計算

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

$$ H\lvert \psi \rangle = E_0 \lvert \psi \rangle $$

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

例題

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

$$ H = 2q_1-4q_0q_1 $$

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

!pip install -U blueqat
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))

これで解けました。

次に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))

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

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

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

result.circuit

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

import numpy as np

# 状態ベクトルvecを用意
vec = np.array([0, 1, 1, 0]) / np.sqrt(2)

# True: 正規化されている
np.allclose(np.vdot(vec, vec), 1)

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

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

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

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

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

そして、先ほどの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)

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

Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Comments
Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Related posts

blueqat Inc.

Shibuya Scramble Square 39F 2-24-12, Shibuya, Shibuya-ku, Tokyo
Contact: info@blueqat.com