انتقل إلى المحتوى الرئيسي

Iskay Quantum Optimizer - دالة Qiskit من Kipu Quantum

ملاحظة
  • دوال Qiskit ميزةٌ تجريبية متاحة فقط لمستخدمي خطة IBM Quantum® Premium Plan وFlex Plan وOn-Prem (عبر IBM Quantum Platform API). هي في مرحلة إصدار معاينة وقابلة للتغيير.

نظرة عامة

باستخدام Iskay Quantum Optimizer من Kipu Quantum، يمكنك التعامل مع مسائل التحسين المعقدة على أجهزة IBM® الكمومية. يعتمد هذا المحلّ على خوارزمية bf-DCQO المتطورة التي طوّرتها Kipu، وتستلزم فقط دالة الهدف كمدخل لتوصيل حلول المسألة تلقائياً. تستطيع هذه الخوارزمية التعامل مع مسائل تحسين تصل إلى 156 Qubit، مما يتيح استخدام جميع Qubits في أجهزة IBM الكمومية. يعتمد المحلّ تعييناً واحداً لواحد بين المتغيرات الكلاسيكية والـ Qubits، مما يتيح لك التعامل مع مسائل تحسين تصل إلى 156 متغيراً ثنائياً.

يُتيح هذا المحلّ حلّ مسائل التحسين الثنائي غير المقيّد. إلى جانب صيغة QUBO (التحسين الثنائي التربيعي غير المقيّد) الشائعة الاستخدام، يدعم أيضاً مسائل التحسين ذات الرتب الأعلى (HUBO). يستخدم المحلّ خوارزمية كمومية غير تباينية، تُنجز غالبية الحسابات على الأجهزة الكمومية.

فيما يلي مزيد من التفاصيل حول الخوارزمية المستخدمة ودليل موجز لكيفية استخدام الدالة، إضافةً إلى نتائج المعايرة على أمثلة مسائل متنوعة بأحجام وتعقيدات مختلفة.

الوصف

المحلّ هو تطبيق جاهز للاستخدام لأحدث خوارزميات التحسين الكمومية. يحلّ مسائل التحسين بتشغيل دوائر كمومية شديدة الضغط على العتاد الكمومي. يتحقق هذا الضغط بإدخال حدود مضادة للديباتية (counterdiabatic) في التطور الزمني الأساسي للنظام الكمومي. تُنفذ الخوارزمية عدة تكرارات من عمليات تشغيل العتاد للحصول على الحلول النهائية، وتجمعها مع معالجة لاحقة. تُدمج هذه الخطوات بسلاسة في سير عمل المحلّ وتُنفَّذ تلقائياً.

كيف يعمل محلّ التحسين الكمومي؟

يستعرض هذا القسم أساسيات خوارزمية bf-DCQO المُطبَّقة. يمكن الاطلاع على مقدمة للخوارزمية أيضاً على قناة Qiskit على يوتيوب.

تستند الخوارزمية إلى التطور الزمني لنظام كمومي يتحوّل مع الزمن، حيث يُرمَّز حل المسألة في الحالة الأساسية للنظام الكمومي في نهاية التطور. وفقاً لـمبرهنة الأديباتية، يجب أن يكون هذا التطور بطيئاً لضمان بقاء النظام في حالته الأساسية. رقمنة هذا التطور هي أساس الحوسبة الكمومية الأديباتية الرقمية (DQA) وخوارزمية QAOA الشهيرة. غير أن التطور البطيء المطلوب غير قابل للتطبيق مع تزايد أحجام المسائل، إذ يُفضي إلى تعمّق متزايد في الدوائر. باستخدام البروتوكولات المضادة للديباتية، يمكن قمع الإثارات غير المرغوب فيها التي تحدث خلال أوقات التطور القصيرة مع البقاء في الحالة الأساسية. هنا، تؤدي رقمنة وقت التطور الأقصر هذا إلى دوائر كمومية بعمق أقل وعدد أبواب تشابك أقل.

تستخدم دوائر خوارزميات bf-DCQO عادةً ما يصل إلى عشرة أضعاف أقل من أبواب التشابك مقارنةً بـ DQA، وثلاثة إلى أربعة أضعاف أقل من تطبيقات QAOA القياسية. بسبب العدد الأقل من البوابات، تقع أخطاء أقل خلال تنفيذ الدوائر على العتاد. ولذا، لا يتطلب المحلّ استخدام تقنيات كقمع الأخطاء أو التخفيف منها. تطبيقها في إصدارات مستقبلية يمكن أن يُحسّن جودة الحلول بشكل أكبر.

