以前blueqatで組み合わせ最適化問題を実装しました(blueqatの記事はこちら)が、今回はQiskitで実装していきたいと思います。この記事は実装方法の確認を目的としているため、組み合わせ最適化問題自体は簡単なものを取り扱いたいと思います。
解く問題
解く問題は以前と同じです。以下のハミルトニアン$H$が最小となる$q(0)$、$q(1)$の組み合わせを求めます。
$$
H = 1 - q(0) - q(1)
$$
なお、$q(0)$、$q(1)$は0もしくは1のどちらかの値となります。この問題設定では、$q(0)=q(1)=1$のときハミルトニアン$H=-1$で最小値となります。
補足情報
ちなみに、すべての$q(0), q(1)$の組み合わせについてハミルトニアンは以下の値となります。
- $q(0)=0,q(1)=0 \rightarrow H = 1$
- $q(0)=0,q(1)=1 \rightarrow H = 0$
- $q(0)=1,q(1)=0 \rightarrow H = 0$
- $q(0)=1,q(1)=1 \rightarrow H = -1$
実行環境について
Google Colabratoryで実行します。Qiskitのバージョンは「0.14.1」となります。
ソースコード
Qiskitをインストール
pip install qiskit
Qiskitの必要パッケージのインポート
from qiskit import BasicAer
from qiskit.aqua.algorithms import QAOA
from qiskit.optimization.algorithms import MinimumEigenOptimizer
from qiskit.optimization import QuadraticProgram
変数、ハミルトニアンの定義
qubo = QuadraticProgram()
#バイナリ変数定義
qubo.binary_var('q0')
qubo.binary_var('q1')
# ハミルトニアン定義
qubo.minimize(linear=[-1,-1],constant=1.0)
print(qubo.export_as_lp_string())
変数、ハミルトニアンの定義結果は以下の通りです。
\ This file has been generated by DOcplex
\ ENCODING=ISO-8859-1
\Problem name: CPLEX
Minimize
obj: - q0 - q1 + 1
Subject To
Bounds
0 <= q0 <= 1
0 <= q1 <= 1
Binaries
q0 q1
End
QAOAで定義したハミルトニアンを解きます。
# MinimumEigensolverの初期化
qaoa_mes = QAOA(quantum_instance=BasicAer.get_backend('statevector_simulator'))
# Optimizerの作成
qaoa = MinimumEigenOptimizer(qaoa_mes)
#QAOA計算/結果出力
qaoa_result = qaoa.solve(qubo)
print("QAOA result:")
print(qaoa_result)
実行結果は以下の通りです。
QAOA result:
x=[1.0,1.0], fval=-1.0
うまく解を求めることができました!
実装してみた感想
実装してみた感想は「書きにくい・・・」です。特に違和感があるのは、ハミルトニアン定義部分です。バイナリ変数q0、q1をSympyのSymbolみたいに扱えると思っていたんですが、そうじゃなさそうです。
最後に
Qiskitでのもっといい実装方法があれば教えてください。個人的にあまりスマートじゃないなーと思っているので。