量子断熱計算。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 も動作しないが、同様に地道に手直しすればいけるのだと思う・・・。
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 まで完了とする・・・。