注釈
このページは docs/tutorials/04_grover_optimizer.ipynb から生成されました。
グローバーオプティマイザー#
はじめに#
グローバー適応探索(Grover Adaptive Search、GAS)は、変分量子固有ソルバー(Variational Quantum Eigensolver、VQE)や量子近似最適化アルゴリズム(Quantum Approximate Optimization Algorithm、QAOA)などの変分アルゴリズムとともに、組み合わせ最適化問題における可能な解決策として検討されてきました。アルゴリズムは、グローバー検索を繰り返し適用し、直前の実行までで最もよいと思われる値をしきい値として使用して、目的関数の最適値を見つけます。GASで使用されるアダプティブオラクルは、現在のしきい値より上または下のすべての値(それぞれ最大および最小)を認識し、最適値が見つかるまで、しきい値が更新されるたびに検索スペースのサイズを縮小します。
このノートブックでは、 [1] に記載されているように、制約なし二値変数二次計画問題(QUBO)を最小化することで、GASで記述されている手法を活用した GroverOptimizer
の各コンポーネントを探索します。
参考文献#
グローバー適応探索#
GASのコア要素であるグローバー探索には、3つの材料が必要です:
探索スペース内の全ての状態を重ね合わせるための状態準備演算子
。関心のある状態を認識し、その振幅を-1で乗算するオラクル演算子
。 状態の振幅に -1 を掛けるグローバー拡散演算子 。
GASの実装は特定のユースケースによって異なりますが、一般的なフレームワークは、以下で説明する手順に大まかに従います。
GroverOptimizer
は QuadraticProgramToNegativeValueOracle
を使用して
正式に言えば、 QuadraticProgramToNegativeValueOracle
は、次のような
ここで、
閾値
GroverOptimizerを使用してQUBO問題の最小値を見つける#
以下は最小化問題のおもちゃの例です。
最初のステップでは、上記の問題を定義するdocplexモデルを作成します。 そして、from_docplex_mp()
関数を使用してモデルを QuadraticProgram
に変換し、Qiskit Optimization で QUBO を表すために使用できます。
[1]:
from qiskit_algorithms import NumPyMinimumEigensolver
from qiskit.primitives import Sampler
from qiskit_optimization.algorithms import GroverOptimizer, MinimumEigenOptimizer
from qiskit_optimization.translators import from_docplex_mp
from docplex.mp.model import Model
[2]:
model = Model()
x0 = model.binary_var(name="x0")
x1 = model.binary_var(name="x1")
x2 = model.binary_var(name="x2")
model.minimize(-x0 + 2 * x1 - 3 * x2 - 2 * x0 * x2 - 1 * x1 * x2)
qp = from_docplex_mp(model)
print(qp.prettyprint())
Problem name: docplex_model1
Minimize
-2*x0*x2 - x1*x2 - x0 + 2*x1 - 3*x2
Subject to
No constraints
Binary variables (3)
x0 x1 x2
次に、6 量子ビットで値をエンコードする GroverOptimizer
を作成します。 そして、進行なしでGASが10回繰り返された後に終了します(すなわち、 solve()
関数は先ほど作成した QuadraticProgram
を受け取り、実行に関する情報を含む結果オブジェクトを返します。
[3]:
grover_optimizer = GroverOptimizer(6, num_iterations=10, sampler=Sampler())
results = grover_optimizer.solve(qp)
print(results.prettyprint())
objective function value: -6.0
variable values: x0=1.0, x1=0.0, x2=1.0
status: SUCCESS
この結果、最適解 GroverOptimizer
の実行可能性が示されています。
各グラフはGASの単一の反復を示しており、
GroverOptimizerが正しい値を見つけることの確認#
Qiskit optimizationの MinimumEigenOptimizer
を使用してアルゴリズムが正しく動作していることを確認できます。
[4]:
exact_solver = MinimumEigenOptimizer(NumPyMinimumEigensolver())
exact_result = exact_solver.solve(qp)
print(exact_result.prettyprint())
objective function value: -6.0
variable values: x0=1.0, x1=0.0, x2=1.0
status: SUCCESS
[5]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
qiskit-terra | 0.23.0 |
qiskit-aer | 0.11.1 |
qiskit-optimization | 0.5.0 |
qiskit-machine-learning | 0.6.0 |
System information | |
Python version | 3.9.15 |
Python compiler | Clang 14.0.0 (clang-1400.0.29.102) |
Python build | main, Oct 11 2022 22:27:25 |
OS | Darwin |
CPUs | 4 |
Memory (Gb) | 16.0 |
Tue Dec 06 21:47:01 2022 JST |
This code is a part of Qiskit
© Copyright IBM 2017, 2022.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.
[ ]: