Quantum Approximate Optimization Algorithm
Zeitschätzung: 22 Minuten uff'm Heron-r3-Prozessor (ACHTUNG: Dit is nur'ne Schätzung. Deine tatsächliche Laufzeit kann abweichn.)
Hintergrund
Dit Tutorial zeigt, wie ma'n Quantum Approximate Optimization Algorithm (QAOA) – 'ne hybride (quanten-klassische) iterative Methode – im Rahmen von Qiskit Patterns implementiert. Du löst zuerst det Maximum-Cut-Problem (oda Max-Cut) für'n kleenen Graphen un lernst dann, wie ma det im Utility-Maßstab ausführt. Alle Hardware-Ausführungen in dem Tutorial solltn innerhalb des Zeitlimits für den kostenlosen Open Plan laufn.
Det Max-Cut-Problem is 'n Optimierungsproblem, det schwer zu lösen is (jenaua jesagt: 't is 'n NP-schweres Problem) un hat verschiedene Anwendungen in Clustering, Netzwerkwissenschaft un statistischer Physik. Dit Tutorial betrachtet 'n Graphen mit Knoten, die durch Kanten verbunden sind, un will die Knoten in zwei Gruppen einteilen, so dass die Zahl der Kanten, die von dem Schnitt durchquert werden, maximiert wird.

Voraussetzungen
Bevor du mit dem Tutorial anfängst, stell sicher, datte foljendes installiert hast:
- Qiskit SDK v1.0 oder späta, mit Unterstützung für Visualisierung
- Qiskit Runtime v0.22 oder späta (
pip install qiskit-ibm-runtime)
Außadem brauchste Zugang zu 'ner Instanz uff da IBM Quantum Platform. Beachte, datt dit Tutorial nicht im Open Plan ausjeführt wern kann, weil et Workloads über Sessions startet, die nur mit'm Premium Plan verfügbar sind.
Einrichtung
# 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
Teil I. QAOA im kleenen Maßstab
Da erste Teil von dem Tutorial nutzt 'n kleenes Max-Cut-Problem, um die Schritte zur Lösung eines Optimierungsproblems mit 'nem Quantencomputer zu veranschaulichn.
Um et bissel Kontext zu jeben, bevor dit Problem auf 'n Quantenalgorithmus abjebildet wird: Man kann bessa verstehen, wie det Max-Cut-Problem zu 'nem klassischen kombinatorischen Optimierungsproblem wird, wenn ma zunächst die Minimierung einer Funktion betrachtet
wobei da Eingabevektor Komponenten hat, die jedem Knoten des Graphen entsprechn. Dann schränkst du jede Komponente auf oder ein (was bedeutet, ob der Knoten im Schnitt enthalten is oder nicht). Dit kleine Beispiel nutzt 'n Graphen mit Knoten.
Du könntest 'ne Funktion für 'n Knotenpaar schreiben, die angibt, ob die entsprechende Kante im Schnitt liegt. Die Funktion ist zum Beispiel genau dann 1, wenn entweder oder gleich 1 ist (also wenn die Kante im Schnitt liegt), und sonst null. Det Problem, die Kanten im Schnitt zu maximieren, lässt sich formuliern als
was sich als Minimierungsproblem umschreiben lässt:
Det Minimum von is in dem Fall erreicht, wenn die Zahl der vom Schnitt durchquerten Kanten maximal is. Wie du siehst, hat det noch nüscht mit Quantencomputing zu tun. Du musst dit Problem in'ne Form umformulieren, die 'n Quantencomputer verstehen kann. Initialisier dein Problem, indem du 'n Graphen mit Knoten erstellst.
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 Eingaben auf 'n Quantenproblem abbildn
Da erste Schritt vom Muster is, det klassische Problem (den Graphen) auf Quanten-Schaltkreise un Operatoren abzubildn. Dafür gibt's drei Hauptschritte:
- Eine Reihe von mathematischen Umformulierungen nutzen, um dat Problem in die Notation der Quadratic Unconstrained Binary Optimization (QUBO) zu bringen.
- Det Optimierungsproblem als 'n Hamiltonian umschreiben, dessen Grundzustand der Lösung entspricht, die die Kostenfunktion minimiert.
- Einen Quantenschaltkreis erstellen, der den Grundzustand von dem Hamiltonian durch 'n Prozess ähnlich wie Quantum Annealing vorbereitet.
Hinweis: Beim QAOA-Verfahren willste letztlich 'n Operator (Hamiltonian) haben, der die Kostenfunktion von unsrem hybriden Algorithmus darstellt, sowie 'n parametrisierten Schaltkreis (Ansatz), der Quantenzustände mit Kandidatenlösungen für dat Problem darstellt. Du kannst dann aus diesen Kandidatenzuständen sampln un sie mit da Kostenfunktion bewerten.
Graph → Optimierungsproblem
Da erste Schritt beim Abbilden is 'ne Notationsumstellung. Hier wird det Problem in QUBO-Notation ausjedrückt:
wobei 'ne -Matrix aus reellen Zahlen is, da Anzahl der Knoten in deim Graphen entspricht, da oben eingeführte Vektor aus binären Variablen is un die Transponierte von bezeichnet.
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 → Hamiltonian
Det QUBO-Problem lässt sich dann als Hamiltonian umformulieren (also als Matrix, die die Energie eines Systems darstellt):
Umformulierungsschritte vom QAOA-Problem zum Hamiltonian
Um zu zeigen, wie sich det QAOA-Problem so umschreiben lässt, ersetzt man zunächst die binären Variablen durch 'ne neue Menge von Variablen