Quantum Approximate Optimization Algorithm
Bruukstied-Schatting: 22 Minuten op'n Heron r3 Prozessor (HENWIES: Dat is blots 'ne Schatting. Dien Looptied kann variern.)
Achtergrund
Dit Tutorial wiest, wo wi den Quantum Approximate Optimization Algorithm (QAOA) – 'ne hybride (quanten-klassische) iterative Methode – binnen den Kontext vun Qiskit-Patterns implementeern. Wi lööst eerst dat Maximum-Cut (oder Max-Cut) Problem för 'n lütten Graphen un leert denn, wo wi dat op Utility-Skala utföhren. All Hardware-Utföhrungen in dit Tutorial schöölt binnen de Tiedgrenz för den free tögänglichen Open Plan funkeern.
Dat Max-Cut-Problem is 'n Optimierungsproblem, wat swoor to lösen is (mehr seggt, dat is 'n NP-hard Problem) mit 'ne Reeg vun verscheden Anwennungen in Clustering, Netzwerkwetenschap un statistischer Physik. Dit Tutorial betrackt 'n Graphen vun Knoten, de dör Kanten verbunnen sünd, un will de Knoten in twee Mengen optelen, sodass de Tall vun de dör dissen Schnitt dörchreisd Kanten maximiert warrt.

Vörutsettungen
Bevör wi mit dit Tutorial anfangen, seht to, dat ji dat Folgende installeert hebbt:
- Qiskit SDK v1.0 oder later, mit Visualisierungs-Ünnerstütten
- Qiskit Runtime v0.22 oder later (
pip install qiskit-ibm-runtime)
Daarto bruukt ji Togäng to 'ne Instanz op de IBM Quantum Platform. Acht darop, dat dit Tutorial nich in'n Open Plan utföhrt warrn kann, wieldat dat Workloads mit Sessions utföhrt, de blots mit Premium Plan-Togäng verfögbor sünd.
Setup
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit qiskit-ibm-runtime rustworkx scipy
import matplotlib
import matplotlib.pyplot as plt
import rustworkx as rx
from rustworkx.visualization import mpl_draw as draw_graph
import numpy as np
from scipy.optimize import minimize
from collections import defaultdict
from typing import Sequence
from qiskit.quantum_info import SparsePauliOp
from qiskit.circuit.library import QAOAAnsatz
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import Session, EstimatorV2 as Estimator
from qiskit_ibm_runtime import SamplerV2 as Sampler
Deel I. QAOA in'n lütten Mootstav
De eerste Deel vun dit Tutorial bruukt 'n lütt Max-Cut-Problem, üm de Schritten för de Lösung vun 'n Optimierungsproblem mit 'n Quantencomputer to verdüütlichen.
Üm 'n beter Kontext to geven, bevör wi dit Problem op 'n Quantenalgorithmus afbilden, köönt ji beter verstahn, wo dat Max-Cut-Problem to 'n klassischen kombinatorischen Optimierungsproblem warrt, wenn wi eerst de Minimierung vun 'ne Funkschoon betrachten
wobei de Ingav 'n Vektor is, wo sien Komponenten elkeen Knoten vun 'n Graphen entsprecht. Denn warrt jede vun disse Komponenten op entweder oder beschränkt (wat representeert, of se in'n Schnitt entholln sünd oder nich). Dissen lüttskalige Biespielfall bruukt 'n Graphen mit Knoten.
Wi köönt 'ne Funkschoon vun 'n Knotenpaar schrieven, wat anwiest, of de entsprechend Kant in'n Schnitt liggt. To'n Biespeel is de Funkschoon nau denn 1, wenn entweder oder gliek 1 is (wat bedüüdt, dat de Kant in'n Schnitt liggt) un süss null. Dat Problem, de Kanten in'n Schnitt to maximeren, kann formuleert warrn as
wat as Minimierung ümschreven warrn kann in de Form
Dat Minimum vun in dissen Fall liggt vör, wenn de Tall vun de dör den Schnitt dörchreisd Kanten maximal is. As ji seht, hett dat noch nix mit Quantencomputing to doon. Wi mööt dit Problem in wat ümformuleren, wat 'n Quantencomputer verstahn kann. Initiali seert juu Problem, indem wi 'n Graphen mit Knoten maakt.
n = 5
graph = rx.PyGraph()
graph.add_nodes_from(np.arange(0, n, 1))
edge_list = [
(0, 1, 1.0),
(0, 2, 1.0),
(0, 4, 1.0),
(1, 2, 1.0),
(2, 3, 1.0),
(3, 4, 1.0),
]
graph.add_edges_from(edge_list)
draw_graph(graph, node_size=600, with_labels=True)

Schritt 1: Klassische Ingav op 'n Quantenproblem afbilden
De eerste Schritt vun't Pattern besteiht darin, dat klassische Problem (Graph) op quantenmechanische Schaltkreise un Operatoren aftobilden. Daarto sünd dree Hövdschritten to ünnernahmen:
- Bruuk vun 'ne Reeg vun mathematische Ümformulierungen, üm dit Problem mit de Notation vun Quadratic Unconstrained Binary Optimization (QUBO) Problemen dartostellen.
- Ümformulierung vun't Optimierungsproblem as Hamilton-Operator, för den de Grundtostänn de Lösung entspricht, wo de Kostenfunkschoon minimieeert.
- Maaken vun 'n Quantenschaltkreis, de den Grundtostänn vun dissen Hamilton-Operator över 'n Prozess ähnlich dat Quantum Annealing vörbereit.
Acht darop: In de QAOA-Methodik wüllt wi letztlich 'n Operator (Hamilton-Operator) hemm, de de Kostenfunkschoon vun uns hybride Algorithmus darstellt, sowiet as 'n parametriseerten Schaltkreis (Ansatz), de Quantentostänne mit Kandidatenlösungen för dit Problem darstellt. Wi köönt ut disse Kandidatentostänne sampeln un se denn mit de Kostenfunkschoon bewerten.
Graph → Optimierungsproblem
De eerste Schritt vun de Afbildung is 'ne Notationsännerung. Dat Folgende drückt dit Problem in QUBO-Notation ut:
wobei 'ne Matrix vun reelle Tallen is, de Tall vun de Knoten in juu Graphen entspricht, de boven inföhrde Vektor vun binäre Variable is un de Transponeerde vun den Vektor bedüüdt.
Maximize
-2*x_0*x_1 - 2*x_0*x_2 - 2*x_0*x_4 - 2*x_1*x_2 - 2*x_2*x_3 - 2*x_3*x_4 + 3*x_0
+ 2*x_1 + 3*x_2 + 2*x_3 + 2*x_4
Subject to
No constraints
Binary variables (5)
x_0 x_1 x_2 x_3 x_4
Optimierungsproblem → Hamilton-Operator
Wi köönt denn dat QUBO-Problem as Hamilton-Operator ümformuleren (hier 'ne Matrix, wo de Energie vun 'n System darstellt):
Ümformulierungsschritten vun't QAOA-Problem to'n Hamilton-Operator
Üm to wiesen, wo dat QAOA-Problem op disse Wies ümschreven warrn kann, ersettt wi eerst de binären Variable dör 'n nijen Sett vun Variable över
Hier köönt ji sehn, dat wenn gliek is, denn gliek sien mutt. Wenn de dör de in't Optimierungsproblem () ersett warrt, kann 'ne äquivalente Formulierung kregen warrn.