Lewati ke konten utama

Optimization Solver: Qiskit Function oleh Q-CTRL Fire Opal

catatan

Qiskit Functions adalah fitur eksperimental yang hanya tersedia untuk pengguna IBM Quantumยฎ Premium Plan, Flex Plan, dan On-Prem (melalui IBM Quantum Platform API) Plan. Fitur ini dalam status rilis pratinjau dan bisa berubah sewaktu-waktu.

Ikhtisarโ€‹

Dengan Fire Opal Optimization Solver, kamu bisa memecahkan masalah optimasi skala utilitas di perangkat keras kuantum tanpa perlu keahlian kuantum. Cukup masukkan definisi masalah tingkat tinggi, dan Solver akan menangani sisanya. Seluruh alur kerja bersifat noise-aware dan memanfaatkan Fire Opal's Performance Management di balik layar. Solver secara konsisten menghasilkan solusi yang akurat untuk masalah yang menantang secara klasik, bahkan pada skala perangkat penuh di QPU IBMยฎ terbesar.

Solver bersifat fleksibel dan dapat digunakan untuk memecahkan masalah optimasi kombinatorial yang didefinisikan sebagai fungsi objektif atau graf sembarang. Masalah tidak perlu dipetakan ke topologi perangkat. Baik masalah tidak terkendali maupun terkendali dapat diselesaikan, asalkan kendala dapat dirumuskan sebagai suku penalti. Contoh-contoh yang disertakan dalam panduan ini menunjukkan cara memecahkan masalah optimasi skala utilitas yang tidak terkendali dan terkendali menggunakan berbagai tipe input Solver. Contoh pertama melibatkan masalah Max-Cut yang didefinisikan pada graf 3-Regular dengan 156 simpul, sementara contoh kedua menangani masalah Minimum Vertex Cover 50 simpul yang didefinisikan oleh fungsi biaya.

Untuk mendapatkan akses ke Optimization Solver, hubungi Q-CTRL.

Deskripsi fungsiโ€‹

Solver sepenuhnya mengoptimalkan dan mengotomatiskan seluruh algoritma, mulai dari supresi kesalahan di tingkat perangkat keras hingga pemetaan masalah yang efisien dan optimasi klasik loop tertutup. Di balik layar, pipeline Solver mengurangi kesalahan di setiap tahap, memungkinkan peningkatan performa yang dibutuhkan untuk penskalaan yang bermakna. Alur kerja yang mendasarinya terinspirasi dari Quantum Approximate Optimization Algorithm (QAOA), yang merupakan algoritma hibrida kuantum-klasik. Untuk ringkasan lengkap alur kerja Optimization Solver, lihat manuskrip yang dipublikasikan.

Visualisasi alur kerja Optimization Solver

Untuk memecahkan masalah umum dengan Optimization Solver:

  1. Definisikan masalahmu sebagai fungsi objektif, graf, atau rantai spin SparsePauliOp.
  2. Hubungkan ke fungsi melalui Qiskit Functions Catalog.
  3. Jalankan masalah dengan Solver dan ambil hasilnya.

Input dan outputโ€‹

Inputโ€‹

NamaTipeDeskripsiWajibDefaultContoh
problemstr atau SparsePauliOpSalah satu representasi yang tercantum di bawah "Format masalah yang diterima"YaN/APoly(2.0*n[0]*n[1] + 2.0*n[0]*n[2] - 3.13520241298341*n[0] + 2.0*n[1]*n[2] - 3.14469748506794*n[1] - 3.18897660121566*n[2] + 6.0, n[0], n[1], n[2], domain='RR')
problem_typestrNama kelas masalah; hanya digunakan untuk definisi masalah graf dan rantai spin, yang terbatas pada "maxcut" atau "spin_chain"; tidak diperlukan untuk definisi masalah fungsi objektif sembarangTidakNone"maxcut"
backend_namestrNama Backend yang akan digunakanTidakBackend paling tidak sibuk yang dapat diakses oleh instance-mu"ibm_fez"
optionsdictOpsi input, termasuk: (Opsional) session_id: str; perilaku default membuat Session baruTidakNone{"session_id": "cw2q70c79ws0008z6g4g"}

Format masalah yang diterima:

  • Representasi ekspresi polinomial dari fungsi objektif. Idealnya dibuat di Python dengan objek SymPy Poly yang sudah ada dan diformat menjadi string menggunakan sympy.srepr.
  • Representasi graf dari tipe masalah tertentu. Graf harus dibuat menggunakan library networkx di Python. Kemudian dikonversi ke string menggunakan fungsi networkx [nx.readwrite.json_graph.adjacency_data](http://nx.readwrite.json_graph.adjacency_data.).
  • Representasi rantai spin dari masalah tertentu. Rantai spin harus direpresentasikan sebagai objek SparsePauliOp; lihat dokumentasi untuk detail lebih lanjut.

Backend yang didukung: Jalankan kode berikut untuk melihat daftar Backend yang saat ini didukung. Jika perangkatmu tidak terdaftar, hubungi Q-CTRL untuk menambahkan dukungan.

# 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_fez')>,
<IBMBackend('ibm_brisbane')>,
<IBMBackend('ibm_pittsburgh')>,
<IBMBackend('ibm_kingston')>,
<IBMBackend('ibm_torino')>,
<IBMBackend('ibm_marrakesh')>]

Opsi:

NamaTipeDeskripsiDefault
session_idstrID Session Qiskit Runtime yang sudah ada"cw4r3je6f0t010870y3g"
job_tagslist[str]Daftar tag job[]

Outputโ€‹