على الرغم من أن خوارزمية bf-DCQO تستخدم تكرارات، إلا أنها غير تباينية. بعد كل تكرار للخوارزمية، تُقاس توزيع الحالات. يُستخدم التوزيع المُحصَل لحساب ما يُسمى بـ"حقل التحيّز" (bias-field). يتيح حقل التحيّز بدء التكرار التالي من حالة طاقة قريبة من الحل المُوجَد سابقاً. وبهذه الطريقة، تنتقل الخوارزمية مع كل تكرار إلى حلول ذات طاقة أدنى. عادةً، يكفي ما يقارب عشرة تكرارات للتقارب نحو حل، مما يعني في المجمل عدداً أقل بكثير من التكرارات مقارنةً بالخوارزميات التباينية التي تتطلب ما يقارب 100 تكرار.

يجمع المحلّ خوارزمية bf-DCQO مع معالجة لاحقة كلاسيكية. بعد قياس توزيع الحالات، تُجرى عملية بحث محلي. خلال البحث المحلي، تُقلب بتات الحل المُقاس عشوائياً. بعد القلب، تُقيَّم طاقة السلسلة الثنائية الجديدة. إذا كانت الطاقة أقل، تُحتفظ بالسلسلة الثنائية كحل جديد. يُقيَّس البحث المحلي خطياً فقط مع عدد الـ Qubits؛ وبالتالي فهو رخيص حسابياً. بما أن المعالجة اللاحقة تُصحح القلبات الثنائية المحلية، فهي تُعوّض أخطاء قلب البت التي كثيراً ما تكون نتيجة لعدم كمال العتاد وأخطاء القراءة.

سير العمل

يلي ذلك مخطط تفصيلي لسير عمل محلّ التحسين الكمومي.

سير العمل

باستخدام محلّ التحسين الكمومي، يمكن اختزال حل مسألة تحسين على عتاد كمومي في:

  • صياغة دالة الهدف للمسألة
  • الوصول إلى المحلّ عبر دوال Qiskit
  • تشغيل المحلّ وجمع النتائج

المعايرة

تُظهر مقاييس المعايرة أدناه أن المحلّ يتعامل بفعالية مع المسائل التي تصل إلى 156 Qubit، وتوفر نظرة عامة على دقة المحلّ وقابليته للتوسع عبر أنواع مختلفة من المسائل. لاحظ أن مقاييس الأداء الفعلية قد تتفاوت بحسب خصائص المسألة المحددة، كعدد المتغيرات وكثافة وموضعية الحدود في دالة الهدف والرتبة متعددة الحدود.

يتضمن الجدول التالي نسبة التقريب (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% تعني الحصول على الحالة الأساسية للمسألة.

المثالعدد الـ Qubitsنسبة التقريبالوقت الكلي (ث)استخدام وقت التشغيل (ث)إجمالي عدد القياساتعدد التكرارات
MaxCut غير موزون28100%1803030k5
MaxCut غير موزون30100%1803030k5
MaxCut غير موزون32100%1803030k5
MaxCut غير موزون80100%4806090k9
MaxCut غير موزون100100%3306060k6
MaxCut غير موزون120100%3706060k6
HUBO 1156100%60070100k10
HUBO 2156100%60070100k10
  • تم تشغيل حالات MaxCut ذات 28 و30 و32 Qubit على ibm_sherbrooke. أما الحالات ذات 80 و100 و120 Qubit فقد شُغّلت على معالج Heron r2.
  • كذلك شُغّلت حالات HUBO على معالج Heron r2.

جميع حالات المعايرة متاحة على GitHub (انظر حالات المعايرة من Kipu). مثال لتشغيل هذه الحالات موجود في المثال 3: حالات المعايرة.

المدخلات والمخرجات

المدخل

انظر الجدول التالي لجميع معاملات الإدخال التي يقبلها محلّ التحسين الكمومي. يتناول قسم الخيارات اللاحق مزيداً من التفاصيل حول options المتاحة.

الاسمالنوعالوصفمطلوبالافتراضيمثال
problemDict[str, float]معاملات مسألة التحسين مُصاغةً بصيغة QUBO/HUBO أو صيغة الدوران. لمزيد من المعلومات حول مواصفات المسألة، انظر صيغ المسائل المقبولةنعمغير متاح{"()": -21.0, "(0, 4)": 0.5,"(0, 2)": 0.5,"(0, 1)": 0.5,"(1, 3)": 0.5}
problem_typestrحدّد ما إذا كانت معاملات المسألة بصيغة ثنائية (QUBO/HUBO) أو صيغة الدوران. الخياران المتاحان هما "spin" أو "binary"نعمغير متاح"spin"
backend_namestrاسم الـ Backend لإجراء الاستعلامنعمغير متاح"ibm_fez"
optionsDict[str, Any]خيارات للتحكم في تقديم طلبات العتاد، كعدد القياسات. لمزيد من التفاصيل حول ضبط الخيارات، انظر قسم الخياراتلالمعرفة القيم الافتراضية لضبط الخيارات انظر قسم الخيارات{"shots": 5000, "num_iterations": 3, "use_session": True, "seed_transpiler": 42}

صيغ المسائل المقبولة

تُرمّز وسيطتا problem وproblem_type مسألة تحسين بالشكل:

min(x1,x2,,xn)DC(x1,x2,,xn)\begin{align} \min_{(x_1, x_2, \ldots, x_n) \in D} C(x_1, x_2, \ldots, x_n) \nonumber \end{align}

حيث

C(x1,...,xn)=a+ibixi+i,jci,jxixj+...+k1,...,kmgk1,...,kmxk1...xkmC(x_1, ... , x_n) = a + \sum_{i} b_i x_i + \sum_{i, j} c_{i, j} x_i x_j + ... + \sum_{k_1, ..., k_m} g_{k_1, ..., k_m} x_{k_1} ... x_{k_m}
  • باختيار problem_type = "binary"، تحدد أن دالة التكلفة بصيغة binary، أي أن D={0,1}nD = \{0, 1\}^{n}، بمعنى أن دالة التكلفة مكتوبة بصيغة QUBO/HUBO.
  • من ناحية أخرى، باختيار problem_type = "spin"، تُكتب دالة التكلفة بصيغة Ising، حيث D={1,1}nD = \{-1, 1\}^{n}.

ينبغي ترميز معاملات المسألة في قاموس على النحو التالي:

{"()":a,"(i,)":bi,"(i, j)":ci,j,"(k1,...,km)":gk1,...,km,}\begin{align} \nonumber &\texttt{\{} \\ \nonumber &\texttt{"()"}&: \quad &a, \\ \nonumber &\texttt{"(i,)"}&: \quad &b_i, \\ \nonumber &\texttt{"(i, j)"}&: \quad &c_{i, j}, \\ \nonumber &\quad \vdots \\ \nonumber &\texttt{"(} k_1, ..., k_m \texttt{)"} &: \quad &g_{k_1, ..., k_m}, \\ \nonumber &\texttt{\}} \end{align}
  • يُرجى ملاحظة أن مفاتيح القاموس يجب أن تكون سلاسل نصية تحتوي على صف (tuple) صالح من الأعداد الصحيحة غير المتكررة.

الخيارات

توفر Iskay إمكانيات ضبط دقيق من خلال معاملات اختيارية. رغم أن القيم الافتراضية تعمل بشكل جيد لمعظم المسائل، يمكنك تخصيص السلوك لمتطلبات محددة:

المعاملالنوعالافتراضيالوصف
shotsint10000القياسات الكمومية لكل تكرار (كلما زادت زادت الدقة)
num_iterationsint10تكرارات الخوارزمية (المزيد من التكرارات يمكن أن يُحسّن جودة الحل)
use_sessionboolTrueاستخدام جلسات IBM لتقليل أوقات الانتظار في الطابور
seed_transpilerintNoneاضبطه للحصول على ترجمة دوائر كمومية قابلة للتكرار
direct_qubit_mappingboolFalseتعيين الـ Qubits الافتراضية مباشرةً إلى الـ Qubits الفيزيائية
job_tagsList[str]Noneوسوم مخصصة لتتبع المهام
preprocessing_levelint0شدة المعالجة المسبقة للمسألة (0-3) - انظر التفاصيل أدناه
postprocessing_levelint2مستوى تحسين الحل (0-2) - انظر التفاصيل أدناه
transpilation_levelint0محاولات تحسين الـ Transpiler (0-5) - انظر التفاصيل أدناه
transpile_onlyboolFalseتحليل تحسين الدائرة دون تشغيل التنفيذ الكامل

مستويات المعالجة المسبقة (0-3): مهمة بشكل خاص للمسائل الأكبر التي لا تستطيع حالياً الاندراج ضمن أوقات التماسك في العتاد. تحقق مستويات المعالجة المسبقة الأعلى أعماق دوائر أقصر عبر تقريبات في ترجمة المسألة:

  • المستوى 0: دقيق، دوائر أطول
  • المستوى 1: توازن جيد بين الدقة والتقريب، يحذف فقط البوابات ذات الزوايا في أدنى 10 بالمئة
  • المستوى 2: تقريب أعلى قليلاً، يحذف البوابات ذات الزوايا في أدنى 20 بالمئة ويستخدم approximation_degree=0.95 في الترجمة
  • المستوى 3: أقصى مستوى تقريب، يحذف البوابات في أدنى 30 بالمئة ويستخدم approximation_degree=0.90 في الترجمة

مستويات الترجمة (0-5): تتحكم في محاولات تحسين الـ Transpiler المتقدمة لتجميع الدوائر الكمومية. قد يؤدي هذا إلى زيادة في الحمل الكلاسيكي، وفي بعض الحالات قد لا يغيّر عمق الدائرة. القيمة الافتراضية 2 تؤدي بشكل عام إلى أصغر دائرة وهي سريعة نسبياً:

  • المستوى 0: تحسين دائرة DCQO المُفكَّكة (التخطيط، التوجيه، الجدولة)
  • المستوى 1: تحسين PauliEvolutionGate ثم دائرة DCQO المُفكَّكة (max_trials=10)
  • المستوى 2: تحسين PauliEvolutionGate ثم دائرة DCQO المُفكَّكة (max_trials=15)
  • المستوى 3: تحسين PauliEvolutionGate ثم دائرة DCQO المُفكَّكة (max_trials=20)
  • المستوى 4: تحسين PauliEvolutionGate ثم دائرة DCQO المُفكَّكة (max_trials=25)
  • المستوى 5: تحسين PauliEvolutionGate ثم دائرة DCQO المُفكَّكة (max_trials=50)

مستويات المعالجة اللاحقة (0-2): تتحكم في مقدار التحسين الكلاسيكي، مع تعويض أخطاء قلب البت بعدد مختلف من المرورات الجشعة في البحث المحلي:

  • المستوى 0: مرور واحد
  • المستوى 1: مرورتان
  • المستوى 2: ثلاث مرورات

وضع الترجمة فقط: متاح الآن للمستخدمين الذين يريدون تحليل تحسين الدوائر دون تشغيل تنفيذ الخوارزمية الكمومية الكاملة.

مثال على ضبط مخصص: إليك كيفية ضبط Iskay بإعدادات مختلفة:

# Added by doQumentation — required packages for this notebook
!pip install -q PyGithub networkx qiskit-ibm-catalog
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_transpiler مضبوطة على None بشكل افتراضي. هذا يُتيح لعملية التحسين التلقائية في الـ Transpiler أن تعمل. عند تعيينها None، سيبدأ النظام تجربةً بعدة بذور ويختار التي تُنتج أفضل عمق للدائرة، مستغلاً القوة الكاملة لمعامل max_trials لكل مستوى ترجمة.

أداء مستوى الترجمة: زيادة عدد max_trials بقيم أعلى لـ transpilation_level ستزيد حتماً من وقت الترجمة، لكنها قد لا تغيّر الدائرة النهائية دائماً — يعتمد هذا بشكل كبير على بنية الدائرة وتعقيدها المحدد. ومع ذلك، بالنسبة لبعض الدوائر والمسائل، يمكن أن يكون الفرق بين 10 تجارب (المستوى 1) و50 تجربة (المستوى 5) كبيراً، لذا قد يكون استكشاف هذه المعاملات هو المفتاح للوصول بنجاح إلى حل.

المخرج

الاسمالنوعالوصفمثال
resultDict[str, Any]الحل والبيانات الوصفية. تختلف البنية بناءً على خيار transpile_only.انظر "محتويات قاموس النتيجة" أدناه

محتويات قاموس النتيجة

تعتمد بنية قاموس النتيجة على وضع التنفيذ:

الحقلالنوعالوضعالوصفمثال
solutionDict[str, int]قياسيالحل المُرتَّب والمُعيَّن حيث المفاتيح هي مؤشرات المتغيرات (كسلاسل نصية) مرتبة عددياً والقيم هي قيم المتغيرات المقابلة (1/-1 لمسائل الدوران، 1/0 للمسائل الثنائية).{'0': -1, '1': -1, '2': -1, '3': 1, '4': 1}
solution_infoDict[str, Any]قياسيمعلومات تفصيلية حول الحل (انظر التفاصيل أدناه){'bitstring': '11100', 'cost': -13.8, 'seed_transpiler': 42, 'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}}
prob_typestrقياسينوع مسألة التحسين ('spin' أو 'binary')'spin'
transpilation_infoDict[str, Any]ترجمة فقطتفاصيل تحليل الدائرة والترجمة (انظر التفاصيل أدناه){'best_seed': 42, 'transpilation_time_seconds': 50.06, 'transpiled_circuit': {'depth': 576, 'gate_count': 4177, 'num_qubits': 156, 'width': 176, 'operations': {'sx': 1325, 'rx': 891, 'cz': 783, 'rz': 650, 'rzz': 466, 'x': 42, 'measure': 20}}}

التنفيذ القياسي

عندما يكون المعامل الاختياري transpile_only=False:

قاموس solution_info:

  • "bitstring" (str): التمثيل الخام بالسلسلة الثنائية للحل.
  • "cost" (float): قيمة التكلفة/الطاقة المرتبطة بالحل.
  • "seed_transpiler" (int): البذرة العشوائية المستخدمة للـ Transpiler التي أنتجت هذه النتيجة.
  • "mapping" (Dict[int, int]): التعيين الأصلي من الـ Qubit إلى المتغير المستخدم في الحساب.
  • "qpu_time" (float، اختياري): وقت تنفيذ QPU بالثواني.

ملاحظات تعيين المتغيرات:

  • يُستمَد قاموس solution من السلسلة الثنائية للحل، باستخدام كائن mapping لفهرسة المتغيرات.
  • عند problem_type=spin نستخدم التعيين 11,011 \rightarrow -1, \quad 0 \rightarrow 1.
  • مفاتيح قاموس الحل هي مؤشرات المتغيرات مرتبة عددياً كسلاسل نصية.

تحليل الترجمة

عندما يكون المعامل الاختياري transpile_only=True:

قاموس transpilation_info:

  • "best_seed" (int): البذرة المثلى المُوجَدة للترجمة
  • "transpilation_time_seconds" (float): الوقت المستغرق في عملية الترجمة
  • "transpiled_circuit" (Dict): تحليل الدائرة يحتوي على:
    • "depth" (int): عمق الدائرة (عدد الطبقات)
    • "gate_count" (int): إجمالي عدد البوابات في الدائرة
    • "num_qubits" (int): عدد الـ Qubits المستخدمة
    • "width" (int): عرض الدائرة
    • "operations" (Dict[str, int]): عدد كل نوع من أنواع البوابات المستخدمة

استخدام وضع الترجمة فقط:

  • متاح للمستخدمين الذين يريدون تحليل تحسين الدوائر دون تشغيل تنفيذ الخوارزمية الكمومية الكاملة.
  • مفيد لتحليل الدوائر ودراسات تحسين العمق وفهم تأثيرات الترجمة قبل الالتزام بالتنفيذ الكامل.

البدء

في هذا التوثيق، سنمر بخطوات استخدام Iskay Quantum Optimizer. خلال ذلك، سنُريك بسرعة كيفية تحميل الدالة من الكتالوج وكيفية تحويل مسألتك إلى مدخل صالح، مع إظهار كيف يمكنك التجربة بمعاملات اختيارية مختلفة.

للاطلاع على مثال أكثر تفصيلاً، يُرجى الاطلاع على البرنامج التعليمي حلّ مسألة تقسيم السوق باستخدام Iskay Quantum Optimizer من Kipu Quantum، حيث نمر بالعملية الكاملة لاستخدام محلّ Iskay لمعالجة مسألة تقسيم السوق، التي تمثل تحدي تخصيص موارد من الواقع العملي حيث يجب تقسيم الأسواق إلى مناطق مبيعات متوازنة لتلبية أهداف الطلب الدقيقة.

تحقق من صحة الهوية باستخدام مفتاح API الخاص بك، الموجود على لوحة تحكم IBM Quantum Platform، وحدد دالة Qiskit كالتالي:

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

مثال 1: دالة تكلفة بسيطة

لنأخذ دالة التكلفة بصيغة spin التالية:

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 أو Maximum Independent Set هي مسائل NP-hard وتُعدّ مرشحين مثاليين لاختبار الخوارزميات الكمومية والأجهزة. يوضح هذا المثال كيفية حل مسألة MaxCut لرسم بياني ثلاثي المنتظم باستخدام Quantum Optimizer.

لتشغيل هذا المثال يجب تثبيت حزمة networkx إضافةً إلى qiskit-ibm-catalog. لتثبيتها، شغِّل الأمر التالي:

# %pip install networkx numpy

1. إنشاء دالة الهدف

ابدأ بتوليد رسم بياني عشوائي ثلاثي المنتظم، ثم عرِّف دالة الهدف لمسألة 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. استرجاع النتيجة

استرجع النتيجة وعيِّن bitstring الحل إلى العقد الأصلية في الرسم البياني.

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، اختر الـ backend هو 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 عام قبل الميلاد.