Iskay Quantum Optimizer - פונקציית Qiskit מבית Kipu Quantum
- Qiskit Functions הן תכונה ניסיונית הזמינה רק למשתמשי תוכנית IBM Quantum® Premium Plan, Flex Plan, ו-On-Prem (דרך IBM Quantum Platform API). הן בסטטוס גרסת תצוגה מקדימה וכפופות לשינויים.
סקירה כללית
עם Iskay Quantum Optimizer מבית Kipu Quantum, אפשר להתמודד עם בעיות אופטימיזציה מורכבות באמצעות מחשבים קוונטיים של IBM®. הפותר הזה מנצל את האלגוריתם החדשני bf-DCQO של Kipu, שדורש רק את פונקציית המטרה כקלט ומספק אוטומטית פתרונות לבעיה. הוא מסוגל לטפל בבעיות אופטימיזציה הכוללות עד 156 Qubit, מה שמאפשר שימוש בכל ה-Qubit של מכשירי הקוונטום של IBM. ה-Optimizer משתמש במיפוי 1-ל-1 בין משתנים קלאסיים ל-Qubit, מה שמאפשר לך להתמודד עם בעיות אופטימיזציה עם עד 156 משתנים בינאריים.
ה-Optimizer מאפשר פתרון בעיות אופטימיזציה בינארית ללא אילוצים. בנוסף לפורמולציה הנפוצה QUBO (Quadratic Unconstrained Binary Optimization), הוא תומך גם בבעיות אופטימיזציה מסדר גבוה יותר (HUBO). הפותר מנצל אלגוריתם קוונטי לא-וריאציוני, שמבצע את רוב החישוב על מכשירים קוונטיים.
הנ"ל מספק פרטים נוספים על האלגוריתם בו נעשה שימוש ומדריך קצר כיצד להשתמש בפונקציה, כמו גם תוצאות ביצועים השוואתיות על מגוון מופעי בעיות בגדלים ומורכבויות שונות.
תיאור
ה-Optimizer הוא מימוש מוכן לשימוש של אלגוריתמי אופטימיזציה קוונטית חדשניים. הוא פותר בעיות אופטימיזציה על ידי הרצת Circuit קוונטיים דחוסים מאוד על חומרה קוונטית. דחיסה זו מושגת על ידי הכנסת מושגים counterdiabatic לאבולוציה בזמן של המערכת הקוונטית. האלגוריתם מבצע מספר איטרציות של ריצות חומרה כדי לקבל את הפתרונות הסופיים ומשלב אותן עם עיבוד לאחר. שלבים אלה משולבים בצורה חלקה בתהליך העבודה של ה-Optimizer ומבוצעים אוטומטית.
איך עובד ה-Quantum Optimizer?
סעיף זה מתאר את הבסיס של אלגוריתם bf-DCQO המיושם. מבוא לאלגוריתם ניתן למצוא גם בערוץ YouTube של Qiskit.
האלגוריתם מבוסס על האבולוציה בזמן של מערכת קוונטית שמשתנה לאורך זמן, כאשר פתרון הבעיה מקודד במצב הבסיסי של המערכת הקוונטית בסוף האבולוציה. לפי משפט האדיאבטי, אבולוציה זו חיי בת להיות איטית כדי להבטיח שהמערכת נשארת במצב הבסיסי שלה. דיגיטציה של אבולוציה זו היא הבסיס של חישוב קוונטי אדיאבטי דיגיטלי (DQA) ואלגוריתם QAOA המפורסם. עם זאת, האבולוציה האיטית הנדרשת אינה ישימה עבור גדלי בעיות הולכים וגדלים מכיוון שהיא מביאה לעומק Circuit הולך וגדל. על ידי שימוש בפרוטוקולים counterdiabatic, אפשר לדכא עירורים לא רצויים המתרחשים במהלך זמני אבולוציה קצרים תוך כדי שמירה על המצב הבסיסי. כאן, דיגיטציה של זמן אבולוציה קצר יותר זה מביאה ל-Circuit קוונטיים בעומק קצר יותר ועם פחות שערי קשירה.
ה-Circuit של אלגוריתמי bf-DCQO משתמשים בדרך כלל בעד עשר פעמים פחות שערי קשירה מאשר DQA, ובשלוש עד ארבע פעמים פחות שערי קשירה מאשר מימושי QAOA סטנדרטיים. בגלל מספר שערים קטן יותר, מתרחשות פחות שגיאות במהלך ביצוע ה-Circuit על חומרה. לכן, ה-Optimizer לא דורש שימוש בטכניקות כמו דיכוי שגיאות או הקלה על שגיאות. יישום שלהן בגרסאות עתידיות יכול לשפר עוד יותר את איכות הפתרון.
למרות שאלגוריתם bf-DCQO משתמש באיטרציות, הוא לא-וריאציוני. לאחר כל איטרציה של האלגוריתם, מחלוקת המצבים נמדדת. ההתפלגות שהתקבלה משמשת לחישוב מה שנקרא "שדה הטיה". שדה ההטיה מאפשר להתחיל את האיטרציה הבאה ממצב אנרגיה קרוב לפתרון שנמצא קודם. בדרך זו, האלגוריתם עובר עם כל איטרציה לפתרונות ש ל אנרגיה נמוכה יותר. בדרך כלל, כ-עשר איטרציות מספיקות להתכנסות לפתרון, בסה"כ דורש מספר נמוך בהרבה של איטרציות מאשר אלגוריתמים וריאציוניים, שהוא בסדר גודל של כ-100 איטרציות.
ה-Optimizer משלב את אלגוריתם bf-DCQO עם עיבוד לאחר קלאסי. לאחר מדידת התפלגות המצבים, מתבצע חיפוש מקומי. במהלך החיפוש המקומי, הסיביות של הפתרון הנמדד מתהפכות באופן אקראי. לאחר ההיפוך, האנרגיה של המחרוזת הבינארית החדשה מוערכת. אם האנרגיה נמוכה יותר, המחרוזת הבינארית נשמרת כפתרון החדש. החיפוש המקומי מתרחב רק ליניארית עם מספר ה-Qubit; לכן, הוא זול מבחינה חישובית. מכיוון שהעיבוד לאחר מתקן היפוכי סיביות מקומיים, הוא מפצה על שגיאות היפוך סיבית שלעיתים קרובות הן תוצאה של פגמי חומרה ושגיאות קריאה.
תהליך עבודה
להלן סכמה של תהליך העבודה של ה-Quantum Optimizer.
על ידי שימוש ב-Quantum Optimizer, פתרון בעיית אופטימיזציה על חומרה קוונטית ניתן לצמצם ל:
- ניסוח פונקציית המטרה של הבעיה
- גישה ל-Optimizer דרך Qiskit Functions
- הרצת ה-Optimizer ואיסוף התוצאה
ביצועים השוואתיים
מדדי הביצועים ההשוואתיים שלהלן מראים שה-Optimizer מטפל ביעילות בבעיות הכוללות עד 156 Qubit ומציעים סקירה כללית של דיוק ה-Optimizer ויכולת ההרחבה שלו על פני סוגי בעיות שונים. שים לב שמדדי הביצועים בפועל עשויים להשתנות בהתאם למאפייני הבעיה הספציפיים, כגון מספר המשתנים, הצפיפות והמקומיות של המונחים בפונקציית המטרה, והסדר הפולינומי.
הטבלה הבאה כוללת את יחס הקירוב (AR), מדד המוגדר כדלקמן:
כאשר היא פונקציית המטרה, , הם הערכים המינימלי והמקסימלי שלה, ו- הוא העלות של הפתרון הטוב ביותר שנמצא, בהתאמה. לכן, AR=100% אומר שהמצב הבסיסי של הבעיה הושג.
| דוגמה | מספר Qubit | יחס קירוב | זמן כולל (שניות) | שימוש בזמן ריצה (שניות) | מספר כולל של shots | מספר איטרציות |
|---|---|---|---|---|---|---|
| Unweighted MaxCut | 28 | 100% | 180 | 30 | 30k | 5 |
| Unweighted MaxCut | 30 | 100% | 180 | 30 | 30k | 5 |
| Unweighted MaxCut | 32 | 100% | 180 | 30 | 30k | 5 |
| Unweighted MaxCut | 80 | 100% | 480 | 60 | 90k | 9 |
| Unweighted MaxCut | 100 | 100% | 330 | 60 | 60k | 6 |
| Unweighted MaxCut | 120 | 100% | 370 | 60 | 60k | 6 |
| HUBO 1 | 156 | 100% | 600 | 70 | 100k | 10 |
| HUBO 2 | 156 | 100% | 600 | 70 | 100k | 10 |
- מופעי MaxCut עם 28, 30 ו-32 Qubit הורצו על ibm_sherbrooke. מופעים עם 80, 100 ו-120 הורצו על מעבד Heron r2.
- מופעי HUBO גם הם הורצו על מעבד Heron r2.
כל מופעי הביצועים ההשוואתיים נגישים ב-GitHub (ראה מופ עי ביצועים של Kipu). דוגמה להרצת מופעים אלה ניתן למצוא בדוגמה 3: מופעי ביצועים.
קלט ופלט
קלט
ראה את הטבלה הבאה לכל פרמטרי הקלט ש-Quantum Optimizer מקבל. הסעיף Options שלאחר מכן נכנס לפרטים נוספים לגבי ה-options הזמינות.
| שם | סוג | תיאור | נדרש | ברירת מחדל | דוגמה |
|---|---|---|---|---|---|
| problem | Dict[str, float] | המקדמים של בעיית האופטימיזציה המנוסחת כ-QUBO/HUBO או בפורמט spin. למידע נוסף על מפרט הבעיה, ראה פורמטי בעיה מקובלים | כן | N/A | {"()": -21.0, "(0, 4)": 0.5,"(0, 2)": 0.5,"(0, 1)": 0.5,"(1, 3)": 0.5} |
| problem_type | str | ציין האם מקדמי הבעיה הם בפורמט בינארי (QUBO/HUBO) או spin. שתי האפשרויות הן "spin" או "binary" | כן | N/A | "spin" |
| backend_name | str | שם ה-Backend לביצוע הבקשה | כן | N/A | "ibm_fez" |
| options | Dict[str, Any] | אפשרויות לטיפול בהגשת החומרה, כגון מספר ה-shots. לפרטים נוספים על תצורת האפשרויות, ראה את הסעיף Options | לא | לצפייה בערכי ברירת המחדל של תצורת האפשרויות ראה את הסעיף Options | {"shots": 5000, "num_iterations": 3, "use_session": True, "seed_transpiler": 42} |
הארגומנטים problem ו-problem_type מקודדים בעיית אופטימיזציה בצורה
כאשר
- על ידי בחירת
problem_type = "binary", אתה מציין שפונקציית העלות היא בפורמטbinary, כלומר ש-, כלומר, פונקציית העלות כתובה בפורמולציית QUBO/HUBO. - מצד שני, על ידי בחירת
problem_type = "spin", פונקציית העלות כתובה בפורמולציית Ising, כאשר .
יש לקדד את מקדמי הבעיה במילון כדלקמן:
- שים לב שמפתחות המילון חייבים להיות מחרוזות המכילות tuple חוקי של מספרים שלמים שאינם חוזרים על עצמם.
Options
Iskay מספקת יכולות כוונון עדין דרך פרמטרים אופציונליים. בעוד שברירות המחדל עובדות היטב לרוב הבעיות, אפשר להתאים אישית את ההתנהגות לדרישות ספציפיות:
| פרמטר | סוג | ברירת מחדל | תיאור |
|---|---|---|---|
| shots | int | 10000 | מדידות קוונטיות לכל איטרציה (יותר = דיוק גבוה יותר) |
| num_iterations | int | 10 | איטרצי ות של האלגוריתם (יותר איטרציות יכולות לשפר את איכות הפתרון) |
| use_session | bool | True | שימוש ב-Session של IBM לזמני תור מופחתים |
| seed_transpiler | int | None | הגדר לקבלת קומפילציה רבייתית של Circuit קוונטי |
| direct_qubit_mapping | bool | False | מיפוי Qubit וירטואלי ישירות ל-Qubit פיזי |
| job_tags | List[str] | None | תגיות מותאמות אישית למעקב אחר עבודות |
| preprocessing_level | int | 0 | עוצמת עיבוד מקדים של הבעיה (0-3) - ראה פרטים להלן |
| postprocessing_level | int | 2 | רמת עידון הפתרון (0-2) - ראה פרטים להלן |
| transpilation_level | int | 0 | ניסיונות אופטימיזציה של ה-Transpiler (0-5) - ראה פרטים להלן |
| transpile_only | bool | False | ניתוח אופטימיזציה של Circuit ללא הרצת ביצוע מלאה |
רמות עיבוד מקדים (0-3): חשובות במיוחד לבעיות גדולות יותר שאינן יכולות כרגע להתאים לזמני הקוהרנטיות של החומרה. רמות עיבוד מקדים גבוהות יותר משיגות עומקי Circuit רדודים יותר על ידי קירובים בתרגום הבעיה:
- רמה 0: מדויקת, Circuit ארוכים יותר
- רמה 1: איזון טוב ב ין דיוק לקירוב, כריתת שערים עם זוויות ברבעון התחתון ה-10
- רמה 2: קירוב מעט גבוה יותר, כריתת שערים עם זוויות ברבעון התחתון ה-20 ושימוש ב-
approximation_degree=0.95בתרגום - רמה 3: רמת קירוב מקסימלית, כריתת שערים ברבעון התחתון ה-30 ושימוש ב-
approximation_degree=0.90בתרגום
רמות תרגום (0-5): שליטה בניסיונות אופטימיזציה מתקדמים של ה-Transpiler לקומפילציה של Circuit קוונטי. זה יכול להוביל לתקורה קלאסית מוגברת, ובמקרים מסוימים ייתכן שלא ישנה את עומק ה-Circuit. ערך ברירת המחדל 2 בדרך כלל מוביל ל-Circuit הקטן ביותר והוא יחסית מהיר.
- רמה 0: אופטימיזציה של Circuit DCQO המפורק (פריסה, ניתוב, תזמון)
- רמה 1: אופטימיזציה של
PauliEvolutionGateולאחר מכן Circuit DCQO המפורק (max_trials=10) - רמה 2: אופטימיזציה של
PauliEvolutionGateולאחר מכן Circuit DCQO המפורק (max_trials=15) - רמה 3: אופטימיזציה של
PauliEvolutionGateולאחר מכן Circuit DCQO המפורק (max_trials=20) - רמה 4: אופטימיזציה של
PauliEvolutionGateולאחר מכן Circuit DCQO המפורק (max_trials=25) - רמה 5: אופטימיזציה של
PauliEvolutionGateולאחר מכן Circuit DCQO המפורק (max_trials=50)
רמות עיבוד לאחר (0-2): שליטה בכ מות האופטימיזציה הקלאסית, המפצה על שגיאות היפוך סיבית עם מספרים שונים של מעברים חמדניים בחיפוש מקומי:
- רמה 0: מעבר אחד
- רמה 1: 2 מעברים
- רמה 2: 3 מעברים
מצב Transpile-only: זמין כעת למשתמשים שרוצים לנתח אופטימיזציה של Circuit ללא הרצת ביצוע האלגוריתם הקוונטי המלא.
דוגמת תצורה מותאמת אישית: כך ניתן להגדיר את 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: שים לב ש-seed_transpiler מוגדר ל-None כברירת מחדל. זה מאפשר את תהליך האופטימיזציה האוטומטי של ה-Transpiler. כאשר None, המערכת תתחיל ניסיון עם seeds מרובים ותבחר את זה המייצר את עומק ה-Circuit הטוב ביותר, תוך ניצול מלוא העוצמה של פרמטר max_trials עבור כל רמת תרגום.
ביצועי רמת תרגום: הגדלת מספר max_trials עם ערכים גבוהים יותר עבור transpilation_level תגדיל בהכרח את זמן התרגום, אך ייתכן שלא תמיד ישנה את ה-Circuit הסופי — זה תלוי מאוד במבנה ה-Circuit הספציפי ובמורכבותו. עבור חלק מה-Circuit/בעיות, עם זאת, ההבדל בין 10 ניסיונות (רמה 1) ל-50 ניסיונות (רמה 5) יכול להיות דרמטי, לכן חקירת פרמטרים אלה עשויה להיות המפתח למציאת פתרון בהצלחה.
פלט
| שם | סוג | תיאור | דוגמה |
|---|---|---|---|
| result | Dict[str, Any] | פתרון ומטא-נתונים. המבנה משתנה בהתאם לאפשרות transpile_only. | ראה "תוכן מילון התוצאות" להלן |
תוכן מילון התוצאות
מבנה מילון התוצאות תלוי במצב הביצוע:
| שדה | סוג | מצב | תיאור | דוגמה |
|---|---|---|---|---|
| solution | Dict[str, int] | סטנדרטי | הפתרון הממופה הממוין כאשר המפתחות הם אינדקסי משתנים (כמחרוזות) ממוינים מספרית והערכים הם ערכי המשתנים המתאימים (1/-1 לבעיות spin, 1/0 לבעיות בינאריות). | {'0': -1, '1': -1, '2': -1, '3': 1, '4': 1} |
| solution_info | Dict[str, Any] | סטנדרטי | מידע מפורט על הפתרון (ראה פרטים להלן) | {'bitstring': '11100', 'cost': -13.8, 'seed_transpiler': 42, 'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}} |
| prob_type | str | סטנדרטי | סוג בעיית האופטימיזציה ('spin' או 'binary') | 'spin' |
| transpilation_info | Dict[str, Any] | Transpile-only | ניתוח Circuit ופרטי תרגום (ראה פרטים להלן) | {'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): ה-seed האקראי בשימוש ב-Transpiler שייצר תוצאה זו. - "mapping" (
Dict[int, int]): מיפוי ה-Qubit-למשתנה המקורי בשימוש בחישוב. - "qpu_time" (
float, אופציונלי): זמן הביצוע של ה-QPU בשניות.
הערות מיפוי משתנים:
- מילון ה-
solutionמתקבל ממחרוזת הפתרון הבינארית, תוך שימוש באובייקטmappingלאינדוקס המשתנים. - כאשר
problem_type=spinאנו משתמשים בהשמה . - מפתחות במילון הפתרון הם אינדקסי משתנים ממוינים מספרית כמחרוזות.
ניתוח תרגום
כאשר הפרמטר האופציונלי transpile_only=True:
מילון transpilation_info:
- "best_seed" (
int): ה-seed האופטימלי שנמצא לתרגום - "transpilation_time_seconds" (
float): זמן שנדרש לתהליך התרגום - "transpiled_circuit" (
Dict): ניתוח Circuit המכיל:- "depth" (
int): עומק ה-Circuit (מספר שכבות) - "gate_count" (
int): מספר כולל של שערים ב-Circuit - "num_qubits" (
int): מספר ה-Qubit בשימוש - "width" (
int): רוחב ה-Circuit - "operations" (
Dict[str, int]): ספירת כל סוג שער בשימוש
- "depth" (
שימוש במצב Transpile-only:
- זמין למשתמשים שרוצים לנתח אופטימיזציה של Circuit ללא הרצת ביצוע האלגוריתם הקוונטי המלא.
- שימושי לניתוח Circuit, מחקרי אופטימיזציה של עומק, והבנת השפעות התרגום לפני מחויבות לביצוע מלא.
התחלה
בתיעוד הזה נעבור על השלבים של שימוש ב-Iskay Quantum Optimizer. בתהליך נראה בקצרה איך לטעון את הפונקציה מהקטלוג ואיך להמיר את הבעיה שלך לקלט תקין, תוך כדי הדגמת אפשרויות הניסוי עם פרמטרים אופציונליים שונים.
לדוגמה מפורטת יותר, כדאי לבדוק את המדריך פתרון בעיית פיצול השוק עם Iskay Quantum Optimizer של Kipu Quantum, שם עוברים על כל התהליך של שימוש ב-Iskay Solver לטיפול בבעיית פיצול השוק — אתגר הקצאת משאבים מהעולם האמיתי שבו שווקים צריכים להתחלק לאזורי מכירה מאוזנים כדי לעמוד ביעדי ביקוש מדויקים.
מתחברים עם מפתח ה-API שלך, שנמצא בלוח המחוונים של IBM Quantum Platform, ובוחרים את Qiskit Function כך:
# 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: פונקציית עלות פשוטה
נשקול את פונקציית העלות בנוסחת ספין:
כאשר .
הפתרון לפונקציית העלות הפשוטה הזו הוא
עם ערך מינימלי
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. הרצת המייעל
פותרים את הבעיה על ידי הרצת המייעל. מאחר ש- צריך להגדיר 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)