Optimization Solver: функція Qiskit від Q-CTRL Fire Opal
Дивись довідник API
Qiskit Functions — це експериментальна функція, доступна лише користувачам IBM Quantum® Premium Plan, Flex Plan та On-Prem (через IBM Quantum Platform API) Plan. Вона перебуває у статусі попереднього релізу та може змінюватись.
Package versions
The code on this page was developed using the following requirements. We recommend using these versions or newer.
qiskit-ibm-runtime~=0.46.1
sympy~=1.14.0
Огляд
За допомогою Fire Opal Optimization Solver ти можеш розв'язувати задачі оптимізації утилітарного масштабу на квантовому залізі без потреби в квантовій експертизі. Просто введи визначення задачі на високому рівні — і Solver зробить усе інше. Весь робочий процес є шумостійким і використовує Fire Opal Performance Management «під капотом». Solver стабільно надає точні рішення для класично складних задач навіть у повному масштабі на найбільших QPU від IBM®.
Solver є гнучким і може розв'язувати комбінаторні задачі оптимізації, визначені як цільові функції або довільні графи. Задачі не потрібно відображати на топологію пристрою. Розв'язуються як необмежені, так і обмежені задачі, за умови що обмеження можуть бути сформульовані у вигляді штрафних доданків. Приклади, наведені в цьому посібнику, демонструють, як розв'язати необмежену та обмежену задачу оптимізації утилітарного масштабу, використовуючи різні типи вхідних даних для Solver. Перший приклад охоплює задачу max-cut на 156-вузловому 3-регулярному графі, тоді як другий — задачу Minimum Vertex Cover на 50 вузлах, визначену через цільову функцію.
Щоб отримати доступ до Optimization Solver, звернись до Q-CTRL.
Опис функції
Solver повністю оптимізує та автоматизує весь алгоритм — від придушення помилок на рівні заліза до ефективного відображення задачі та замкненої класичної оптимізації. «За лаштунками» конвеєр Solver зменшує помилки на кожному етапі, забезпечуючи підвищену продуктивність, необхідну для реального масштабування. Базовий робочий процес натхненний алгоритмом квантової наближеної оптимізації (QAOA) — гібридним квантово-класичним алгоритмом. Детальний опис повного робочого процесу Optimization Solver наведено в опублікованій статті.
Щоб розв'язати загальну задачу за допомогою Optimization Solver:
- Визнач свою задачу як цільову функцію, граф або
SparsePauliOpспінового ланцюжка. - Підключись до функції через Qiskit Functions Catalog.
- Запусти задачу на Solver і отримай результати.
Підтримувані формати задач
- Представлення цільової функції у вигляді поліноміального виразу. В ідеалі — створений у Python на основі існуючого об'єкта SymPy Poly та відформатований у рядок за допомогою sympy.srepr.
- Представлення задачі у вигляді графа для конкретного типу задачі. Граф слід створювати за допомогою бібліотеки networkx у Python, а потім перетворювати на рядок функцією networkx
[nx.readwrite.json_graph.adjacency_data](http://nx.readwrite.json_graph.adjacency_data.). - Представлення задачі у вигляді спінового ланцюжка. Спіновий ланцюжок має бути представлений як об'єкт
SparsePauliOp; детальніше — у документації.
Підтримувані бекенди
Виконай наступний код, щоб переглянути список бекендів, які підтримуються на даний момент. Якщо твій пристрій не вказано у списку, звернись до Q-CTRL, щоб додати підтримку.
# Added by doQumentation — required packages for this notebook
!pip install -q networkx numpy qiskit-ibm-catalog qiskit-ibm-runtime sympy
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
service.backends()
[<IBMBackend('ibm_boston')>,
<IBMBackend('ibm_pittsburgh')>,
<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_marrakesh')>,
<IBMBackend('ibm_kingston')>,
<IBMBackend('ibm_miami')>]
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# Access Function
solver = catalog.load("q-ctrl/optimization-solver")
Бенчмарки
Опубліковані результати бенчмаркінгу показують, що Solver успішно розв'язує задачі на понад 120 кубітах, навіть перевершуючи раніше опубліковані результати на пристроях квантового відпалу та пастки іонів. Наступні метрики бенчмарку дають приблизне уявлення про точність і масштабування типів задач на основі кількох прикладів. Фактичні метрики можуть відрізнятись залежно від різних характеристик задачі, таких як кількість доданків у цільовій функції (щільність) та їхня локальність, кількість змінних і поряд ок полінома.
«Кількість кубітів», що вказана, не є жорстким обмеженням, а лише приблизними порогами, при яких можна очікувати надзвичайно стабільної точності рішення. Задачі більшого розміру вже були успішно розв'язані, і тестування за межами цих порогів заохочується.
Довільне з'єднання кубітів підтримується для всіх типів задач.
| Тип задачі | Кількість кубітів | Приклад | Точність | Загальний час (с) | Використання Runtime (с) | Кількість ітерацій |
|---|---|---|---|---|---|---|
| Розріджено-зв'язані квадратичні задачі | 156 | 3-регулярний max-cut | 100% | 1764 | 293 | 16 |
| Бінарна оптимізація вищого порядку | 156 | Ізингова модель спінового скла | 100% | 1461 | 272 | 16 |
| Щільно-зв'язані квадратичні задачі | 50 | Повністю-зв'язаний max-cut | 100% | 1758 | 268 | 12 |
| Обмежена задача зі штрафними доданками | 50 | Зважений Minimum Vertex Cover із щільністю ребер 8% | 100% | 1074 | 215 | 10 |
Початок роботи
Спочатку пройди автентифікацію за допомогою свого API-ключа IBM Quantum. Потім вибери функцію Qiskit наступним чином. (Цей фрагмент передбачає, що ти вже зберіг свій обліковий запис у локальному середовищі.)
# %pip install networkx numpy
Приклад: необмежена оптимізація
Запусти задачу максимального розрізу (Max-Cut). Наступний приклад демонструє можливості Solver на задачі Max-Cut на 156-вузловому, 3-регулярному незваженому графі, але ти також можеш розв'язувати задачі на зважених графах.
Окрім qiskit-ibm-catalog, для виконання цього прикладу тобі знадобляться такі пакети: networkx і numpy. Ти можеш встановити їх, розкоментувавши наступну комірку, якщо запускаєш цей приклад у ноутбуці з ядром IPython.
import networkx as nx
import numpy as np
# Generate a random graph with 156 nodes
maxcut_graph = nx.random_regular_graph(d=3, n=156, seed=8)
1. Визначте задачу
Ти можеш запустити задачу Max-Cut, визначивши задачу у вигляді графа та вказавши problem_type='maxcut'.
# Optionally, visualize the graph
nx.draw_networkx(
maxcut_graph, nx.kamada_kawai_layout(maxcut_graph), node_size=100
)
# Convert graph to string
problem_as_str = nx.readwrite.json_graph.adjacency_data(maxcut_graph)
Solver приймає рядок як вхідне визначення задачі.
# This cell is hidden from users
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend_name = service.least_busy(n_qubits=156).name
2. Запустіть задачу
При використанні графового методу вводу вкажи тип задачі.
# Solve the problem
maxcut_job = solver.run(
problem=problem_as_str,
problem_type="maxcut",
backend_name=backend_name, # E.g. "ibm_fez"
)
# Get job status
print(maxcut_job.status())
Перевір статус робочого навантаження своєї функції Qiskit або отримай результати наступним чином:
QUEUED
# Poll for results
maxcut_result = maxcut_job.result()
# Take the absolute value of the solution since the cost function is minimized
qctrl_maxcut = abs(maxcut_result["solution_bitstring_cost"])
# Print the optimal cut value found by the Optimization Solver
print(f"Optimal cut value: {qctrl_maxcut}")
3. Отримайте результат
Отримай оптимальне значення розрізу зі словника результатів.
variables_to_bitstring_index_map, який допомагає перевірити порядок.Optimal cut value: 210.0
# %pip install numpy networkx sympy
Ти можеш перевірити точність результату, розв'язавши задачу класично за допомогою відкритих солверів, таких як PuLP, якщо граф не є щільно зв'язаним. Для задач із високою щільністю може знадобитись використання просунутих класичних солверів для підтвердження рішення.
Приклад: обмежена оптимізація
Попередній приклад max-cut є класичною квадратичною необмеженою задачею бінарної оптимізації. Optimization Solver від Q-CTRL може використовуватись для різних типів задач, зокрема обмеженої оптимізації. Ти можеш розв'язувати довільні типи задач, подаючи визначення задачі у вигляді полінома, де обмеження моделюються як штрафні доданки.
Наступний приклад демонструє, як побудувати цільову функцію для обмеженої задачі оптимізації — мінімального покриття вершин (MVC).
Окрім пакетів qiskit-ibm-catalog і qiskit, для виконання цього прикладу тобі знадобляться такі пакети: numpy, networkx і sympy. Ти можеш встановити їх, розкоментувавши наступну комірку, якщо запускаєш цей приклад у ноутбуці з ядром IPython.
import networkx as nx
from sympy import symbols, Poly, srepr
# To change the weights, change the seed to any integer.
rng_seed = 18
_rng = np.random.default_rng(rng_seed)
node_count = 50
edge_probability = 0.08
mvc_graph = nx.erdos_renyi_graph(
node_count, edge_probability, seed=rng_seed, directed=False
)
# add node weights
for i in mvc_graph.nodes:
mvc_graph.add_node(i, weight=_rng.random())
# Optionally, visualize the graph
nx.draw_networkx(mvc_graph, nx.kamada_kawai_layout(mvc_graph), node_size=200)
1. Визначте задачу
Визнач випадкову задачу MVC, згенерувавши граф із вузлами, що мають випадкові ваги.
# Construct the cost function.
variables = symbols([f"n[{i}]" for i in range(node_count)])
cost_function = Poly(0, variables)
for i in mvc_graph.nodes():
weight = mvc_graph.nodes[i].get("weight", 0)
cost_function += variables[i] * weight
Стандартна модель оптимізації для зваженого MVC може бути сформульована наступним чином. Спочатку необхідно додати штраф для будь-якого випадку, коли ребро не з'єднане з вершиною з підмножини. Тому нехай , якщо вершина входить до покриття (тобто знаходиться у підмножині), і в іншому випадку. По-друге, мета полягає у мінімізації загальної кількості вершин у підмножині, що може бути виражено такою функцією:
# Add penalty term.
penalty_constant = 2
for i, j in mvc_graph.edges():
cost_function += penalty_constant * (
1 - variables[i] - variables[j] + variables[i] * variables[j]
)
Тепер кожне ребро в графі повинне мати хоча б одну кінцеву точку з покриття, що можна виразити як нерівність:
Будь-який випадок, коли ребро не з'єднане з вершиною покриття, має бути оштрафований. Це можна представити у цільовій функції, додавши штрафний доданок виду , де — це позитивна штрафна константа. Таким чином, необмежена альтернатива обмеженій нерівності для зваженого MVC виглядає так:
# Solve the problem
mvc_job = solver.run(
problem=srepr(cost_function),
backend_name=backend_name, # E.g. "ibm_fez"
)
2. Запустіть задачу
print(mvc_job.status())
Перевір статус робочого навантаження своєї функції Qiskit або отримай результати наступним чином:
QUEUED
3. Отримайте результат
Отримай рішення та проаналізуй результати. Оскільки ця задача має зважені вузли, рішення — це не просто мінімальна кількість покритих вузлів. Натомість вартість рішення представляє суму ваг вершин, що включені до покриття вершин. Вона в ідображає загальну «вартість» або «вагу» покриття всіх ребер у графі за допомогою вибраних вершин.
mvc_result = mvc_job.result()
qctrl_cost = mvc_result["solution_bitstring_cost"]
# Print results
print(f"Solution cost: {qctrl_cost}")
Solution cost: 10.248198273708624
Підтримка
З будь-якими запитаннями або проблемами звернись до Q-CTRL.
Журнал змін
- 2026-02-11: Тепер підтримується
ibm_miami
Наступні кроки
- Запроси доступ до Q-CTRL Optimization Solver.
- Відвідай довідник API для цієї функції Qiskit.
- Спробуй підручник Розв'язання задач бінарної оптимізації вищого порядку за допомогою Optimization Solver від Q-CTRL.
- Ознайомся з Sachdeva, N., et al. (2024). Quantum optimization using a 127-qubit gate-model IBM quantum computer can outperform quantum annealers for nontrivial binary optimization problems. arXiv preprint arXiv:2406.01743.
- Ознайомся з Loco, D., et al. (2026). Practical protein-pocket hydration-site prediction for drug discovery on a quantum computer. arXiv preprint arXiv:2512.08390.
- Ознайомся з кейсом Mazda.
- Ознайомся з кейсом Network Rail.
- Ознайомся з кейсом Australian Army.
- Ознайомся з кейсом Transport for New South Wales.