Перейти до основного вмісту

Iskay Quantum Optimizer — функція Qiskit від Kipu Quantum

See the API reference

Примітка
  • Qiskit Functions — це експериментальна функція, доступна лише для користувачів IBM Quantum® Premium Plan, Flex Plan та On-Prem (через IBM Quantum Platform API) Plan. Вони перебувають у статусі попереднього випуску та можуть змінюватися.

Огляд

За допомогою Iskay Quantum Optimizer від Kipu Quantum ти можеш розв'язувати складні задачі оптимізації на квантових комп'ютерах IBM®. Цей розв'язувач використовує передовий алгоритм bf-DCQO від Kipu, якому потрібна лише цільова функція як вхідні дані для автоматичного отримання розв'язків задач. Він може обробляти задачі оптимізації з кількістю кубітів до 156, що дозволяє використовувати всі кубіти квантових пристроїв IBM. Оптимізатор використовує відображення 1-до-1 між класичними змінними та кубітами, що дозволяє тобі розв'язувати задачі оптимізації з кількістю бінарних змінних до 156.

Оптимізатор дає змогу розв'язувати задачі безумовної бінарної оптимізації. На додаток до широко використовуваного формулювання QUBO (квадратична безумовна бінарна оптимізація), він також підтримує задачі вищого порядку (HUBO). Розв'язувач використовує неваріаційний квантовий алгоритм, виконуючи більшу частину обчислень на квантових пристроях.

Далі наведено докладніші відомості про використовуваний алгоритм і короткий посібник із використання функції, а також результати тестування на різних екземплярах задач різних розмірів і складності.

Опис

Оптимізатор — це готова до використання реалізація передових алгоритмів квантової оптимізації. Він розв'язує задачі оптимізації, запускаючи сильно стиснені квантові схеми на квантовому апаратному забезпеченні. Це стиснення досягається шляхом введення контрдіабатичних членів в основну еволюцію квантової системи з часом. Алгоритм виконує кілька ітерацій запусків на апаратному забезпеченні для отримання кінцевих розв'язків і поєднує їх із постобробкою. Ці кроки безперешкодно інтегровані в робочий процес Оптимізатора та виконуються автоматично.

Як працює Квантовий Оптимізатор?

У цьому розділі описано основи реалізованого алгоритму bf-DCQO. Введення в алгоритм також можна знайти на каналі Qiskit YouTube.

Алгоритм базується на часовій еволюції квантової системи, яка трансформується з часом, де розв'язок задачі закодовано в основному стані квантової системи наприкінці еволюції. Згідно з адіабатичною теоремою, ця еволюція має бути повільною, щоб гарантувати перебування системи в основному стані. Дигіталізація цієї еволюції є основою дигіталізованих квантових адіабатичних обчислень (DQA) та сумнозвісного алгоритму QAOA. Однак необхідна повільна еволюція непрактична для зростаючих розмірів задач, оскільки призводить до збільшення глибини схеми. Використовуючи контрдіабатичні протоколи, можна придушити небажані збудження, що виникають під час коротких часів еволюції, залишаючись при цьому в основному стані. Тут дигіталізація цього коротшого часу еволюції призводить до квантових схем меншої глибини з меншою кількістю заплутуючих вентилів.

Схеми алгоритмів bf-DCQO зазвичай використовують до десяти разів менше заплутуючих вентилів, ніж DQA, і в три-чотири рази менше заплутуючих вентилів, ніж стандартні реалізації QAOA. Завдяки меншій кількості вентилів під час виконання схеми на апаратному забезпеченні виникає менше помилок. Тому оптимізатор не потребує використання таких методів, як придушення або пом'якшення помилок. Реалізація цих методів у майбутніх версіях може ще більше підвищити якість розв'язку.

Хоча алгоритм bf-DCQO використовує ітерації, він є неваріаційним. Після кожної ітерації алгоритму вимірюється розподіл станів. Отриманий розподіл використовується для обчислення так званого поля зміщення (bias-field). Поле зміщення дозволяє починати наступну ітерацію зі стану енергії поблизу попередньо знайденого розв'язку. Таким чином алгоритм з кожною ітерацією переходить до розв'язків із нижчою енергією. Як правило, приблизно десяти ітерацій достатньо для збіжності до розв'язку, а загальна кількість необхідних ітерацій значно менша, ніж у варіаційних алгоритмів, і становить порядку приблизно 100 ітерацій.

Оптимізатор поєднує алгоритм bf-DCQO з класичною постобробкою. Після вимірювання розподілу станів виконується локальний пошук. Під час локального пошуку біти виміряного розв'язку випадковим чином перевертаються. Після перевертання оцінюється енергія нового бітового рядка. Якщо енергія нижча, бітовий рядок зберігається як новий розв'язок. Локальний пошук масштабується лише лінійно з кількістю кубітів, тому він є обчислювально дешевим. Оскільки постобробка виправляє локальні перевертання бітів, вона компенсує помилки перевертання бітів, які часто є наслідком недосконалості апаратного забезпечення та помилок зчитування.

Робочий процес

Нижче наведено схему робочого процесу Квантового Оптимізатора.

Workflow

Використовуючи Квантовий Оптимізатор, розв'язання задачі оптимізації на квантовому апаратному забезпеченні можна звести до:

  • Формулювання цільової функції задачі
  • Отримання доступу до Оптимізатора через Qiskit Functions
  • Запуску Оптимізатора та збору результатів

Тести продуктивності

Наведені нижче показники тестування демонструють, що Оптимізатор ефективно вирішує задачі з кількістю кубітів до 156, і дають загальний огляд точності та масштабованості оптимізатора для різних типів задач. Зверни увагу, що фактичні показники продуктивності можуть відрізнятися залежно від конкретних характеристик задачі, таких як кількість змінних, щільність і локальність членів цільової функції та порядок полінома.

Наступна таблиця включає коефіцієнт апроксимації (AR) — метрику, що визначається таким чином:

AR=CCmaxCminCmax,AR = \frac{C^{*} - C_\textrm{max}}{C_{\textrm{min}} - C_{\textrm{max}}},

де CC — цільова функція, CminC_{\textrm{min}}, CmaxC_{\textrm{max}} — її мінімальне та максимальне значення, а CC^{*} — вартість найкращого знайденого розв'язку відповідно. Таким чином, AR=100% означає, що було отримано основний стан задачі.

ПрикладКількість кубітівКоефіцієнт апроксимаціїЗагальний час (с)Використання середовища виконання (с)Загальна кількість вимірюваньКількість ітерацій
Unweighted MaxCut28100%1803030k5
Unweighted MaxCut30100%1803030k5
Unweighted MaxCut32100%1803030k5
Unweighted MaxCut80100%4806090k9
Unweighted MaxCut100100%3306060k6
Unweighted MaxCut120100%3706060k6
HUBO 1156100%60070100k10
HUBO 2156100%60070100k10
  • Екземпляри MaxCut із 28, 30 та 32 кубітами запускалися на ibm_sherbrooke. Екземпляри з 80, 100 та 120 кубітами запускалися на процесорі Heron r2.
  • Екземпляри HUBO також запускалися на процесорі Heron r2.

Усі еталонні екземпляри доступні на GitHub (див. Kipu benchmark instances). Приклад запуску цих екземплярів можна знайти в Приклад 3: Еталонні екземпляри.

Початок роботи

У цій документації ми пройдемо кроки використання Iskay Quantum Optimizer. У процесі ми швидко покажемо, як завантажити функцію з каталогу і як перетворити задачу на коректний вхід, демонструючи при цьому, як можна експериментувати з різними необов'язковими параметрами.

Для більш детального прикладу ознайомся з навчальним посібником Розв'язання задачі поділу ринку за допомогою Iskay Quantum Optimizer від Kipu Quantum, де ми проходимо через весь процес використання Iskay Solver для розв'язання задачі поділу ринку, яка представляє реальну задачу розподілу ресурсів, де ринки потрібно розбити на збалансовані регіони продажів для досягнення точних цільових показників попиту.

Автентифікуйся за допомогою свого API-ключа, який можна знайти на інформаційній панелі IBM Quantum Platform, і вибери функцію Qiskit таким чином:

# Added by doQumentation — required packages for this notebook
!pip install -q PyGithub networkx qiskit-ibm-catalog
# ruff: noqa: F821
примітка

