らんだむな記憶

blogというものを体験してみようか!的なー

Qiskit (53) —量子断熱計算と QAOA / イジング模型と QUBO

量子断熱計算。textbook で一番近そうなのは Solving combinatorial optimization problems using QAOA と思われる。
ネタ的には量子アニーリングっぽいけど、ゲート方式での説明になっているから、量子アニーリングの基礎 / 須藤 彰三 岡 真 監修 西森 秀稔 大関 真之 著 | 共立出版 と見比べてもよく分からなかった。量子コンピューティング 基本アルゴリズムから量子機械学習まで | Ohmsha pp.148-154 も関連するが、もっと難しくさえ見える。イジング変数は $\sigma_i \in \{-1, 1\}$ であったが、QUBO とかでは変数 $x_i \in \{0, 1\}$ のようなので、等価だけど表現が違う・・・という感じなのかな?という理解・・・。

付属のコードは色々試したが、最新の Qiskit 環境では qaoa.solve(qubo) の実行でうまく動作しなかった。結局のところ、モジュールのアップデートが激しくてコードが obsolete な状態になっているようだった。公式のドキュメント Minimum Eigen Optimizer — Qiskit Optimization 0.3.1 documentation を参考にレガシーな記述を更新して回るしかない。或いは、Qiskit Algorithms 移行ガイド — Qiskit 0.26.1 ドキュメント も参考になるかもしれない。

qiskit                        0.34.2
qiskit-aer                    0.10.3
qiskit-aqua                   0.9.5
qiskit-ibmq-provider          0.18.3
qiskit-ignis                  0.7.0
qiskit-optimization           0.3.1
qiskit-terra                  0.19.2
qiskit-textbook               0.1.0

[qaoa1]

import numpy as np
from qiskit_optimization import QuadraticProgram

from qiskit import Aer
from qiskit.utils import QuantumInstance
from qiskit.algorithms import QAOA, NumPyMinimumEigensolver
from qiskit_optimization.algorithms import MinimumEigenOptimizer

qubo = QuadraticProgram()
qubo.binary_var('q0')
qubo.binary_var('q1')
qubo.binary_var('q2')
q = np.zeros((3, 3))
q[1, 1] = 2
q[2, 2] = -1
q[0, 1] = -4
q[1, 2] = 3
qubo.minimize(quadratic=q)
print(qubo)

quantum_instance = QuantumInstance(Aer.get_backend('statevector_simulator'))
qaoa_mes = QAOA(quantum_instance=quantum_instance, initial_point=[0.0, 0.0])
qaoa = MinimumEigenOptimizer(qaoa_mes)
qaoa_result = qaoa.solve(qubo)
print(qaoa_result)

で求める結果が得られた。qaoa2 も動作しないが、同様に地道に手直しすればいけるのだと思う・・・。

GitHub - Qiskit/qiskit-aqua: Quantum Algorithms & Applications (**DEPRECATED** since April 2021 - see readme for more info) を見れば分かるように、

Qiskit Aqua (NOW DEPRECATED)

なので、qiskit.aqua から import しているもののお引っ越し先を探さないとならない・・・。Migration by package/class が一応参考になりそうだけど、分からないやつ(例えば from qiskit.aqua.components.initial_states import Custom)もある。

よく分からないので、$\hat{H}_{final} = 2 q_1 - q_2 - 4 q_0 q_1 + 3 q_1 q_2$ の最小化を眺めただけだけど、Qiskit での書き方は分かったような気がするので、一気に p.209 まで完了とする・・・。