SQOA Solver - وظيفة Qiskit Function من JIJ
راجع مرجع API.
Qiskit Functions ميزة تجريبية متاحة فقط لمستخدمي IBM Quantum® Premium Plan وFlex Plan وOn-Prem (عبر IBM Quantum Platform API) Plan. وهي في مرحلة المعاينة وقابلة للتغيير.
نظرة عامة
مع SQOA Solver من JIJ، تقدر تحل مسائل التحسين التوافقي الكبيرة على حواسيب IBM® الكمية. يعتمد الحلّال على خوارزمية التحسين الكمي المعتمدة على العينات مع الاسترخاء الكمي (SQOA-QR) [1]. على عكس الخوارزميات الكمية التي تستخدم تطابقًا واحدًا لواحد بين المتغيرات القرارية الكلاسيكية والكيوبتات، يقدر SQOA Solver يتعامل مع مسائل تحسين فيها متغيرات أكثر من عدد الكيوبتات المتوفرة في الأجهزة الكمية الحالية. كما أن تصميمه المعتمد على العينات يجعله أقل حساسية للضوضاء الفيزيائية في العتاد الكمي الحالي. وبمجموع هذه الميزات يناسب SQOA Solver مسائل التحسين في هذه المرحلة من الحوسبة الكمية.
يتعامل الحلّال مع مسائل التحسين الثنائي غير المقيّد التربيعي (QUBO) المعطاة كصياغة رياضية كلاسيكية، ويحوِّل الصياغة الكلاسيكية تلقائيًا إلى الإعداد الكمي. وتقدر كذلك تحوِّل المسائل المقيّدة إلى مسائل غير مقيّدة باستخدام طريقة الجزاء (penalty method).
تصف الأقسام التالية سير عمل الحلّال ونتائج القياس المعياري وأمثلة شاملة تنمذج المسائل باستخدام qiskit-addon-opt-mapper واختياريًا Open Mathematical prograMming eXchange (OMMX). OMMX هو تنسيق بيانات مفتوح وSDK يبسِّط تبادل مسائل التحسين بين الأدوات البرمجية.
الوصف
ينفِّذ SQOA Solver خوارزمية التحسين الكمي المعتمدة على العينات مع الاسترخاء الكمي (SQOA-QR) ويحيطها بمعالجة مسبقة ولاحقة كلاسيكية. يشرح هذا القسم إطار SQOA وبماذا يختلف عن خوارزمية التحسين التقريبي الكمي (QAOA).
يوضح الشكل التالي مخططًا لسير عمل SQOA Solver.
إطار SQOA
SQOA إطار معتمد على العينات للتحسين التوافقي [1]. يجمع بين تقنيتين: التحسين بالوصول العشوائي الكمي (QRAO) [2]، الذي يرمِّز المسألة في استرخاء كمي، والتقطير القُطري الكمي المعتمد على العينات (SQD) [3]، المعروف أيضًا باسم تفاعل التكوين المختار كميًا (QSCI) [4]، الذي يستخدم الحاسوب الكمي فقط لأخذ عينات من السلاسل الثنائية (bitstrings) ثم يجد الحالة ذات الطاقة المنخفضة على حاسوب كلاسيكي. SQOA إطار بمعنى أنه يثبِّت هذا الدمج لكنه يترك التفاصيل لكل تنفيذ، مثل كيفية إسناد المتغيرات إلى الكيوبتات وأي الدوائر تولِّد العينات.
-
الاسترخاء الكمي مع QRAO. تمثِّل QAOA والمقاربات الأخرى المعتمدة على Ising كل متغير ثنائي بالمؤثر لكيوبته. أما QRAO فتستخدم أيضًا المؤثرين و. مع شيفرة الوصول العشوائي الكمي (QRAC) من النوع (3,1)، يشترك حتى ثلاثة متغيرات ثنائية في كيوبت واحد، ويُمثَّل كل متغير بمؤثر Pauli مختلف.
وهكذا يصير QUBO هاميلتونيًا مسترخيًا يحتاج كيوبتات أقل من هاميلتوني Ising. المتغيرات التي تتفاعل في QUBO لازم توضع على كيوبتات مختلفة. لو اشتركت في كيوبت واحد، فإن حاصل ضرب مؤثرات Pauli الخاصة بها سيختزل إلى مؤثر واحد على ذلك الكيوبت (مثلًا )، ولن يعود الهاميلتوني المسترخي يمثِّل تفاعلها.
لذلك يحدد إسناد المتغيرات إلى الكيوبتات عدد الكيوبتات وجودة الاسترخاء معًا، ويصمم SQOA Solver هذا الإسناد في معالجته المسبقة.
-
التقطير القُطري الكمي المعتمد على العينات (SQD). يحضِّر الحاسوب الكمي أولًا حالة كمية تتداخل مع الحالات منخفضة الطاقة للهاميلتوني المسترخي ثم يأخذ منها عينات من السلاسل الثنائية. بعدها يسقِط حاسوب كلاسيكي الهاميلتوني المسترخي على الفضاء الجزئي الذي تمتده السلاسل الثنائية المأخوذة ويقطِّره لتقريب الحالة الأرضية.
بما أن الهاميلتوني المسترخي غير قُطري، فإن التقطير يجمع السلاسل الثنائية المأخوذة في تراكب. أما مع هاميلتوني Ising القُطري، فكل سلسلة ثنائية هي أصلًا حالة ذاتية، وسيقتصر التقطير على اختيار أفضل عينة. وقد طُبِّقت المقاربة نفسها على مسائل واسعة النطاق في الكيمياء الكمية.
الحالة الأرضية التقريبية التي نحصل عليها من SQD لا تقابل مباشرةً حلًا كلاسيكيًا للمسألة الأصلية، لذلك لازم فك ترميز الحل الكلاسيكي منها. وبما أن هذه الحالة تُحسب على حاسوب كلاسيكي، فإن فك الترميز، المسمى التقريب (rounding)، هو معالجة لاحقة كلاسيكية. يستخدم SQOA Solver تقنيات فك ترميز مصممة للحصول على حلول كلاسيكية أفضل بطريقة استدلالية.
يقارن الجدول التالي بين SQOA وQAOA، وهي مقاربة تغايرية شائعة لنفس فئة المسائل.
| QAOA | SQOA | |
|---|---|---|
| الكيوبتات لعدد من المتغيرات الثنائية | كيوبت واحد يحمل حتى ثلاثة من المتغيرات. العدد الدقيق يعتمد على بنية المسألة | |
| استخدام QPU | يقدِّر طاقة الدوائر ذات المعاملات بشكل متكرر داخل حلقة تحسين كلاسيكية | يأخذ عينات من السلاسل الثنائية فقط. لا تُدرَّب أي معاملات دوائر على QPU |
| من العينات إلى الحل | يختار أفضل سلسلة ثنائية مقاسة | يقطِّر الهاميلتوني المسترخي في الفضاء الجزئي للعينات على حاسوب كلاسيكي ويقرِّب الحالة الناتجة |
حول SQOA-QR، يضيف SQOA Solver معالجة كلاسيكية. تثبِّت معالجته المسبقة المتغيرات التي يمكن تحديد قيمها المثلى مسبقًا وتصمم إسناد المتغيرات إلى الكيوبتات. وتحسِّن معالجته اللاحقة الحل المقرَّب ببحث محلي، وتقدر توقفه بـ postprocessing_level=0.
القياس المعياري (Benchmarks)
قد يعتمد الأداء على نسخة المسألة وعلى خطوات المعالجة اللاحقة معًا. في بعض الحالات قد تحقق العينات الكلاسيكية والعينات المولَّدة كميًا جودة حل نهائية متقاربة بعد معالجة لاحقة مكافئة. لذلك لازم أن يراعي التقييم سير عمل التحسين بكامله.
تعطي مقاييس القياس المعياري التالية مؤشرًا عامًا على جودة الحل وضغط الكيوبتات ووقت التنفيذ عبر أحجام وبنى مسائل مختارة. يسرد الجدول مجموعة من نسخ مسألة المجموعة المستقلة العظمى من مكتبة القياس المعياري للتحسين الكمي (QOBLIB) ونسختين من MaxCut ثلاثي الانتظام. تقدر تحمِّل نسخ QOBLIB ككائنات ommx.v1.Instance مع حلولها المثلى باستخدام حزمة ommx-quantum-benchmarks.
شُغِّلت كل نسخة 10 مرات على معالج IBM Heron r2. يعدّ Number of qubits الكيوبتات المستخدمة فعليًا على العتاد بعد المعالجة المسبقة وترميز QRAC. نسبة الضغط تعتمد على النسخة. ويعرض Approximation ratio (AR) جودة أفضل حل وُجد عبر التشغيلات العشر:
حيث هي أفضل قيمة للدالة الهدف وُجدت و هي قيمة الدالة الهدف المثلى المعروفة. كل النسخ مسائل تعظيم بقيمة مثلى موجبة، لذلك AR بحد أقصى 100%، وتعني 100% في عمود Approximation ratio أن الحلّال وجد حلًا أمثل. Total time هو متوسط الوقت المجمَّع لـ QPU وCPU لكل تشغيل. أما QPU time فهو متوسط استخدام IBM Quantum Compute لكل تشغيل.
| النسخة | عدد المتغيرات | عدد الكيوبتات | نسبة التقريب | الوقت الكلي (ثوانٍ) | وقت QPU (ثوانٍ) |
|---|---|---|---|---|---|
| maxcut_384_nodes | 384 | 129 | 98.5% | 62.1 | 12.0 |
| gen200_p0-9_44 | 200 | 67 | 100% | 38.0 | 12.0 |
| es60fst02 | 186 | 42 | 100% | 24.7 | 12.0 |
| es60fst04 | 162 | 29 | 100% | 17.9 | 12.0 |
| maxcut_150_nodes | 150 | 51 | 100% | 23.1 | 12.0 |
| sloane_1dc_128 | 128 | 37 | 93.8% | 19.1 | 12.0 |
| sloane_2dc_128 | 128 | 8 | 100% | 12.3 | 11.5 |
| C125-9 | 125 | 43 | 100% | 22.3 | 12.0 |
| es60fst01 | 123 | 12 | 100% | 13.6 | 12.0 |
| es60fst03 | 113 | 26 | 100% | 14.9 | 12.0 |
| sloane_1dc_64 | 64 | 16 | 100% | 13.4 | 11.9 |
| chesapeake | 39 | 13 | 100% | 13.1 | 12.0 |
| football | 35 | 6 | 100% | 12.5 | 12.0 |
| karate | 34 | 2 | 100% | 6.2 | 6.0 |
| ibm32 | 32 | 11 | 100% | 12.9 | 12.0 |
| farm | 17 | 4 | 100% | 8.5 | 8.0 |
البدء
تلقى معلومات الوصول إلى هذه Qiskit Function في Qiskit Functions Catalog.
يوضح هذا القسم كيف تسجِّل الدخول وتحمِّل الوظيفة، وكيف تجهِّز مسألة بتنسيق القاموس الذي يقبله SQOA Solver باستخدام OptimizationProblem من qiskit-addon-opt-mapper. وتشغِّل الأمثلة التالية الوظيفة وتقرأ النتيجة.
سجِّل الدخول وحمِّل الوظيفة
أولًا، سجِّل الدخول بـ مفتاح IBM Quantum API الخاص بك. (يفترض الكود التالي أنك حفظت حسابك مسبقًا في بيئتك المحلية.) بعدها أنشئ عميل كتالوج (catalog client) كالتالي:
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"jijmodeling": "jijmodeling", "networkx": "networkx", "ommx": "ommx", "qiskit_addon_opt_mapper": "qiskit-addon-opt-mapper", "qiskit_ibm_catalog": "qiskit-ibm-catalog"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# verify that you have access to the function
catalog.list()
[QiskitFunction(jij/sqoa-solver)]
solver = catalog.load("jij/sqoa-solver")
جهِّز المدخلات باستخدام qiskit-addon-opt-mapper
يُنمذج هذا الدليل المسائل بفئة OptimizationProblem من qiskit-addon-opt-mapper. يقبل SQOA Solver مسألة QUBO كقاموس معاملات بتنسيق السلسلة النصية للصف (tuple-string) الذي تستخدمه وظائف التحسين من IBM، لذلك يتبع كل مثال في هذا الدليل نمط التجهيز نفسه من جهة العميل:
-
اكتب النموذج. أنشئ
OptimizationProblem، وأضف متغيرات قرار ثنائية، وحدِّد الدالة الهدف وأي قيود. -
حوِّل إلى QUBO. حوِّل المسألة بـ
OptimizationProblemToQubo، الذي يضيف أي قيود إلى الدالة الهدف كحدود جزاء ويعيد مسألة تصغير مكافئة غير مقيّدة. -
حوِّل إلى قاموس. مرِّر QUBO إلى الدالة المساعدة
to_problem_dict()المعرَّفة في القسم التالي، ومرِّر النتيجة إلىsolver.run()كـproblem، معvariable_type="binary".
يصغِّر SQOA Solver دائمًا مسألة القاموس، وهذا يطابق مسألة التصغير التي يعيدها OptimizationProblemToQubo. لذلك في مسألة التعظيم تكون قيمة objective_value المعادة هي سالب الدالة الهدف الأصلية. لتقرأ النتيجة بمصطلحات المسألة الأصلية، قيِّم الإسناد المعاد بـ OptimizationProblem، كما تبيّن الأمثلة. لتفاصيل تنسيق القاموس، راجع تنسيقات المسائل المقبولة في مرجع API.
# %pip install qiskit-addon-opt-mapper
عرِّف الدالة المساعدة التالية مرة واحدة وأعد استخدامها في كل مثال. تحوِّل QUBO الذي يعيده OptimizationProblemToQubo إلى تنسيق القاموس. تستخدم المفاتيح فهارس متغيرات QUBO، لذلك تقابل مفاتيح الحل x_0 وx_1 وهكذا في النتيجة تلك الفهارس. يحصل كل متغير على مدخل خطي، حتى لو كان معامله صفرًا، حتى يغطي الحل المعاد كل المتغيرات.
from qiskit_addon_opt_mapper import OptimizationProblem
from qiskit_addon_opt_mapper.converters import OptimizationProblemToQubo
def to_problem_dict(qubo: OptimizationProblem) -> dict[str, float]:
"""Convert a QUBO from OptimizationProblemToQubo to the SQOA Solver dictionary format."""
objective = qubo.objective
payload = {"()": objective.constant}
# Keep every variable in the problem, even with a zero linear coefficient.
payload.update({f"({i},)": 0.0 for i in range(qubo.get_num_vars())})
for i, coefficient in objective.linear.to_dict().items():
payload[f"({i},)"] += coefficient
for (i, j), coefficient in objective.quadratic.to_dict().items():
# Fold a binary diagonal term x_i * x_i = x_i into the linear term.
key = f"({i},)" if i == j else f"({i}, {j})"
payload[key] = payload.get(key, 0.0) + coefficient
return {key: float(value) for key, value in payload.items()}
المثال 1: MaxCut على رسم بياني ثلاثي الانتظام
كثير من مسائل الرسوم البيانية، مثل MaxCut، هي NP-hard وهي مرشحات طبيعية للتحسين الكمي. ثبِّت networkx كاعتمادية إضافية لتشغيل هذا المثال:
# %pip install networkx
1. اكتب النموذج
أسند متغيرًا ثنائيًا لكل رأس في رسم بياني ليدل على جانبه من القطع. تُقطع الحافة عندما يكون طرفاها على جانبين مختلفين، لذلك يكون حجم القطع:
هذه الدالة الهدف هي أصلًا QUBO بلا قيود، لذلك يكتفي OptimizationProblemToQubo بتحويل التعظيم إلى التصغير المكافئ ويُبقي المتغيرات كما هي. تبني فئة التطبيق Maxcut في qiskit_addon_opt_mapper.applications النموذج نفسه بـ Maxcut(G).to_optimization_problem().
import networkx as nx
G = nx.random_regular_graph(3, 40, seed=42)
linear = {v: 0 for v in G.nodes}
quadratic = {}
for u, v in G.edges:
linear[u] += 1
linear[v] += 1
quadratic[(u, v)] = -2
maxcut = OptimizationProblem("MaxCut")
maxcut.binary_var_list(G.number_of_nodes(), name="x")
maxcut.maximize(linear=linear, quadratic=quadratic)
2. شغِّل الحلّال
حوِّل النموذج إلى QUBO ثم إلى قاموس، وأرسله. problem وvariable_type مطلوبان. أما backend_name فاختياري. وعند حذفه أو كونه None، تختار الوظيفة QPU التشغيلية الأقل انشغالًا من المتاحة لنسختك.
يقبل قاموس options القيم shots وseed وsession وpostprocessing_level وjob_tags. للأوصاف والقيم الافتراضية، راجع مرجع API.
qubo = OptimizationProblemToQubo().convert(maxcut)
job = solver.run(
problem=to_problem_dict(qubo),
variable_type="binary",
backend_name="ibm_fez",
options={
"shots": 4096,
"seed": 42,
},
)
3. استرجع النتيجة
تعيد job.result() قاموسًا بأربعة مفاتيح:
-
solutionهو الإسناد الكامل للمتغيرات، بمفاتيحx_i، حيثiهو فهرس المتغير (مثلًاx_3). -
objective_valueوfeasibleهما قيمة الدالة الهدف وجدوى ذلك الإسناد، مقيَّمين على القاموس المرسل. -
يحتوي
metadataعلىsolver_infoوresource_usage.
بما أن QUBO هو صيغة التصغير لـ MaxCut، فإن objective_value هو سالب حجم القطع. قيِّم الإسناد على OptimizationProblem الأصلية لتقرأ حجم القطع مباشرةً.
result = job.result()
x = [result["solution"][f"x_{i}"] for i in range(maxcut.get_num_vars())]
print(f"Cut value: {maxcut.objective.evaluate(x)}")
print(f"Nodes on side 1: {[v for v, value in enumerate(x) if value > 0.5]}")
Cut value: 55.0
Nodes on side 1: [5, 7, 9, 11, 14, 16, 17, 19, 21, 23, 24, 26, 30, 31, 33, 34, 36, 37, 38]
4. افحص استخدام الموارد
يعرض result["metadata"]["resource_usage"] الوقت المستغرق في كل مرحلة تنفيذ. تعرض المراحل غير RUNNING: EXECUTING_QPU القيمة CPU_TIME، وهي الوقت الفعلي للمرحلة بالثواني، عندما تكون متاحة.
تعرض مرحلة RUNNING: EXECUTING_QPU القيمة QPU_TIME، وهي استخدام QPU لكل مهام Quantum Compute في التشغيل، إذا كان الاستخدام النهائي متاحًا لكل مهمة. للتفاصيل، راجع مرجع API.
for phase, metrics in result["metadata"]["resource_usage"].items():
line = f"{phase:36s}"
if "CPU_TIME" in metrics:
line += f" CPU {metrics['CPU_TIME']:8.1f} s"
if "QPU_TIME" in metrics:
line += f" QPU {metrics['QPU_TIME']:8.1f} s"
print(line)
RUNNING: MAPPING CPU 3.2 s
RUNNING: OPTIMIZING_FOR_HARDWARE CPU 5.0 s
RUNNING: WAITING_FOR_QPU CPU 1.1 s
RUNNING: EXECUTING_QPU QPU 3.0 s
RUNNING: POST_PROCESSING CPU 0.9 s
المثال 2: حوِّل مسألة مقيّدة إلى QUBO
يقبل SQOA Solver المسائل غير المقيّدة. يوضح هذا المثال كيف تحوِّل مسألة مقيّدة إلى QUBO بـ OptimizationProblemToQubo وتعيد ربط النتيجة بمتغيرات المسألة الأصلية.
selection = OptimizationProblem("ConstrainedExample")
selection.binary_var_list(2, name="x")
selection.maximize(linear={"x0": 1, "x1": 1})
selection.linear_constraint({"x0": 1, "x1": 1}, "<=", 1, name="at_most_one")
print(selection.prettyprint())
Problem name: ConstrainedExample
Maximize
x0 + x1
Subject to
Linear constraints (1)
x0 + x1 <= 1 'at_most_one'
Binary variables (2)
x0 x1
يضيف OptimizationProblemToQubo القيود إلى الدالة الهدف كحدود جزاء ويحوِّل المسألة إلى تصغير. وزن الجزاء المناسب يعتمد على المسألة.
بعد التشغيل، تعيد interpret() ربط إسناد QUBO بمتغيرات المسألة الأصلية.
قيِّم الدالة الهدف والجدوى على المسألة الأصلية. بالنسبة لمسألة القاموس، يشير الحقل feasible في النتيجة إلى مجال المتغيرات فقط، لأن القاموس لا يحتوي قيودًا.
converter = OptimizationProblemToQubo(penalty=4.0)
qubo = converter.convert(selection)
job = solver.run(
problem=to_problem_dict(qubo),
variable_type="binary",
backend_name="ibm_fez",
)
result = job.result()
x_qubo = [result["solution"][f"x_{i}"] for i in range(qubo.get_num_vars())]
x = converter.interpret(x_qubo)
print("Objective:", selection.objective.evaluate(x))
print("Feasible:", selection.is_feasible(x))
print("x values:", x)
Objective: 1.0
Feasible: True
x values: [1. 0.]
المثال 3: أرسل نسخة OMMX
يقبل SQOA Solver أيضًا ommx.v1.Instance من SDK الخاص بـ OMMX، وهي تحفظ أسماء المتغيرات والأرقام السفلية وبيانات التحويل الوصفية مع المسألة. مقارنةً بالقاموس، لمدخل OMMX المزايا التالية:
-
تحتوي النتيجة أيضًا على
ommx.v1.Solutionالقانوني فيsolver_info["ommx_solution"]. -
تُقيَّم
objective_valueبمعنى النسخة، لذلك لا تُنفى الدالة الهدف في مسألة التعظيم. -
في النسخة المحوَّلة في مكانها بـ
Instance.to_qubo()، تُقيَّمfeasibleمقابل القيود الأصلية.
يبني هذا المثال نموذج MaxCut من المثال 1 باستخدام JijModeling، وهي أداة نمذجة للتحسين الرياضي تُترجم النماذج إلى نسخ OMMX. ثبِّت JijModeling، وهي تثبِّت أيضًا حزمة ommx:
# %pip install "jijmodeling~=2.8.0"
يتبادل SQOA Solver بيانات OMMX كسلاسل Base64 قياسية مع حشو. عرِّف الدوال المساعدة التالية لهذا التحويل:
-
تحوِّل
to_problem_payload()كائنommx.v1.Instanceإلى السلسلة النصية التي تمرِّرها كـproblem. -
تفك
to_ommx_solution()ترميزommx.v1.Solutionالقانوني من النتيجة.
import base64
from ommx.v1 import Instance, Solution
def to_problem_payload(instance: Instance) -> str:
"""Serialize an OMMX instance into the `problem` string for SQOA Solver."""
return base64.b64encode(instance.to_bytes()).decode()
def to_ommx_solution(result: dict) -> Solution:
"""Decode the canonical OMMX solution from a SQOA Solver result."""
payload = result["metadata"]["solver_info"]["ommx_solution"]
return Solution.from_bytes(base64.b64decode(payload, validate=True))
1. اكتب النموذج باستخدام JijModeling
الصياغة المعتادة بالسبين لـ MaxCut على رسم بياني تسند لكل رأس. تُقطع الحافة عندما ، لذلك يكون حجم القطع:
لا يوفر JijModeling متغير قرار سبين أصليًا، ويقبل SQOA Solver متغيرات QUBO ثنائية فقط. لذلك صرِّح بـ وعرِّف التعبير ذا قيم السبين داخل النموذج. وبهذا التعبير تبقى الدالة الهدف بصيغة السبين القياسية، وتظل النسخة المترجمة QUBO ثنائيًا.
import jijmodeling as jm
@jm.Problem.define("MaxCut", sense=jm.ProblemSense.MAXIMIZE)
def maxcut_model(problem: jm.DecoratedProblem):
V = problem.Natural() # number of nodes
E = problem.Graph(dtype=V) # edge list
b = problem.BinaryVar(shape=(V,))
s = 1 - 2 * b # spin-valued expression
problem += jm.sum((1 - s[u] * s[v]) / 2 for u, v in E)
لو عرضت maxcut_model في دفتر ملاحظات (notebook)، فسيظهر الصياغة التالية:
2. ترجم النسخة وشغِّل الحلّال
اربط الرسم البياني من المثال 1 لتترجم ommx.v1.Instance، وأرسلها بـ variable_type="binary". تُرسَل نسخة OMMX دائمًا كمسألة ثنائية.
instance = maxcut_model.eval(
{"V": G.number_of_nodes(), "E": [list(edge) for edge in G.edges]}
)
job = solver.run(
problem=to_problem_payload(instance),
variable_type="binary",
backend_name="ibm_fez",
)
3. استرجع النتيجة
في مدخل OMMX، تكون objective_value هي حجم القطع، وتفك to_ommx_solution() ترميز الحل القانوني حتى تقرأ الإسناد باسم المتغير.
result = job.result()
print(f"Cut value: {result['objective_value']}")
solution = to_ommx_solution(result)
b_values = solution.extract_decision_variables("b")
print(
f"Nodes on side 1: {sorted(v for (v,), value in b_values.items() if value > 0.5)}"
)
Cut value: 55.0
Nodes on side 1: [5, 7, 9, 11, 14, 16, 17, 19, 21, 23, 24, 26, 30, 31, 33, 34, 36, 37, 38]
احصل على الدعم
للدعم، راسلنا على info@j-ij.com.
الخطوات التالية
- اطلب تجربة مجانية لـ SQOA Solver بتعبئة هذا النموذج.
- زر مرجع API الخاص بهذه Qiskit Function.
- جرِّب مثالًا شاملًا في درس مسألة المجموعة المستقلة العظمى التعليمي.
- تعلَّم كيف تنمذج مسائل التحسين باستخدام qiskit-addon-opt-mapper.
- تعلَّم كيف تنمذج مسائل التحسين وتتبادلها باستخدام JijModeling وOMMX.
- اقرأ ورقة SQOA-QR [1] لتعرف أكثر عن إطار SQOA.
المراجع
[1] Matsuyama, H., & Yamashiro, Y. (2025). Sampling-based quantum optimization algorithm with quantum relaxation. 2025 IEEE International Conference on Quantum Computing and Engineering (QCE), 1, 2323–2333. DOI, arXiv:2504.12629
[2] Fuller, B., Hadfield, C., Glick, J. R., Imamichi, T., Itoko, T., Thompson, R. J., Jiao, Y., Kagele, M. M., Blom-Schieber, A. W., Raymond, R., et al. (2024). Approximate solutions of combinatorial problems via quantum relaxations. IEEE Transactions on Quantum Engineering, 5, 1–15. DOI, arXiv:2111.03167
[3] Robledo-Moreno, J., Motta, M., Haas, H., Javadi-Abhari, A., Jurcevic, P., Kirby, W., et al. (2025). Chemistry beyond the scale of exact diagonalization on a quantum-centric supercomputer. Science Advances, 11(25), eadu9991. DOI, arXiv:2405.05068
[4] Kanno, K., Kohda, M., Imai, R., Koh, S., Mitarai, K., Mizukami, W., & Nakagawa, Y. O. (2026). Quantum-selected configuration interaction: Classical diagonalization of Hamiltonians in subspaces selected by quantum computers. Physical Review Research, 8(2), 023268. DOI, arXiv:2302.11320