Наступний код передбачає, що ти зберіг свої облікові дані. Якщо ні, дотримуйся інструкцій у розділі збережи свій обліковий запис IBM Cloud для автентифікації за допомогою API-ключа.

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(
channel="ibm_quantum_platform",
instance="INSTANCE_CRN",
token="YOUR_API_KEY", # Use the 44-character API_KEY you created and saved from the IBM Quantum Platform Home dashboard
)

# Access Function
optimizer = catalog.load("kipu-quantum/iskay-quantum-optimizer")

Власний приклад конфігурації

Ось як можна налаштувати Iskay з різними параметрами:

custom_options = {
"shots": 15_000, # Higher shot count for better statistics
"num_iterations": 12, # More iterations for solution refinement
"preprocessing_level": 1, # Light preprocessing for problem simplification
"postprocessing_level": 2, # Maximum postprocessing for solution quality
"transpilation_level": 3, # Using higher transpilation level for circuit optimization
"seed_transpiler": 42, # Fixed seed for reproducible results
"job_tags": ["custom_config"], # Custom tracking tags
}

Оптимізація seed: Зверни увагу, що seed_transpiler за замовчуванням встановлено в None. Це вмикає автоматичний процес оптимізації Transpiler. Якщо значення None, система розпочне спробу з кількома seed-значеннями та вибере те, що дає найменшу глибину схеми, використовуючи всю потужність параметра max_trials для кожного рівня транспіляції.

Продуктивність рівнів транспіляції: Збільшення кількості max_trials з вищими значеннями transpilation_level неминуче збільшить час транспіляції, але не завжди змінюватиме кінцеву схему — це значною мірою залежить від конкретної структури та складності схеми. Однак для деяких схем/задач різниця між 10 спробами (рівень 1) та 50 спробами (рівень 5) може бути разючою, тому дослідження цих параметрів може бути ключем до успішного знаходження розв'язку.

Приклад 1: Проста функція вартості

Розглянемо функцію вартості у спіновому формулюванні:

C(x0,x1,x2,x3,x4)=1+1.5x0+2x1+1.3x2+2.5x0x3+3.5x1x4+4x0x1x2C(x_0, x_1, x_2, x_3, x_4) = 1 + 1.5x_0 + 2x_1 + 1.3x_2 + 2.5x_0x_3 + 3.5x_1x_4 + 4x_0x_1x_2

де (x0,...,x4){1,1}5(x_0, ..., x_4) \in \{-1, 1\}^5.

Розв'язком цієї простої функції вартості є

(x0,x1,x2,x3,x4)=(1,1,1,1,1)(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1)

з мінімальним значенням C=6C^{*} = -6

1. Створення цільової функції

Починаємо зі створення словника з коефіцієнтами цільової функції таким чином:

objective_func = {
"()": 1,
"(0,)": 1.5,
"(1,)": 2,
"(2,)": 1.3,
"(0, 3)": 2.5,
"(1, 4)": 3.5,
"(0, 1, 2)": 4,
}

2. Запуск Оптимізатора

Розв'язуємо задачу, запускаючи оптимізатор. Оскільки (x0,...,x4){1,1}5(x_0, ..., x_4) \in \{-1, 1\}^5, необхідно встановити problem_type=spin.

# Setup options to run the optimizer
options = {"shots": 5000, "num_iterations": 5, "use_session": True}

arguments = {
"problem": objective_func,
"problem_type": "spin",
"backend_name": backend_name, # such as "ibm_fez"
"options": options,
}

job = optimizer.run(**arguments)

3. Отримання результату

Розв'язок задачі оптимізації надається безпосередньо оптимізатором.

print(job.result())

Це відобразить словник такого вигляду:

{'solution': {'0': -1, '1': -1, '2': -1, '3': 1, '4': 1},
'solution_info': {'bitstring': '11100',
'cost': -13.8,
'seed_transpiler': 42,
'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}},
'prob_type': 'spin'}

Зверни увагу, що словник solution відображає вектор результату (x0,x1,x2,x3,x4)=(1,1,1,1,1)(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1).

Приклад 2: MaxCut

Багато задач на графах, таких як MaxCut або максимальна незалежна множина, є NP-важкими задачами та ідеальними кандидатами для тестування квантових алгоритмів і апаратного забезпечення. Цей приклад демонструє розв'язання задачі MaxCut для 3-регулярного графа за допомогою Квантового Оптимізатора.

Для запуску цього прикладу необхідно встановити пакет networkx на додаток до qiskit-ibm-catalog. Щоб встановити його, виконай наступну команду:

# %pip install networkx numpy

1. Створення цільової функції

Починаємо зі створення випадкового 3-регулярного графа. Для цього графа визначаємо цільову функцію задачі MaxCut.

import networkx as nx

# Create a random 3-regular graph
G = nx.random_regular_graph(3, 10, seed=42)

# Create the objective function for MaxCut in Ising formulation
def graph_to_ising_maxcut(G):
"""
Convert a NetworkX graph to an Ising Hamiltonian for the max-cut problem.
Args:
G (networkx.Graph): The input graph.
Returns:
dict: The objective function of the Ising model
"""
# Initialize the linear and quadratic coefficients
objective_func = {}
# Populate the coefficients
for i, j in G.edges:
objective_func[f"({i}, {j})"] = 0.5
return objective_func

objective_func = graph_to_ising_maxcut(G)

2. Запуск Оптимізатора

Розв'язуємо задачу, запускаючи оптимізатор.

options = {"shots": 5000, "num_iterations": 5, "use_session": True}

arguments = {
"problem": objective_func,
"problem_type": "spin",
"backend_name": backend_name, # such as "ibm_fez"
"options": options,
}

job = optimizer.run(**arguments)

3. Отримання результату

Отримуємо результат і відображаємо бітовий рядок розв'язку назад на вузли оригінального графа.

print(job.result())

Розв'язок задачі Maxcut міститься безпосередньо у підсловнику solution об'єкта результату

maxcut_solution = job.result()["solution"]

Приклад 3: Еталонні екземпляри

Еталонні екземпляри доступні на GitHub: Еталонні екземпляри Kipu.

Екземпляри можна завантажити за допомогою бібліотеки pygithub. Щоб встановити її, виконай таку команду:

# %pip install pygithub

Шляхи до еталонних екземплярів:

Maxcut:

  • 'maxcut/maxcut_28_nodes.json'
  • 'maxcut/maxcut_30_nodes.json'
  • 'maxcut/maxcut_32_nodes.json'
  • 'maxcut/maxcut_80_nodes.json'
  • 'maxcut/maxcut_100_nodes.json'
  • 'maxcut/maxcut_120_nodes.json'

HUBO:

  • 'HUBO/hubo1_marrakesh.json'
  • 'HUBO/hubo2_marrakesh.json'

Щоб відтворити продуктивність еталону для екземплярів HUBO, вибери бекенд ibm_marrakesh та встанови direct_qubit_mapping у значення True у підсловнику options. Наступний приклад запускає екземпляр Maxcut із 32 вузлами.

from github import Github
import urllib
import json
import ast

repo = "Kipu-Quantum-GmbH/benchmark-instances"
path = "maxcut/maxcut_32_nodes.json"
gh = Github()
repo = gh.get_repo(repo)
branch = "main"
file = repo.get_contents(urllib.parse.quote(path), ref=branch)

# load json file with benchmark problem
problem_json = json.loads(file.decoded_content)

# convert objective function to compatible format
objective_func = {
key: ast.literal_eval(value) for key, value in problem_json.items()
}

# Setup configuration to run the optimizer
options = {
"shots": 5_000,
"num_iterations": 5,
"use_session": True,
"direct_qubit_mapping": False,
}

arguments = {
"problem": objective_func,
"problem_type": "spin",
"backend_name": "ibm_brisbane",
"options": options,
}

job = optimizer.run(**arguments)

result = job.result()

Сценарії використання

Типові сценарії використання для солвера оптимізації — це комбінаторні задачі оптимізації. Ти можеш розв'язувати задачі з багатьох галузей: фінанси, фармацевтика або логістика. Ось кілька прикладів.

Якщо тебе цікавить розв'язання конкретного сценарію та розробка відповідного маппінгу, ми можемо допомогти. Зв'яжись з нами.

Підтримка

Для отримання підтримки звертайся на support@kipu-quantum.com.

Наступні кроки

Додаткова інформація

Iskay, як і назва нашої компанії Kipu Quantum, — це перуанське слово. Хоча ми є стартапом із Німеччини, ці слова походять із рідної країни одного з наших співзасновників, де Quipu був одним із перших обчислювальних пристроїв, створених людством 2000 років до нашої ери.