NamaTipeDeskripsiContoh
resultdict[str, Any]Solusi dan metadata yang tercantum di bawah "Isi kamus hasil"{'solution_bitstring_cost': 3.0, 'final_bitstring_distribution': {'000001': 100, '000011': 2}, 'iteration_count': 3, 'solution_bitstring': '000001', 'variables_to_bitstring_index_map': {n[1]': 5, 'n[2]': 4, 'n[3]': 3, 'n[4]': 2, 'n[5]': 1}, 'best_parameters': [0.19628831763697097, -1.047052334523102], 'warnings': []}

Isi kamus hasil:

NamaTipeDeskripsi
solution_bitstring_costfloatBiaya minimum terbaik di semua iterasi
final_bitstring_distributionCountsDictKamus hitungan bitstring yang terkait dengan biaya minimum
solution_bitstringstrBitstring dengan biaya terbaik dalam distribusi akhir
iteration_countintTotal jumlah iterasi QAOA yang dilakukan oleh Solver
variables_to_bitstring_index_mapfloatPemetaan dari variabel ke bit yang setara dalam bitstring
best_parameterslist[float]Parameter beta dan gamma yang dioptimalkan di semua iterasi
warningslist[str]Peringatan yang dihasilkan saat mengkompilasi atau menjalankan QAOA (default-nya None)

Tolok ukurโ€‹

Hasil tolok ukur yang dipublikasikan menunjukkan bahwa Solver berhasil memecahkan masalah dengan lebih dari 120 Qubit, bahkan mengungguli hasil yang sebelumnya dipublikasikan pada anil kuantum dan perangkat ion terjebak. Metrik tolok ukur berikut memberikan indikasi kasar tentang akurasi dan penskalaan tipe masalah berdasarkan beberapa contoh. Metrik aktual bisa berbeda berdasarkan berbagai fitur masalah, seperti jumlah suku dalam fungsi objektif (kepadatan) dan lokalitasnya, jumlah variabel, dan orde polinomial.

"Jumlah Qubit" yang ditunjukkan bukanlah batasan keras tetapi merepresentasikan ambang batas kasar di mana kamu dapat mengharapkan akurasi solusi yang sangat konsisten. Ukuran masalah yang lebih besar telah berhasil dipecahkan, dan pengujian di luar batas ini sangat dianjurkan.

Konektivitas Qubit sembarang didukung di semua tipe masalah.

Tipe masalahJumlah QubitContohAkurasiTotal waktu (s)Penggunaan runtime (s)Jumlah iterasi
Masalah kuadratik dengan koneksi jarang1563-regular Max-Cut100%176429316
Optimasi biner orde tinggi156Model spin-glass Ising100%146127216
Masalah kuadratik dengan koneksi padat50Max-Cut penuh terkoneksi100%175826812
Masalah terkendali dengan suku penalti50Weighted Minimum Vertex Cover dengan kepadatan tepi 8%100%107421510

Mulaiโ€‹

Pertama, autentikasi menggunakan kunci API IBM Quantum-mu. Kemudian, pilih Qiskit Function sebagai berikut. (Cuplikan ini mengasumsikan kamu sudah menyimpan akunmu ke lingkungan lokalmu.)

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")

# Access Function
solver = catalog.load("q-ctrl/optimization-solver")

Contoh: Optimasi tidak terkendaliโ€‹

Jalankan masalah maximum cut (Max-Cut). Contoh berikut mendemonstrasikan kemampuan Solver pada masalah Max-Cut graf tidak berbobot 3-regular dengan 156 simpul, tapi kamu juga bisa memecahkan masalah graf berbobot. Selain qiskit-ibm-catalog, kamu juga akan menggunakan paket berikut untuk menjalankan contoh ini: networkx dan numpy. Kamu bisa menginstal paket-paket ini dengan membatalkan komentar sel berikut jika kamu menjalankan contoh ini di notebook menggunakan kernel IPython.

# %pip install networkx numpy

1. Definisikan masalahโ€‹

Kamu bisa menjalankan masalah Max-Cut dengan mendefinisikan masalah graf dan menentukan problem_type='maxcut'.

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)
# Optionally, visualize the graph
nx.draw_networkx(
maxcut_graph, nx.kamada_kawai_layout(maxcut_graph), node_size=100
)

Output of the previous code cell

Solver menerima string sebagai input definisi masalah.

# Convert graph to string
problem_as_str = nx.readwrite.json_graph.adjacency_data(maxcut_graph)

2. Jalankan masalahโ€‹

Saat menggunakan metode input berbasis graf, tentukan tipe masalah.

# This cell is hidden from users
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend_name = service.least_busy(n_qubits=156).name
# Solve the problem
maxcut_job = solver.run(
problem=problem_as_str,
problem_type="maxcut",
backend_name=backend_name, # E.g. "ibm_fez"
)

Periksa status workload Qiskit Function-mu atau ambil hasil sebagai berikut:

# Get job status
print(maxcut_job.status())
QUEUED

3. Ambil hasilnyaโ€‹

Ambil nilai potongan optimal dari kamus hasil.

catatan
Pemetaan variabel ke bitstring mungkin telah berubah. Kamus output berisi sub-kamus variables_to_bitstring_index_map, yang membantu memverifikasi urutannya.
# 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}")
Optimal cut value: 209.0

Kamu bisa memverifikasi akurasi hasil dengan memecahkan masalah secara klasik menggunakan solver open-source seperti PuLP jika graf tidak terhubung padat. Masalah dengan kepadatan tinggi mungkin memerlukan solver klasik tingkat lanjut untuk memvalidasi solusinya.

Contoh: Optimasi terkendaliโ€‹

Contoh Max-Cut sebelumnya adalah masalah optimasi biner kuadratik tidak terkendali yang umum. Optimization Solver Q-CTRL dapat digunakan untuk berbagai tipe masalah, termasuk optimasi terkendali. Kamu bisa memecahkan tipe masalah sembarang dengan memasukkan definisi masalah yang direpresentasikan sebagai polinomial di mana kendala dimodelkan sebagai suku penalti.

Contoh berikut mendemonstrasikan cara membangun fungsi biaya untuk masalah optimasi terkendali, minimum vertex cover (MVC). Selain paket qiskit-ibm-catalog dan qiskit, kamu juga akan menggunakan paket berikut untuk menjalankan contoh ini: numpy, networkx, dan sympy. Kamu bisa menginstal paket-paket ini dengan membatalkan komentar sel berikut jika kamu menjalankan contoh ini di notebook menggunakan kernel IPython.

# %pip install numpy networkx sympy

1. Definisikan masalahโ€‹

Definisikan masalah MVC acak dengan membuat graf dengan simpul berbobot acak.

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)

