クイックスタート¶
インストール¶
量子コンピュータを活用する機能は Amplify SDK のアドオンとして提供されています。利用するには次のコマンドで追加のパッケージを含めてインストールして下さい。
$ python3 -m pip install -U 'amplify[extra]'
正しくインストールされると、次のようにして量子コンピュータ利用の機能が利用できます。
>>> from amplify import QAOA
extra のインストールが不足している場合には以下のようなエラーが表示されます。
ImportError: To enable quantum functions, install the required extras with: `python3 -m pip install -U 'amplify[extra]'`
次の環境において動作を確認しています。
3.10
3.11
3.12
3.13
Windows 10/11
Linux
Ubuntu 22.04/24.04, Rocky Linux 9.6/10.0
x86_64
macOS
ARM64 (Monterey 以降)
Pythonのバージョン, OSによっては依存パッケージのインストールに失敗する可能性があります。
注意
Amplify SDK の動作確認済み環境とは異なり、以下の環境では動作しない可能性があります。
3.14
Linux
Ubuntu 26.04
ARM64
macOS
x86_64 (Monterey 以降)
量子コンピュータでの求解¶
注意
量子アニーリングマシンを使った求解についてはD-Wave Systemsを参照して下さい。
クラウドサービスとして提供されている各種量子コンピュータ及び、ローカルシミュレータを利用して組合せ最適化問題を解くことができます。ここでは、量子回路を実行するデバイスとして、ローカルシミュレータであるQiskit Aer Simulatorと量子最適化アルゴリズムであるQAOAを使います。
1. 組合せ最適化モデルの作成¶
サンプル問題として次を考えます。Amplify SDKによる定式化の説明はAmplify SDK クイックスタートを参照してください。
- 目的関数
- \[ \text{minimize:} \quad f = q_0 q_1 + q_0 - q_1 + 1 \]
- 決定変数
- \[ q_0, q_1 \in \{0, 1\} \]
- 制約条件
- \[ \text{None} \]
>>> from amplify import Model, VariableGenerator
>>> g = VariableGenerator() # 決定変数のジェネレータを作成
>>> q = g.array("Binary", 2) # 決定変数を定義
>>> f = q[0] * q[1] + q[0] - q[1] + 1 # 目的関数を定義
>>> model = Model(f) # モデルを作成
2. ソルバークライアントの作成¶
今回は回路の実行に Qiskit Aer Simulator を使用して QAOA による最適化を行うため、Qiskit Aer Simulatorのクライアントクラス (AerClient)と QAOA のアルゴリズムクラス (QAOA) を利用してソルバークライアントを作成します。
>>> from amplify import QAOA, AerClient
>>> client = AerClient(QAOA) # QAOA と Qiskit Aer Simulator の組み合わせを選択
加えて、QAOAの回路の深さを 2 、最適化ステップ毎の測定回数を 1000 にそれぞれ設定します。
>>> client.parameters.reps = 2 # QAOAのAnsatz回路の深さを 2 に設定
>>> client.parameters.shots = 1000 # QAOAの各最適化ステップにおける測定回数を 1000 に設定
他のクライアント同様に solve() 関数を用いてソルバーを実行し、QAOAによる最適化を行えます。
>>> from amplify import solve
>>> result = solve(model, client) # QAOA を実行
3.結果の確認¶
実行結果は Result クラスのインスタンスとして返されます。このインスタンスにはソルバーを実行した結果や行われたモデルの変換情報などが含まれます。best プロパティを呼び出すことで得られた解のうち最も良い解を取得できます。結果の取得のより詳細については7. 組合せ最適化問題の求解 - 結果の取得を参照してください。
>>> result.best.objective # 目的関数の値
0.0
>>> result.best.values # 変数の値
Values({Poly(q_0): 0, Poly(q_1): 1})
- 量子回路の取得:
古典最適化の各ステップで実行された量子回路は history 経由で取得できます。
>>> # サンプリングに利用した量子回路を表示
>>> print(result.client_result.history[0].sampling_meta.circuit)
...
クライアントによって回路オブジェクトの型は異なります。AerClientでは qiskit.circuit.QuantumCircuitになります。詳細は各クライアントのページを参照して下さい。
- 最終測定の結果の取得:
最適化されたパラメータ \(\boldsymbol{\theta}^{\textup{opt}}\) で実施された最終測定の結果は optimized_counts で取得できます。各要素は「イジング列 (\(\{-1, 1\}\) 値) と出現回数のタプル」であり、出現回数が多いイジング列ほど最適解の有力な候補です。
>>> # 最適パラメータでの測定結果を出現回数の降順で表示
>>> for ising_seq, freq in sorted(result.client_result.optimized_counts, key=lambda x: x[1], reverse=True):
>>> print(f"イジング列: {ising_seq}, 出現回数: {freq}")
イジング列を元の決定変数配列に変換する方法や分布の解釈については、最良パラメータでの測定結果 を参照して下さい。
次のステップ¶
量子コンピュータへの接続方法の詳細は量子コンピュータを参照して下さい。
各アルゴリズムでの求解、詳細な結果の取得についてはQAOA, Recursive QAOAを参照して下さい。