Output of the previous code cell

Model optimasi standar untuk MVC berbobot dapat dirumuskan sebagai berikut. Pertama, penalti harus ditambahkan untuk setiap kasus di mana sebuah tepi tidak terhubung ke simpul dalam subset. Oleh karena itu, misalkan ni=1n_i = 1 jika simpul ii ada dalam cover (yaitu, dalam subset) dan ni=0n_i = 0 jika tidak. Kedua, tujuannya adalah meminimalkan jumlah total simpul dalam subset, yang dapat direpresentasikan oleh fungsi berikut:

Minimizey=โˆ‘iโˆˆVฯ‰ini\textbf{Minimize}\qquad y = \sum_{i\in V} \omega_i n_i

# 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

Sekarang setiap tepi dalam graf harus menyertakan setidaknya satu titik ujung dari cover, yang dapat diekspresikan sebagai ketidaksamaan:

ni+njโ‰ฅ1ย forย allย (i,j)โˆˆEn_i + n_j \ge 1 \texttt{ for all } (i,j)\in E

Setiap kasus di mana sebuah tepi tidak terhubung ke simpul cover harus dikenai penalti. Ini dapat direpresentasikan dalam fungsi biaya dengan menambahkan penalti berbentuk P(1โˆ’niโˆ’nj+ninj)P(1-n_i-n_j+n_i n_j) di mana PP adalah konstanta penalti positif. Dengan demikian, alternatif tidak terkendali untuk ketidaksamaan terkendali pada MVC berbobot adalah:

Minimizey=โˆ‘iโˆˆVฯ‰ini+P(โˆ‘(i,j)โˆˆE(1โˆ’niโˆ’nj+ninj))\textbf{Minimize}\qquad y = \sum_{i\in V}\omega_i n_i + P(\sum_{(i,j)\in E}(1 - n_i - n_j + n_i n_j))

# 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]
)

2. Jalankan masalahโ€‹

# Solve the problem
mvc_job = solver.run(
problem=srepr(cost_function),
backend_name=backend_name, # E.g. "ibm_fez"
)

Periksa status workload Qiskit Function-mu atau ambil hasil sebagai berikut:

print(mvc_job.status())

3. Dapatkan hasilnyaโ€‹

Ambil solusi dan analisis hasilnya. Karena masalah ini memiliki simpul berbobot, solusinya bukan sekadar jumlah minimum simpul yang dicakup. Sebaliknya, biaya solusi merepresentasikan jumlah bobot simpul yang termasuk dalam vertex cover. Ini merepresentasikan total "biaya" atau "bobot" untuk mencakup semua tepi dalam graf menggunakan simpul yang dipilih.

mvc_result = mvc_job.result()
qctrl_cost = mvc_result["solution_bitstring_cost"]

# Print results
print(f"Solution cost: {qctrl_cost}")
Solution cost: 10.248198273708624

Dapatkan dukunganโ€‹

Untuk pertanyaan atau masalah apa pun, hubungi Q-CTRL.

Langkah selanjutnyaโ€‹

Source: IBM Quantum docs โ€” updated 5 Mei 2026
English version on doQumentation โ€” updated 7 Mei 2026
This translation based on the English version of 11 Mar 2026