הפונקציה פותרת את מודל הקלט ומחזירה את התוצאה בבת אחת. אפשר להשתמש באפשרות הזו כשאין לך צורך בקריאות חוזרות (callbacks) או בהמרות מצטברות, ואין לך צורך לעקוב אחר ההתקדמות של פתרון.
בקשת HTTP
POST https://optimization.googleapis.com/v1/mathopt:solveMathOptModel
בכתובת ה-URL נעשה שימוש בתחביר המרת קידוד של gRPC.
גוף הבקשה
גוף הבקשה מכיל נתונים במבנה הבא:
ייצוג JSON |
---|
{ "solverType": enum ( |
שדות | |
---|---|
solverType |
זה שינוי אופציונלי. סוג הפותר כדי לפתור את הבעיה מבחינה מספרית. שימו לב שאם פותר לא תומך בתכונה מסוימת במודל, תהליך האופטימיזציה לא יצליח. |
model |
חובה. ייצוג מתמטי של בעיית האופטימיזציה שצריך לפתור. |
parameters |
זה שינוי אופציונלי. פרמטרים לשליטה בפתרון יחיד. הפרמטר EnableOutput (הפעלת) מטופל באופן ספציפי. לפותרים שתומכים בקריאות חוזרות (callback) של הודעות, אם מגדירים את הערך True, השרת ירשום קריאה חוזרת (callback) של הודעה. ההודעות שייווצרו יוחזרו ב-SolveMathOptModelResponse.messages. בפתרונות אחרים, הגדרת EnableOutput ל-true תגרום לשגיאה. |
modelParameters |
זה שינוי אופציונלי. פרמטרים לשליטה בפתרון יחיד שהם ספציפיים למודל הקלט (ב-SolveParametersProto מפורטים פרמטרים בלתי תלויים במודל). |
גוף התשובה
תשובה לפתרון מרחוק של Unary ב-MathOpt.
אם הפעולה בוצעה ללא שגיאות, גוף התגובה יכיל נתונים במבנה הבא:
ייצוג JSON |
---|
{
"result": {
object ( |
שדות | |
---|---|
result |
תיאור הפלט של פתרון המודל בבקשה. |
messages[] |
אם נעשה שימוש ב-SolveParametersProto.enable_output, ההודעה תכלול הודעות יומן לפותרים שתומכים בקריאות חוזרות (callbacks) של הודעות. |
SolverTypeProto
הפותרים שנתמכים על ידי MathOpt.
טיפוסים בני מנייה (enum) | |
---|---|
SOLVER_TYPE_UNSPECIFIED |
|
SOLVER_TYPE_GSCIP |
פותר בעיות שקשורות למגבלות של תוכניות מספרים שלמים (SCIP) (צד שלישי). תומכת בבעיות ריבועיות מסוג LP, MIP ומספרים שלמים לא קמורים. עם זאת, לא מוחזרים נתונים כפולים עבור דפי הנחיתה. יש לי העדפה ל-GLOP בדפי נחיתה. |
SOLVER_TYPE_GUROBI |
פותר Gurobi (צד שלישי). תומכת בבעיות ריבועיות מסוג LP, MIP ומספרים שלמים לא קמורים. האפשרות המהירה ביותר בדרך כלל, אבל יש לה רישוי מיוחד. |
SOLVER_TYPE_GLOP |
פותר ה-Glop של Google. תומכת ב-LP באמצעות שיטות ראשוניות וכפולות. |
SOLVER_TYPE_CP_SAT |
פותר CP-SAT של Google. תומכת בבעיות שבהן כל המשתנים הם שלמים ותחומים (או משתמעים אחרי presolve). תמיכה ניסיונית כדי להתאים לעומס (scaling) בעיות עם משתנים רציפים, ולהבדיל ביניהן. |
SOLVER_TYPE_PDLP |
פותר ה-PDLP של Google. תומכת במטרות ריבועיות באלכסון וקמורות. משתמשת בשיטות מסדר ראשון במקום בשיטות חד-פעמיות. אפשר לפתור בעיות גדולות מאוד. |
SOLVER_TYPE_GLPK |
ערכת התכנות הלינארית GNU (GLPK) (צד שלישי). תמיכה ב-MIP וב-LP. בטיחות בנוגע לשרשורים: ב-GLPK נעשה שימוש באחסון מקומי בשרשור (thread) להקצאות זיכרון. כתוצאה מכך, יש להשמיד מכונות של Solver באותו שרשור שבו הן נוצרות, אחרת ה-GLPK יקרוס. נראה שאפשר לקרוא ל-Solver::Solve() משרשור אחר מזה ששימש ליצירת ה-Solver, אבל הוא לא מתועד על ידי GLPK ויש להימנע ממנו. בעת פתרון LP באמצעות ה-Presolve, תמיסה (והקרניות הבלתי מאוגדות) מוחזרת רק אם נמצא פתרון אופטימלי. אחרת, שום דבר לא מוחזר. לפרטים נוספים, אפשר לעיין ב-glpk-5.0/doc/glpk.pdf דף #40 הזמין בכתובת glpk-5.0.tar.gz. |
SOLVER_TYPE_OSQP |
פותר הבעיות של תוכנית פיצול מפעיל (OSQP) (צד שלישי). תומכת בבעיות רציפות עם מגבלות ליניאריות ויעדים ריבועיים ליניאריים או קמורים. משתמשת בשיטה של הזמנה ראשונה. |
SOLVER_TYPE_ECOS |
Embedded Conic Solver (ECOS) (צד שלישי). תמיכה בבעיות דפי נחיתה ו-SOCP. נעשה שימוש בשיטות נקודה פנימית (מחסום). |
SOLVER_TYPE_SCS |
Splitting Conic Solver (SCS) (צד שלישי). תמיכה בבעיות דפי נחיתה ו-SOCP. משתמשת בשיטה של הזמנה ראשונה. |
SOLVER_TYPE_HIGHS |
HiGHS Solver (צד שלישי). תומכת בבעיות דפי נחיתה ו-MIP (לא בוצעה הטמעה של QP קמור). |
SOLVER_TYPE_SANTORINI |
הטמעת קובץ עזר של MathOpt של פותר MIP. איטי/לא מומלץ לצורכי ייצור. לא פותר LP (לא הוחזר מידע כפול). |
ModelProto
בעיית אופטימיזציה. תמיכה ב-MathOpt: משתני החלטה רציפים ומספרים שלמים עם גבולות סופיים אופציונליים. - יעדים לינאריים וריבועיים (יעדים בודדים או מרובים), מוקטנים או מוגדלים. - מספר סוגי אילוצים, כולל: * אילוצים לינאריים * אילוצים ריבועיים * אילוצים של חרוטים מסדר שני * אילוצים לוגיים > מגבלות חירום 1 ו-SOS2 > מגבלות אינדיקטור
כברירת מחדל, האילוצים מיוצגים ב-"id-to-data" מפות. יחד עם זאת, אנחנו מייצגים מגבלות לינאריות ב'מבנה של מערכים' יעיל יותר הפורמט.
ייצוג JSON |
---|
{ "name": string, "variables": { object ( |
שדות | |
---|---|
name |
|
variables |
|
objective |
המטרה העיקרית במודל. |
auxiliaryObjectives |
יעדי עזר לשימוש במודלים עם יעדים מרובים. מזהים של מפתחות מפה צריכים להיות בפורמט [0, max(int64)). כל עדיפות, וכל שם שאינו ריק, צריכים להיות ייחודיים וגם להיות שונים מה- אובייקט שמכיל רשימה של |
linearConstraints |
|
linearConstraintMatrix |
מקדמי המשתנה של האילוצים הלינאריים. אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו שהוא הוגדר לאפס. דרישות: * לינאריConstraintMatrix.row_ids הם רכיבים של LinearConstraints.ids. * LinearConstraintMatrix.column_ids הם אלמנטים של variable.ids. * הערכים במטריצה שלא צוינו הם אפס. * ערכים של LinearConstraintMatrix.value חייבים להיות סופיים. |
quadraticConstraints |
מגבלות ריבועיות במודל. אובייקט שמכיל רשימה של |
secondOrderConeConstraints |
אילוצים של קונוסים מסדר שני במודל. אובייקט שמכיל רשימה של |
sos1Constraints |
מגבלות מסוג חירום1 במודל, שמגבילות את הערך של אובייקט שמכיל רשימה של |
sos2Constraints |
מגבלות מסוג OS2 במודל, שמגבילות את האופן שבו שתי ערכים של אובייקט שמכיל רשימה של |
indicatorConstraints |
מגבלות אינדיקטור במודל, שאוכפים זאת, כאשר 'משתנה אינדיקטור' בינארי מוגדר ל-1, ואז ל'אילוץ משתמע' חייבים להחזיק. אובייקט שמכיל רשימה של |
VariablesProto
כפי שמתואר בהמשך, אנחנו מגדירים " #variables" = size(VariablesProto.ids).
ייצוג JSON |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "integers": [ boolean ], "names": [ string ] } |
שדות | |
---|---|
ids[] |
הערך חייב להיות לא שלילי והמספר במגמת עלייה. אי אפשר להשתמש בערך המקסימלי(int64). |
lowerBounds[] |
האורך צריך להיות שווה ל-#variables, הערכים צריכים להיות [-inf, inf). |
upperBounds[] |
האורך צריך להיות שווה ל- #variables, ערכים ב-( -inf, inf]. |
integers[] |
האורך צריך להיות שווה ל- #variable. הערך הוא FALSE למשתנים רציפים ו-True למשתנים שלמים. |
names[] |
אם המאפיין לא מוגדר, ההנחה היא שכל המחרוזות ריקות. אחרת, האורך צריך להיות שווה ל- #variables. כל שמות שאינם ריקים חייבים להיות נפרדים. |
ObjectiveProto
ייצוג JSON |
---|
{ "maximize": boolean, "offset": number, "linearCoefficients": { object ( |
שדות | |
---|---|
maximize |
FALSE הוא מזעור, true הוא למקסם |
offset |
חייב להיות סופי ולא NaN. |
linearCoefficients |
מונחי ObjectiveProto שהם לינאריים במשתני ההחלטה. דרישות: * LinearCoefficients.id הם רכיבים של VariablesProto.ids. * VariablesProto (משתנים לדוגמה) לא תואמים לאפס. * הערך של LinearCoefficients.values צריך להיות סופי. * לינאריCoefficients.values יכולים להיות אפס, אבל זה פשוט בזבוז מקום. |
quadraticCoefficients |
מונחי אובייקט שהם ריבועיים במשתני ההחלטה. דרישות בנוסף לדרישות בהודעות של Sparse DoubleMatrixProto: * כל רכיב של quadraticCoefficients.row_ids וכל רכיב של quadraticCoefficients.column_ids חייבים להיות רכיב של VariablesProto.ids. * המטריצה חייבת להיות משולשת עליונה: לכל i, quadraticCoefficients.row_ids[i] <= quadraticCoefficients.column_ids[i]. הערות: * לתנאים שלא מאוחסנים במפורש יש מקדם אפס. * אלמנטים של quadraticCoefficients.coefficients יכולים להיות אפס, אבל זה פשוט בזבוז מקום. |
name |
יכול להיות שלהודעות הורה יהיו דרישות ייחודיות בשדה הזה. לדוגמה, ראו ModelProto.objectives ו-AuxiliaryObjectivesUpdatesProto.new_objectives. |
priority |
בבעיות עם כמה מטרות, העדיפות של המטרה הזו ביחס לאחרים (הרמה הנמוכה יותר חשובה יותר). הערך הזה חייב להיות לא שלילי. בנוסף, כל עדיפות של מטרה במודל צריכה להיות ייחודית בזמן פתרון. התנאי הזה לא מאומת ברמת הפרוטו, לכן יכול להיות שלמודלים יש באופן זמני יעדים עם אותה עדיפות. |
SparseDoubleVectorProto
ייצוג דל של וקטור של כפולים.
ייצוג JSON |
---|
{ "ids": [ string ], "values": [ number ] } |
שדות | |
---|---|
ids[] |
חייב להיות ממוין (בסדר הולך וגדל) עם הבחנה בין כל הרכיבים. |
values[] |
האורך חייב להיות זהה למזהים. לא יכול להכיל NaN. |
SparseDoubleMatrixProto
ייצוג דל של מטריצה של זוגות.
המטריצה מאוחסנת כשלשות של מזהה שורה, מזהה עמודה ומקדם. שלושת הווקטורים האלה חייבים להיות באורך שווה. לכל ה-i, ה-tuple (rowIds[i], columnIds[i]) צריך להיות ייחודי. הרשומות חייבות להיות בסדר ראשי של שורה.
ייצוג JSON |
---|
{ "rowIds": [ string ], "columnIds": [ string ], "coefficients": [ number ] } |
שדות | |
---|---|
rowIds[] |
|
columnIds[] |
|
coefficients[] |
לא יכול להכיל NaN. |
LinearConstraintsProto
כפי שמתואר בהמשך, אנחנו מגדירים '#מגבלות לינאריות' = size(LinearConstraintsProto.ids).
ייצוג JSON |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "names": [ string ] } |
שדות | |
---|---|
ids[] |
הערך חייב להיות לא שלילי והמספר במגמת עלייה. אי אפשר להשתמש בערך המקסימלי(int64). |
lowerBounds[] |
האורך צריך להיות שווה למגבלות #ליניאריות, הערכים בעמודות [-inf, inf). |
upperBounds[] |
האורך צריך להיות שווה למגבלות #לינאריות, הערכים ב-( -inf, inf]. |
names[] |
אם המאפיין לא מוגדר, ההנחה היא שכל המחרוזות ריקות. אחרת, האורך צריך להיות שווה למגבלות #לינאריות. כל שמות שאינם ריקים חייבים להיות נפרדים. |
QuadraticConstraintProto
אילוץ ריבועי יחיד מהצורה: lb <= amount{ מפרineTerms} + amount{quadraticTerms} <= ub.
אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו שהוא הוגדר לאפס.
ייצוג JSON |
---|
{ "linearTerms": { object ( |
שדות | |
---|---|
linearTerms |
מונחים לינאריים במשתני ההחלטה. בנוסף לדרישות בהודעות של SparseDoubleClickVectorProto, אנחנו דורשים: * LinearTerms.ids הם רכיבים של VariablesProto.ids. * lineTerms.values חייבים להיות סופיים ולא מוגדרים כ-NaN. הערות: * למזהי המשתנים שהושמטו יש מקדם תואם של אפס. * LinearTerms.value יכולים להיות אפס, אבל זה פשוט בזבוז מקום. |
quadraticTerms |
מונחים שהם ריבועים במשתני ההחלטה. בנוסף לדרישות בהודעות של SparseDoubleClickMatrixProto, אנחנו דורשים כי: * כל רכיב של quadraticTerms.row_ids וכל רכיב של quadraticTerms.column_ids חייבים להיות רכיב של VariablesProto.ids. * המטריצה חייבת להיות משולשת עליונה: לכל i, quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i]. הערות: * לתנאים שלא מאוחסנים במפורש יש מקדם אפס. * אלמנטים של quadraticTerms.coefficients יכולים להיות אפס, אבל זה פשוט בזבוז מקום. |
lowerBound |
חייב להיות ערך ב-[-inf, inf), והוא צריך להיות קטן מ- |
upperBound |
חייב להיות ערך ב-(inf, inf] והוא צריך להיות גדול מ- |
name |
יכול להיות שלהודעות הורה יהיו דרישות ייחודיות בשדה הזה. לדוגמה, ראו ModelProto.quadratic_constraints ו-QuadraticConstraintUpdatesProto.new_constraints. |
SecondOrderConeConstraintProto
אילוץ חרוט מסדר שני יחיד בטופס:
||argumentsToNorm
||_2 <= upperBound
,
כאשר upperBound
וכל רכיב של argumentsToNorm
הם ביטויים ליניאריים.
אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו שהוא הוגדר לאפס.
ייצוג JSON |
---|
{ "upperBound": { object ( |
שדות | |
---|---|
upperBound |
|
argumentsToNorm[] |
|
name |
יכול להיות שלהודעות הורה יהיו דרישות ייחודיות בשדה הזה. לדוגמה, ראו |
LinearExpressionProto
ייצוג מועט של ביטוי לינארי (סכום משוקלל של משתנים, בתוספת היסט קבוע).
ייצוג JSON |
---|
{ "ids": [ string ], "coefficients": [ number ], "offset": number } |
שדות | |
---|---|
ids[] |
מזהים של משתנים. חייב להיות ממוין (בסדר הולך וגדל) עם הבחנה בין כל הרכיבים. |
coefficients[] |
האורך חייב להיות זהה למזהים. ערכים חייבים להיות סופיים ולא יכולים להיות NaN. |
offset |
חייב להיות סופי ולא יכול להיות NaN. |
SosConstraintProto
נתונים שמייצגים אילוץ אחד במצב חירום1 או חירום 2.
אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו שהוא הוגדר לאפס.
ייצוג JSON |
---|
{
"expressions": [
{
object ( |
שדות | |
---|---|
expressions[] |
הביטויים שעליהם צריך להחיל את האילוץ 'מצב חירום': * חירום 1: רכיב אחד לכל היותר מקבל ערך שאינו אפס. * חירום 2: לכל היותר שני רכיבים מקבלים ערכים שאינם אפס, והם חייבים להיות קרובים זה לזה בסדר החוזר. |
weights[] |
השדה ריק או באורך שווה לביטויים. אם השדה ריק, ערכי ברירת המחדל הם 1, 2, ... אם השדה הזה קיים, הערכים חייבים להיות ייחודיים. |
name |
יכול להיות שלהודעות הורה יהיו דרישות ייחודיות בשדה הזה. לדוגמה, ראו ModelProto.sos1_constraints ו-SosConstraintUpdatesProto.new_constraints. |
IndicatorConstraintProto
נתונים לייצוג אילוץ של מדד יחיד בטופס: Variable(indicatorId) = (activateOnZero ? 0 : 1) ⇒ גבול תחתון <= ביטוי <= עליון.
אם משתנה שמעורב באילוץ הזה (המדד או שמופיע ב-expression
) נמחק, המערכת מתייחסת אליו כאילו הוגדר שהוא אפס. באופן ספציפי, אם מוחקים את משתנה המדד, המשמעות היא שאילוץ המדד ריק אם activateOnZero
הוא False, ושהוא שוות ערך לאילוץ לינארי אם activateOnZero
נכון.
ייצוג JSON |
---|
{
"activateOnZero": boolean,
"expression": {
object ( |
שדות | |
---|---|
activateOnZero |
אם True, אם משתנה המדד מקבל את הערך 0, האילוץ המשתמע חייב להישאר בתוקף. אחרת, אם משתנה המדד מקבל ערך 1, אז האילוץ המשתמע חייב להישאר בתוקף. |
expression |
חייב להיות ביטוי ליניארי חוקי ביחס למודל המכיל: * כל התנאים שצוינו ב- |
lowerBound |
חייב להיות ערך ב-[-inf, inf); לא יכול להיות NaN. |
upperBound |
חייב להכיל ערך ב-(-inf, inf]; לא יכול להיות NaN. |
name |
יכול להיות שלהודעות הורה יהיו דרישות ייחודיות בשדה הזה. לדוגמה, ראו |
indicatorId |
מזהה שתואם למשתנה בינארי או לא מוגדר. אם היא לא מוגדרת, המערכת תתעלם ממגבלת האינדיקטור. אם המדיניות מוגדרת, אנחנו דורשים את הפרטים הבאים: * VariablesProto.integers[indicatorId] = true, * VariablesProto.lower_bounds[indicatorId] >= 0, * VariablesProto.upper_bounds[indicatorId] <= 1. התנאים האלה לא מאומתים על ידי MathOpt, אבל אם הם לא יתקיימו, הפתרון יחזיר שגיאה בסיום הפתרון. |
SolveParametersProto
פרמטרים לשליטה בפתרון יחיד.
מכיל את שני הפרמטרים המשותפים לכל הפותרים, למשל: מגבלת זמן ופרמטרים של פותר ספציפי, למשל gscip. אם ערך מוגדר גם בשדה משותף וגם בשדה ספציפי לפותר, המערכת תשתמש בהגדרה הספציפית לפותר.
הפרמטרים הנפוצים שהם אופציונליים ולא מוגדרים או enum עם ערך לא צוין מציינים שנעשה שימוש בברירת המחדל של הפותר.
המערכת מתעלמת מפרמטרים ספציפיים של פתרון עבור פתרונות אחרים, שאינם אלה שנמצאים בשימוש.
פרמטרים שתלויים במודל (למשל, עדיפות הסתעפות מוגדרת לכל משתנה) מועברים ב-ModelSolveParametersProto.
ייצוג JSON |
---|
{ "timeLimit": string, "enableOutput": boolean, "lpAlgorithm": enum ( |
שדות | |
---|---|
timeLimit |
משך הזמן המקסימלי שצריך להמתין לפתרון הבעיה (או זמן בלתי מוגבל אם לא הוגדר). הערך הזה הוא לא מגבלה קשיחה. יכול להיות שזמן הפתרון יחרוג מעט מהערך הזה. הפרמטר הזה תמיד מועבר לפותר הבסיסי, לא נעשה שימוש בברירת המחדל של הפותר. משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
enableOutput |
מאפשרת להדפיס את מעקבי ההטמעה של הפתרון. המיקום של העקבות האלה תלוי בפותר. עבור SCIP ו-Gurobi, אלה יהיו שידורי הפלט הרגילים. עבור Glop ו-CP-SAT, יתבצע LOG(INFO). הערה: אם הפותר תומך בקריאה חוזרת (callback) של הודעה והמשתמש מבצע קריאה חוזרת (callback), המערכת תתעלם מערך הפרמטר הזה ולא יודפסו עקבות. |
lpAlgorithm |
האלגוריתם לפתרון תוכנית לינארית. אם LP_ALGORITHM_UNSPECIFIED, אתם יכולים להשתמש באלגוריתם ברירת המחדל של הפותר. אם יש בעיות שהן לא תוכניות ליניאריות, אבל שתכנות ליניאריות הן שגרתיות, הפותרים יכולים להשתמש בערך הזה. לדוגמה הפתרון של MIP ישתמש בדרך כלל באפשרות הזו לפתרון בעיות של LP ברמה הבסיסית (root) בלבד (ואחרת הם ישתמשו בשני עקרונות פשוטים). |
presolve |
מאמץ לפשט את הבעיה לפני הפעלת האלגוריתם הראשי, או רמת המאמץ המוגדרת כברירת המחדל של הפתרון אם JSON_UNSPECIFIED. |
cuts |
מאמץ להשגת הרגיעה חזקה יותר של LP (MIP בלבד), או רמת המאמץ שמוגדרת כברירת המחדל של הפתרון אם JSON_UNSPECIFIED. הערה: השבתת הקיצוצים עשויה למנוע מקריאות חוזרות (callback) להוסיף חיתוכים ב-MIP_NODE, התנהגות כזו היא ספציפית לפותר. |
heuristics |
מאמץ במציאת פתרונות מעשיים מעבר לאלה שנתקלו בתהליך החיפוש המלא (MIP בלבד), או רמת המאמץ המוגדרת כברירת מחדל של הפתרון אם JSON_UNSPECIFIED. |
scaling |
מאמץ להתאים את הבעיה לעומס (scaling) כדי לשפר את היציבות המספרית, או את רמת המאמץ המוגדרת כברירת המחדל של הפתרון אם JSON_UNSPECIFIED. |
iterationLimit |
הגבלה על איטרציות של האלגוריתם הבסיסי (למשל, צירים פשוטים). ההתנהגות הספציפית תלויה בפותר ובאלגוריתם שבהם נעשה שימוש, אבל לעיתים קרובות יכולה לתת מגבלת פתרון דטרמיניסטית (ייתכן שיהיה צורך בהגדרה נוספת, למשל שרשור אחד). בדרך כלל נתמכת על ידי פתרונות מסוג LP, QP ו-MIP, אבל בשביל לפתורי MIP צריך לעיין גם ב-NodeLimit. |
nodeLimit |
הגבלה למספר בעיות המשנה שנפתרות בחיפוש מבוסס-ספירה (למשל הסתעפות ותחום). עבור פותרים רבים ניתן להשתמש בהגדרה הזו כדי להגביל את החישובים באופן דטרמיניסטי (ייתכן שיהיה צורך בהגדרה נוספת, למשל שרשור אחד). בדרך כלל לפותרי MIP, יש לעיין גם במדיניות iterationLimit. |
cutoffLimit |
הפותר עוצר בשלב מוקדם אם הוא יכול להוכיח שאין פתרונות ראשוניים טובים לפחות כמו סף החיוב. במקרה של עצירה מוקדמת, הפתרון מחזיר את סיבת הסיום NO_SOLUTION_FOUND עם מגבלת CUTOFF ולא נדרש לספק מידע נוסף על הפתרון. אין השפעה על הערך המוחזר אם אין עצירה מוקדמת. מומלץ להשתמש בהגדרות סובלנות אם רוצים להחזיר פתרונות עם יעד ששווה בדיוק לחיתוך. לפרטים נוספים והשוואה ל-bestBoundLimit, אפשר לעיין במדריך למשתמש. |
objectiveLimit |
הפותר מפסיק את הבעיה ברגע שהוא מוצא פתרון שהוא לפחות הטוב ביותר, עם סיבת הסיום - אפשרית ומוגבלת. |
bestBoundLimit |
הפותר מפסיק את פעולתו מוקדם ברגע שמוכיח שהגבול הטוב ביותר הוא לפחות הטוב ביותר, עם סיבת הסיום FEASIBLE או NO_SOLUTION_FOUND וההגבלה על היעד OBJECT. לפרטים נוספים והשוואה ל-cutoffLimit, אפשר לעיין במדריך למשתמש. |
solutionLimit |
הפותר מפסיק את פעולתו מוקדם אחרי שמצא את כל הפתרונות האפשריים האלה. סיבת הסיום היא FEASIBLE ומגבילה את הפתרון. אם השדה מוגדר, הערך שלו צריך להיות גדול מאפס. לרוב משתמשים בפותר הבעיות כדי לעצור את הפתרון האפשרי הראשון שנמצא. חשוב לשים לב שאין כל ערובה לערך היעד של הפתרונות שמוחזרים. בדרך כלל הפותרים לא יחזירו יותר פתרונות מעבר למגבלה של הפתרון, אבל לא נאכפת על ידי MathOpt. אפשר לעיין גם במאמר b/214041169. בשלב הזה נתמך עבור Gurobi ו-SCIP, ועבור CP-SAT רק עם ערך 1. |
threads |
אם הערך מוגדר, הוא צריך להיות >= 1. |
randomSeed |
ערך הבסיס למחולל המספרים האקראיים לכאורה בפותר הבסיסי. הערה: כל הפותרים משתמשים במספרים פסאודו אקראיים כדי לבחור דברים כמו טרנספורמציה באלגוריתם ה-LP, לכללים של פריצת קשירה ולתיקונים היוריסטיים. שינוי המיקום יכול להשפיע באופן משמעותי על התנהגות הפותר. למרות שלכל הפתרונות יש קונספט של מקור נתונים, חשוב לזכור שערכים חוקיים תלויים בפותר בפועל. - גורובי: [0:GRB_MAXINT] (החל מ-Gurobi 9.0 הוא 2x10^9). - GSCIP: [0:2147483647] (כלומר MAX_INT או kint32max או 2^31-1). - GLOP: [0:2147483647] (כמו למעלה) בכל המקרים, הפותר יקבל ערך ששווה ל: MAX(0, MIN(MAX_סף_VALUE_FOR_SOLVER, TRUESeed)). |
absoluteGapTolerance |
סבילות מוחלטת לאופטימיזציה (בעיקר) לפותרי MIP. ה-GAP המוחלט הוא הערך המוחלט של ההפרש בין: * הערך האובייקטי של הפתרון בר הקיימא הטוב ביותר שנמצא, * הגבול הכפול שהחיפוש מפיק. הפותר יכול להפסיק כאשר GAP המוחלט הוא מוחלט ביותר של GapTolerance (כאשר הוא מוגדר), ולהחזיר TERMINATION_REASON_OPTIMAL. אם השדה מוגדר, הערך חייב להיות >= 0. ראו גם יחסי סובלנות (GapTolerance). |
relativeGapTolerance |
סובלנות יחסית לאופטימליות (בעיקר) לפותרי MIP. ה-GAP היחסי הוא גרסה מנורמלת של ה-GAP המוחלט (מוגדר ב- להישארGapTolerance), שבו הנירמול תלוי בפותר, למשל. את ה-GAP המוחלט חלקי הערך האובייקטיומי של הפתרון בר הביצוע הטוב ביותר שנמצא. הפותר יכול להפסיק כאשר ה-GAP היחסי הוא יחסי לכל היותר GapTolerance (כאשר הוא מוגדר), והחזרת תהיה TERMINATION_REASON_OPTIMAL. אם השדה מוגדר, הערך חייב להיות >= 0. ראו גם מוחלט של GapTolerance. |
solutionPoolSize |
תחזוקה של עד |
LPAlgorithmProto
בחירת אלגוריתם לפתרון תוכניות ליניאריות.
טיפוסים בני מנייה (enum) | |
---|---|
LP_ALGORITHM_UNSPECIFIED |
|
LP_ALGORITHM_PRIMAL_SIMPLEX |
השיטה (הראשי) בדרך כלל יכול לספק פתרונות ראשוניים וכפולים, קרניים ראשוניות/כפולות לבעיות ראשוניות/כפולות ובסיסי. |
LP_ALGORITHM_DUAL_SIMPLEX |
שיטת Dual Simplex. בדרך כלל יכול לספק פתרונות ראשוניים וכפולים, קרניים ראשוניות/כפולות לבעיות ראשוניות/כפולות ובסיסי. |
LP_ALGORITHM_BARRIER |
שיטת המחסום, שנקראת גם בדרך כלל שיטת נקודה פנימית (IPM). בדרך כלל יכול לתת גם פתרונות ראשוניים וגם פתרונות כפולים. יישומים מסוימים עלולים להפיק קרניים גם בבעיות בלתי מוגבלות/בלתי מעשיות. לא ניתן בסיס אלא אם הפתרון הבסיסי מבצע "קרוסאובר" והוא מסתיים בקידוד חד-פעמי. |
LP_ALGORITHM_FIRST_ORDER |
אלגוריתם שמבוסס על שיטה מסדר ראשון. הם בדרך כלל יפיקו גם פתרונות ראשוניים וגם פתרונות כפולים, ואולי גם אישורים של חוסר היתכנות ראשוני ו/או כפול. שיטות בעדיפות ראשונה יספקו בדרך כלל פתרונות ברמת דיוק נמוכה יותר, לכן המשתמשים צריכים להגדיר פרמטרים של איכות לפתרון (למשל, סבילות) ולאמת את הפתרונות. |
EmphasisProto
רמת המאמץ שהוחלה על משימה אופציונלית במהלך הפתרון (ראו שימוש ב-SolveParametersProto).
הדגשה משמשת להגדרת תכונת פותר באופן הבא: * אם פותר לא תומך בתכונה, רק UNSPECIFIED יהיה תמיד תקף, כל הגדרה אחרת לרוב תהיה שגיאת ארגומנט לא חוקי (פותרים מסוימים יכולים גם לקבל כבוי). * אם הפותר תומך בתכונה: - כאשר ההגדרה היא UNSPECIFIED, נעשה שימוש בברירת המחדל הבסיסית. - כאשר לא ניתן לכבות את התכונה, כיבוי יחזיר הודעת שגיאה. - אם התכונה מופעלת כברירת מחדל, ברירת המחדל של הפותר ממופה בדרך כלל ל-MEDIUM. - אם התכונה נתמכת, הערכים LOW, MEDIUM, high וגבוהים מאוד אף פעם לא יספקו שגיאה והם ימופו להתאמה הטובה ביותר שלהם.
טיפוסים בני מנייה (enum) | |
---|---|
EMPHASIS_UNSPECIFIED |
|
EMPHASIS_OFF |
|
EMPHASIS_LOW |
|
EMPHASIS_MEDIUM |
|
EMPHASIS_HIGH |
|
EMPHASIS_VERY_HIGH |
ModelSolveParametersProto
ייצוג JSON |
---|
{ "variableValuesFilter": { object ( |
שדות | |
---|---|
variableValuesFilter |
מסנן שמיושם על כל הקונטיינרים החלקיים שהוחזרו, עם מפתחות של משתנים ב-PrimalSolutionProto וב-PrimalRayProto (PrimalSolutionProto.variable_values, PrimalRayProto.variable_values). דרישות: * FilterIds הם רכיבים של VariablesProto.id. |
dualValuesFilter |
מסנן שמיושם על כל הקונטיינרים החלקיים המוחזרים, עם מפתחי מגבלות לינאריים ב-DualSolutionProto וב-DualSolutionProto.dual_values, DualRay.dual_values. דרישות: * FilterIds הם רכיבים של LinearConstraints.id. |
reducedCostsFilter |
מסנן שמיושם על כל הקונטיינרים החלקיים שהוחזרו, עם מפתחות של משתנים ב-DualSolutionProto וב-DualSolutionProto (DualSolutionProto.reduced_costs, DualRay.reduced_costs). דרישות: * FilterIds הם רכיבים של VariablesProto.id. |
initialBasis |
בסיס ראשוני אופציונלי לפותרי LP עם הפעלה מהירה במצב ביניים (warm start). אם הוא מוגדר, הוא צפוי להיות תקף לפי |
solutionHints[] |
רמזים אופציונליים לפתרונות. אם הפותר הבסיסי מקבל רק רמז אחד, נעשה שימוש ברמז הראשון. |
branchingPriorities |
עדיפויות אופציונליות להסתעפות. משתנים עם ערכים גבוהים יותר יסתעפו קודם. משתנים שעבורם לא מוגדרות עדיפויות מקבלים את עדיפות ברירת המחדל של הפותר (בדרך כלל אפס). דרישות: * branchesPriorities.values חייב להיות סופי. * brancingPriorities.ids חייב להיות רכיבים של VariablesProto.ids. |
SparseVectorFilterProto
ההודעה הזו מאפשרת להריץ שאילתה/להגדיר חלקים ספציפיים של SparseXxxxVector. התנהגות ברירת המחדל היא לא לסנן דבר. שימוש נפוץ הוא להריץ שאילתות רק על חלקים של פתרונות (רק ערכים שאינם אפס או רק על קבוצה של ערכי משתנים שנבחרו ידנית).
ייצוג JSON |
---|
{ "skipZeroValues": boolean, "filterByIds": boolean, "filteredIds": [ string ] } |
שדות | |
---|---|
skipZeroValues |
עבור SparseBoolVectorProto "zero" |
filterByIds |
אם הערך הוא True, מוחזר רק הערכים שתואמים למזהים שמפורטים ב-FilterIds. |
filteredIds[] |
רשימת המזהים שצריך להשתמש בהם אם השדה filterByIds מוגדר כ-True. אם השדה filterByIds מוגדר כ-False, יש להשאיר את השדה ריק. הערה: אם השדה הזה ריק, והפרמטר filterByIds נכון, המשמעות היא שאינך רוצה לקבל מידע בתוצאה. |
BasisProto
אפיון משולב לפתרון של תוכנית לינארית.
שיטת הצד השלישי לפתרון תוכנות ליניאריות תמיד מחזירה 'פתרון ישים בסיסי' שאפשר לתאר בסך הכול בעזרת בסיס. הבסיס מקצה BaseStatusProto לכל משתנה ואילוץ לינארי.
לדוגמה חשוב להשתמש בפורמט סטנדרטי LP: min c * x s.t. A * x = b x >= 0 שיש לו יותר משתנים ממגבלות ועם דירוג שורה מלא A.
n הוא מספר המשתנים ומ-m את מספר המגבלות הלינאריות. אפשר לבנות בסיס תקף לבעיה הזו באופן הבא: * לכל האילוצים סטטוס הבסיס 'FIXED'. * בחרו משתני m כך שהעמודות של A יהיו בלתי תלויות לינאריות והקצו את הסטטוס BASIC. * מקצים את הסטטוס AT_LOWER למשתנים הנותרים של n - m.
הפתרון הבסיסי לבסיס הזה הוא הפתרון הייחודי של A * x = b שמכיל את כל המשתנים שהסטטוס AT_LOWER נקבע לגבולות התחתון שלהם (כל האפס). הפתרון שמתקבל נקרא פתרון ישים בסיסי אם הוא עומד גם בתנאי x >= 0.
ייצוג JSON |
---|
{ "constraintStatus": { object ( |
שדות | |
---|---|
constraintStatus |
סטטוס בסיס האילוץ. דרישות: * queryStatus.ids שווה ל-LinearConstraints.ids. |
variableStatus |
סטטוס של בסיס משתנה. דרישות: * queryStatus.ids שווה ל-VariablesProto.ids. |
basicDualFeasibility |
זוהי תכונה מתקדמת שמשמשת את MathOpt כדי לאפיין את ההיתכנות של פתרונות LP לא אופטימליים (פתרונות אופטימליים תמיד יקבלו את הסטטוס SOLUTION_STATUS_FEASIBLE). עבור דפי נחיתה חד-צדדיים, הוא צריך להיות שווה לסטטוס ההיתכנות של הפתרון הכפול המשויך. בדפי נחיתה דו-צדדיים, המצב עשוי להיות שונה במקרים מסוימים קצוות (למשל, פתרונות חלקיים עם חד-כיווניות ראשוניות). אם מציינים בסיס התחלה באמצעות ModelSolveParametersProto.initial_basis, המערכת מתעלמת מהערך הזה. היא רלוונטית רק לבסיס שמוחזר על ידי SolutionProto.basis. |
SparseBasisStatusVector
ייצוג מועט של וקטור של סטטוסים של בסיס.
ייצוג JSON |
---|
{
"ids": [
string
],
"values": [
enum ( |
שדות | |
---|---|
ids[] |
חייב להיות ממוין (בסדר הולך וגדל) עם הבחנה בין כל הרכיבים. |
values[] |
האורך חייב להיות זהה למזהים. |
BasisStatusProto
הסטטוס של משתנה/אילוץ על בסיס LP.
טיפוסים בני מנייה (enum) | |
---|---|
BASIS_STATUS_UNSPECIFIED |
ערך Guard שמייצג אין סטטוס. |
BASIS_STATUS_FREE |
המשתנה/אילוץ חופשי (ללא גבולות סופיים). |
BASIS_STATUS_AT_LOWER_BOUND |
המשתנה/האילוץ נמצא בגבול התחתון שלו (שחייב להיות סופי). |
BASIS_STATUS_AT_UPPER_BOUND |
המשתנה/האילוץ נמצא בגבול העליון שלו (שחייב להיות סופי). |
BASIS_STATUS_FIXED_VALUE |
למשתנה/לאילוץ יש גבול תחתון סופי וגבול עליון זהים. |
BASIS_STATUS_BASIC |
המשתנה/האילוץ הוא בסיסי. |
SolutionStatusProto
היתכנות של פתרון ראשוני או כפול כפי שטוען הפותר.
טיפוסים בני מנייה (enum) | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
ערך Guard שמייצג אין סטטוס. |
SOLUTION_STATUS_UNDETERMINED |
הפותר לא טוען סטטוס היתכנות. |
SOLUTION_STATUS_FEASIBLE |
הפתרון טוען שהפתרון ניתן לביצוע. |
SOLUTION_STATUS_INFEASIBLE |
הפתרון טוען שהפתרון אינו ישים. |
SolutionHintProto
הצעה לפתרון התחלתי.
פתרוןי MIP בדרך כלל רוצים רק מידע ראשוני (variableValues
), בעוד שפותרי LP רוצים לקבל גם מידע ראשוני וגם מידע כפול (dualValues
).
הרבה פתרונות של MIP יכולים לעבוד עם: (1) פתרונות חלקיים שלא מציינים את כל המשתנים, או (2) פתרונות לא אפשריים. במקרים כאלה, הפותרים בדרך כלל פותרים MIP כדי להשלים או לתקן את הרמז.
האופן שבו הרמז משתמש ברמז, אם בכלל, תלוי במידה רבה בפותר, בסוג הבעיה ובאלגוריתם שבו נעשה שימוש. הדרך הבטוחה ביותר להבטיח שלרמז יש השפעה היא לקרוא את יומני הפתרונות הבסיסיים עם הרמז או בלעדיו.
פתרוןי LP המבוססים על סימפטומים בדרך כלל מעדיפים בסיס ראשוני לרמז לפתרון (אחרת הם צריכים להמיר את הרמז לפתרון ניתן לשימוש בסיסי).
ייצוג JSON |
---|
{ "variableValues": { object ( |
שדות | |
---|---|
variableValues |
יכול להיות שגם הקצאה חלקית של ערכים למשתנים הראשוניים של הבעיה. הדרישות שאינן תלויות בפותר עבור הודעת המשנה הזו הן: * variableValues.ids הם רכיבים של VariablesProto.ids. * הערך של variableValues.values חייב להיות סופי. |
dualValues |
הקצאה (שעשויה להיות חלקית) של ערכים למגבלות הלינאריות של הבעיה. דרישות: * dualValues.ids הם רכיבים של LinearConstraintsProto.ids. * DualValues.values חייבים להיות סופיים. |
SparseInt32VectorProto
ייצוג דל של וקטור של Int.
ייצוג JSON |
---|
{ "ids": [ string ], "values": [ integer ] } |
שדות | |
---|---|
ids[] |
צריך למיין (בסדר עולה) כאשר כל הרכיבים נפרדים. |
values[] |
האורך חייב להיות זהה למזהים. |
SolveResultProto
החוזה של מקרים שבהם תמיסות או קרניים ראשוניים/כפולים הוא מורכב. תיאור מלא זמין בכתובת activity_reasons.md.
עד שייחתמו חוזה מדויק, עדיף פשוט לבדוק אם קיים פתרון או קרניים ולא להסתמך על סיבת הסיום.
ייצוג JSON |
---|
{ "termination": { object ( |
שדות | |
---|---|
termination |
הסיבה לכך שהפותר הפסיק לפעול. |
solutions[] |
החוזה הכללי לפי סדר הפתרונות שפותרים עתידיים צריכים ליישם הוא הזמנה לפי: 1. הפתרונות עם פתרון ראשוני ישים, מסודרים לפי היעד הראשוני הטוב ביותר. 2. הפתרונות עם פתרון כפול בר-ביצוע, ממוינים לפי המטרה הכפולה הטובה ביותר (המטרות הכפולות שלא ידועות הן הגרועות ביותר) 3. אפשר להחזיר את כל הפתרונות שנותרו בכל סדר שתרצו. |
primalRays[] |
כיוונים של שיפור ראשוני בלתי מוגבל, או אישורי היתכנות כפולים. בדרך כלל מסופק עבור DoneReasonProtos UNboundED ו-DUAL_INFEASIBLE |
dualRays[] |
כיוונים של שיפור כפול ללא הגבלה, או אישורי היתכנות ראשוניים. בדרך כלל מסופק במקרים של FinishReasonProto בלתי ראוי. |
solveStats |
נתונים סטטיסטיים על תהליך הפתרון, למשל: זמן ריצה, איטרציות. |
TerminationProto
כל המידע לגבי הסיבה לסיום הקריאה ל-Solve() .
ייצוג JSON |
---|
{ "reason": enum ( |
שדות | |
---|---|
reason |
מידע נוסף ב- |
limit |
LIMIT_UNSPECIFIED, אלא אם הסיבה היא TERMINATION_REASON_FEASIBLE או TERMINATION_REASON_NO_SOLUTION_FOUND. לא כל הפותרים יכולים תמיד לקבוע את המגבלה שגרמה לסיום. כאשר לא ניתן לקבוע מהי הסיבה, נעשה שימוש ב-LIMIT_UNDETERMINED. |
detail |
מידע ספציפי בדרך כלל לפותר לגבי סיום. |
problemStatus |
סטטוסים של היתכנות לבעיות ראשוניות ולבעיות כפולות. החל מ-18 ביולי 2023 יכול להיות שההודעה הזו לא תופיע. אם הפרמטר חסר, אפשר למצוא את ה- issueStatus ב-Solve resultProto.solve_stats. |
objectiveBounds |
הגבלה על הערך היעד האופטימלי. החל מ-18 ביולי 2023 יכול להיות שההודעה הזו לא תופיע. אם חסר, הפרמטר objectBounds.primal_bound יכול למצוא ב-SolveAmountProto.solve.stats.best_primal_bound. |
TerminationReasonProto
הסיבה לסיום קריאה ל-Solve() .
טיפוסים בני מנייה (enum) | |
---|---|
TERMINATION_REASON_UNSPECIFIED |
|
TERMINATION_REASON_OPTIMAL |
נמצא פתרון אופטימלי (עד סבילות מספרית). |
TERMINATION_REASON_INFEASIBLE |
לבעיה הראשונית אין פתרונות מעשיים. |
TERMINATION_REASON_UNBOUNDED |
הבעיה הראשונית היא אפשרית, וניתן למצוא פתרונות טובים באופן שרירותי לאורך קרן ראשונית. |
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED |
הבעיה הבסיסית היא לא ישרה או בלתי מוגבלת. פרטים נוספים על סטטוס הבעיה זמינים ב- השלביםStats.problem_status. לידיעתך, ניתן למפות כאן את הסטטוס הלא-קבוע של Gurobi. |
TERMINATION_REASON_IMPRECISE |
הבעיה נפתרה לפי אחד מהקריטריונים שמפורטים למעלה ('אופטימלי', 'לא בר-ביצוע', 'לא מוגבל' או 'לא אפשרי', אבל לא מולאה אחת או יותר). יש פתרונות או קרניים ראשוניים/כפולים, אבל ייתכן שהם לא ישיגו בכלל, או (אם הבעיה הייתה כמעט אופטימלית) הם עלולים להוות פער בין מטרת הפתרון הטוב ביותר לבין היעד הטוב ביותר. המשתמשים עדיין יכולים להריץ שאילתות על פתרונות או קרניים ראשוניים/כפולים ועל נתונים סטטיסטיים של פתרונות, אבל הם אחראים לטפל באי הדיוק המספרי. |
TERMINATION_REASON_FEASIBLE |
כלי האופטימיזציה הגיע למגבלה מסוימת ומחזיר פתרון מעשי. לקבלת תיאור מפורט של סוג המגבלה שהגעתם אליה, אפשר לעיין ב-SolvePRODUCTProto.limit_detail. |
TERMINATION_REASON_NO_SOLUTION_FOUND |
כלי האופטימיזציה הגיע למגבלה כלשהי והוא לא מצא פתרון ראשוני מעשי. לקבלת תיאור מפורט של סוג המגבלה שהגעתם אליה, אפשר לעיין ב-SolvePRODUCTProto.limit_detail. |
TERMINATION_REASON_NUMERICAL_ERROR |
האלגוריתם הפסיק לפעול כי הוא נתקל בשגיאה מספרית שבעקבותיה אי אפשר לשחזר אותו. אין מידע זמין על הפתרון. |
TERMINATION_REASON_OTHER_ERROR |
האלגוריתם הופסק עקב שגיאה שלא נכללת באחד מהסטטוסים שהוגדרו למעלה. אין מידע זמין על הפתרון. |
LimitProto
כש-Solve() מפסיק מוקדם עם DoneReasonProto FEASIBLE או NO_SOLUTION_FOUND, המגבלה הספציפית שהושגה.
טיפוסים בני מנייה (enum) | |
---|---|
LIMIT_UNSPECIFIED |
משמש כערך null אם הפסקנו את השימוש בו ללא מגבלה (למשל, TERMINATION_REASON_OPTIMAL). |
LIMIT_UNDETERMINED |
הפותר הבסיסי לא חושף את המגבלה שהגעתם אליה. |
LIMIT_ITERATION |
אלגוריתם איטרטיבי הופסק אחרי שביצע את המספר המרבי של חזרות (למשל, איטרציות חד-פעמיות או מכשולים). |
LIMIT_TIME |
האלגוריתם הופסק אחרי זמן חישוב שצוין על ידי המשתמש. |
LIMIT_NODE |
אלגוריתם של הסתעפות וכריכה הופסק כי הוא בחן מספר מקסימלי של צמתים בעץ ההסתעפות והקשורים. |
LIMIT_SOLUTION |
האלגוריתם הופסק כי הוא מצא את מספר הפתרונות הנדרש. בדרך כלל משתמשים באפשרות הזו ב-MIP כדי לגרום לפותר להחזיר את הפתרון האפשרי הראשון שהוא נתקל בו. |
LIMIT_MEMORY |
האלגוריתם הפסיק לפעול כי אין לו זיכרון. |
LIMIT_CUTOFF |
הפותר פעל עם נקודת חיתוך (למשל, SolveParameters.cutoff_limit הוגדר) על היעד, והעיד על כך שהמשתמש לא רצה פתרון גרוע יותר מהמועד האחרון להזמנה, והפותר הגיע למסקנה שאין פתרונות שטובים לפחות כמו הסף האחרון. בדרך כלל לא ניתן לספק מידע נוסף על פתרון. |
LIMIT_OBJECTIVE |
האלגוריתם הופסק כי הוא מצא פתרון או הגבול טוב יותר מהמגבלה שהגדיר המשתמש (מידע נוסף זמין בקטע SolveParameters.objective_limit ו-SolveParameters.best_bound_limit). |
LIMIT_NORM |
האלגוריתם הופסק כי הנורמה של איטרציה נעשתה גדולה מדי. |
LIMIT_INTERRUPTED |
האלגוריתם הופסק עקב אות הפרעה או בקשת הפרעה ממשתמש. |
LIMIT_SLOW_PROGRESS |
האלגוריתם הופסק כי הוא לא הצליח להמשיך להתקדם לעבר הפתרון. |
LIMIT_OTHER |
האלגוריתם הופסק עקב מגבלה שלא מכוסה על ידי אחת מהאפשרויות שלמעלה. לתשומת ליבך: נעשה שימוש ב-LIMIT_UNDETERMINED אם לא ניתן לקבוע את הסיבה, ונעשה שימוש ב-LIMIT_OTHER כשהסיבה ידועה, אבל היא לא מתאימה לאף אחת מהחלופות שלמעלה. DoneProto.detail עשוי להכיל מידע נוסף על המגבלה. |
ProblemStatusProto
סטטוס ההיתכנות של הבעיה הראשונית והכפולה שלה (או הכפולה של רגיעה מתמשכת) כפי שטוען הפותר. הפותר לא נדרש להחזיר אישור עבור התביעה (למשל, הפותר יכול לטעון להיתכנות ראשונית בלי להחזיר פתרון מעשי ראשוני). הסטטוס המשולב הזה מספק תיאור מקיף של טענות הפתרון לגבי היתכנות וחוסר עקביות של הבעיה שנפתרה. למשל:
- סטטוס אפשרי לבעיות ראשוניות וכפולות מצביע על כך שהבעיה הראשונה היא אפשרית ומוגבלת, וסביר להניח שיש לה פתרון אופטימלי (מובטח לבעיות ללא מגבלות לא ליניאריות).
- סטטוס ראשוני בר-ביצוע וסטטוס כפול לא-אפשרי מציין שהבעיה הבסיסית היא בלתי מוגבלת (כלומר, יש לה פתרונות טובים באופן שרירותי).
שימו לב שסטטוס שני לא אפשרי כשלעצמו (כלומר, מלווה בסטטוס ראשוני לא ידוע) לא מרמז על כך שהבעיה הבסיסית אינה קשורה, מכיוון ששתי הבעיות עלולות להיות בלתי אפשריות. בנוסף, גם אם סטטוס ראשוני וכפול יכול לרמוז על קיומו של פתרון אופטימלי, הוא לא מבטיח שהפותר מצא פתרון אופטימלי כזה.
ייצוג JSON |
---|
{ "primalStatus": enum ( |
שדות | |
---|---|
primalStatus |
הסטטוס של הבעיה הראשונית. |
dualStatus |
הסטטוס של הבעיה הכפולה (או של הכפולה של רגיעה מתמשכת). |
primalOrDualInfeasible |
אם True, הפותר טוען שהבעיה הראשונית או הכפולה לא אפשרית, אבל הוא לא יודע איזו (או אם שניהם לא אפשריים). יכול להיות true רק כאשר primal_problem_status = dual_problem_status = kUndetermined. המידע הנוסף הזה נדרש לעיתים קרובות כשעיבוד מראש קובע שאין פתרון אופטימלי לבעיה (אבל הוא לא יכול לקבוע אם הבעיה נובעת מחוסר היתכנות, מחוסר גבולות או משניהם). |
FeasibilityStatusProto
סטטוס היתכנות של הבעיה כפי שהפותר טען (הפותר לא נדרש להחזיר אישור עבור התביעה).
טיפוסים בני מנייה (enum) | |
---|---|
FEASIBILITY_STATUS_UNSPECIFIED |
ערך Guard שמייצג אין סטטוס. |
FEASIBILITY_STATUS_UNDETERMINED |
הפותר לא טוען סטטוס. |
FEASIBILITY_STATUS_FEASIBLE |
הפתרון טוען שהבעיה אפשרית. |
FEASIBILITY_STATUS_INFEASIBLE |
ה-Solver טוען שהבעיה אינה אפשרית. |
ObjectiveBoundsProto
הגבלה על הערך היעד האופטימלי.
ייצוג JSON |
---|
{ "primalBound": number, "dualBound": number } |
שדות | |
---|---|
primalBound |
הפותר טוען שהערך האופטימלי הוא שווה או טוב יותר (קטן יותר לצורך מזעור וגדול יותר לצורך הגדלת הרווחים) מ-primalBound עד לסבילות ההיתכנות הראשונית של הפותרים (ראו אזהרה בהמשך): * primalBound הוא טריוויאלי (+inf עבור מזעור ו-inf כדי למקסם) כאשר הפתרון אינו טוען שאין לו קשר כזה. * הפרמטר primalBound יכול להיות קרוב יותר לערך האופטימלי יותר מהמטרה של הפתרון הראשוני הטוב ביותר. בפרט, ערך primalBound עלול להיות לא טרי, גם אם לא מוחזרים פתרונות ראשוניים מעשיים. אזהרה: הטענה המדויקת היא שקיים פתרון ראשוני אשר: * הוא בר-ביצוע מבחינה מספרית (כלומר, ניתן לביצוע עד לסבולת הפותרים), ושיש לו ערך אובייקטיבי primalBound. הפתרון הזה מעשי מבחינה מספרית עשוי להיות מעט לא מעשי, ובמקרה כזה primalBound יכול להיות רק טוב יותר מהערך האופטימלי. תרגום של סובלנות היתכנות ראשונית לסבלנות ב-primalBound הוא לא פשוט, במיוחד במקרים שבהם סובלנות ההיתכנות גדולה יחסית (למשל, בפתרון באמצעות PDLP). |
dualBound |
הפותר טוען שהערך האופטימלי הוא שווה או גרוע יותר (גדול יותר למזעור וקטן יותר לצורך הגדלת האופטימיזציה) מאשר סובלנות היתכנות הכפולה עד לפותרים (ראו אזהרה בהמשך): * DualBound הוא טריוויאלי (-inf for minimization ו-+inf maximization) כאשר הפותר לא טוען שיש לו קשר כזה. בדומה ל-primalBound, זה יכול לקרות אצל חלק מהפותרים גם כשהם חוזרים למצב אופטימלי. פתרוןי MIP ידווחו בדרך כלל על מגבלה גם אם הוא לא מדויק. * במקרים של בעיות רציפות, DualBound יכולה להיות קרובה יותר לערך האופטימלי מאשר המטרה של הפתרון הכפול הטוב ביותר האפשרי. עבור MIP, אחד מהערכים הלא טריוויאליים הראשונים של dualBound הוא בדרך כלל הערך האופטימלי של הרגיעה של ה-LP של ה-MIP. * DualBound צריך להיות טוב יותר (קטן יותר למזעור וגדול יותר למקסום) מאשר primalBound עד לפתרונות של פותרים (ראו אזהרה בהמשך). אזהרה: * במקרה של בעיות מתמשכות, הטענה המדויקת היא שקיים פתרון כפול אשר: * הוא בר-ביצוע מספרי (כלומר, ניתן לביצוע עד לסבולת הפותרים), ויש לו ערך אובייקטיבי DualBound. הפתרון הזה הוא בר-ביצוע מספרי, ובמקרה כזה DualBound יכול להיות גרוע יותר מהערך האופטימלי ומ-primalBound. בדומה למקרה הראשוני, אין חשיבות רבה לתרגום של סובלנות היתכנות כפולה לסבלנות ב-DualBound, במיוחד כאשר סובלנות ההיתכנות גדולה יחסית. עם זאת, חלק מהפותרים מספקים גרסה מתוקנת של DualBound שיכולה להיות בטוחה יותר מבחינה נומרית. ניתן לגשת לגרסה המתוקנת הזו דרך הפלט הספציפי של הפותר (למשל: עבור PDLP, pdlp_output.convergence_information.Corrected_dual_objective). * עבור פתרוןי MIP, DualBound עשוי להיות משויך לפתרון כפול לרגיעה מתמשכת (למשל, הרגיעה של LP), אבל לרוב זו תוצאה מורכבת של הביצוע של הפותרים, ולרוב היא לא מדויקת יותר מהגבולות שמדווחים על ידי הפותרים של LP. |
SolutionProto
מה שנכלל בפתרון תלוי בסוג הבעיה ובפותר. הדפוסים הנפוצים כרגע הם 1. פתרונות MIP מחזירים רק פתרון ראשוני. 2. בדרך כלל, הפתרונות של LPs פשוטים מחזירים בסיס ואת הפתרונות הראשוניים והכפולים שמשויכים לבסיס הזה. 3. בדרך כלל, פתרונות רציפים אחרים מחזירים פתרון ראשוני וכפול שמחובר באופן תלוי-פותר.
דרישות: * יש להגדיר שדה אחד לפחות. פתרון לא יכול להיות ריק.
ייצוג JSON |
---|
{ "primalSolution": { object ( |
שדות | |
---|---|
primalSolution |
|
dualSolution |
|
basis |
|
PrimalSolutionProto
פתרון לבעיית אופטימיזציה.
לדוגמה נבחן תוכנית לינארית פשוטה: min c * x s.t. A * x >= b x >= 0. פתרון ראשוני הוא הקצאה של ערכים ל-x. הוא אפשרי אם הוא עומד בתנאי A * x >= b ו-x >= 0 מלמעלה. בהודעה PrimalSolutionProto למטה, variableValues הוא x ו-objectValue הוא c * x.
ייצוג JSON |
---|
{ "variableValues": { object ( |
שדות | |
---|---|
variableValues |
דרישות: * variableValues.ids הם רכיבים של VariablesProto.ids. * הערך של variableValues.values חייב להיות סופי. |
objectiveValue |
ערך אובייקטיבי כפי שמחושב על ידי הפתרון הבסיסי. הערך לא יכול להיות אינסופי או NaN. |
auxiliaryObjectiveValues |
ערכים אובייקטיביים שמחושבים על ידי הפותר הבסיסי. המפתחות חייבים להיות מזהים חוקיים של אובייקטי עזר. הערכים לא יכולים להיות אינסופיים או NaN. אובייקט שמכיל רשימה של |
feasibilityStatus |
סטטוס ההיתכנות של הפתרון בהתאם לפותר הבסיסי. |
DualSolutionProto
פתרון לכפולה של בעיית אופטימיזציה.
לדוגמה נבחן את צמד התוכניות הלינאריות הכפולות של {2/}: (ראשי) (Dual) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. הפתרון הכפול הוא הצמד (y, r). הדבר אפשרי אם הוא עומד במגבלות שמפורטות למעלה (Dual).
בהודעה הבאה, y הוא dualValues, r הוא במורד העלויות, ו-b * y הוא ערך אובייקטיבי.
ייצוג JSON |
---|
{ "dualValues": { object ( |
שדות | |
---|---|
dualValues |
דרישות: * dualValues.ids הם רכיבים של LinearConstraints.ids. * DualValues.values חייבים להיות סופיים. |
reducedCosts |
דרישות: * ReduceCosts.ids הם רכיבים של VariablesProto.ids. * הערך של Costs.values צריך להיות סופי. |
feasibilityStatus |
סטטוס ההיתכנות של הפתרון בהתאם לפותר הבסיסי. |
objectiveValue |
|
PrimalRayProto
הכוונה של שיפור בלתי מוגבל בבעיית אופטימיזציה; בדומה לכך, אישור על יכולת פעולה של בעיית האופטימיזציה כפולה.
לדוגמה נבחן תוכנית לינארית פשוטה: min c * x s.t. A * x >= b x >= 0 קרן ראשונית היא x שמספק: c * x < 0 A * x >= 0 x >= 0 שימו לב שכשנותנים פתרון בר-ביצוע, כל כפולה חיובית של הקרניים הראשוניות וגם הפתרון הזה עדיין מעשית, ונותן ערך אובייקטיבי טוב יותר. קרניים ראשוניות מוכיחות גם שבעיית האופטימיזציה הכפולה לא אפשרית.
בהודעה PrimalRay שבהמשך, הערך של variableValues הוא x.
ייצוג JSON |
---|
{
"variableValues": {
object ( |
שדות | |
---|---|
variableValues |
דרישות: * variableValues.ids הם רכיבים של VariablesProto.ids. * הערך של variableValues.values חייב להיות סופי. |
DualRayProto
כיוון של שיפור בלתי מוגבל מבחינת הכפולה של אופטימיזציה, בעיה; בדומה לכך, אישור על חוסר היתכנות ראשוני.
לדוגמה נבחן את צמד התוכניות הלינאריות הכפולות של {2/}: (ראשי) (Dual) min c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. הקרניים הכפולות הן הצמד (y, r) שממלא: b * y > 0 y * A + r = 0 y, r >= 0 שימו לב שהוספת כפולה חיובית של (y, r) לפתרון אפשרי כפול שומרת על היתכנות כפולה ומשפרת את היעד (הוכחה לכך שהכפולות בלתי מוגבלת). הקרניים הכפולות גם מוכיחות שהבעיה הראשונית אינה אפשרית.
בהודעה DualRay שבהמשך, y הוא dualValues ו-r להפחיתCosts.
ייצוג JSON |
---|
{ "dualValues": { object ( |
שדות | |
---|---|
dualValues |
דרישות: * dualValues.ids הם רכיבים של LinearConstraints.ids. * DualValues.values חייבים להיות סופיים. |
reducedCosts |
דרישות: * ReduceCosts.ids הם רכיבים של VariablesProto.ids. * הערך של Costs.values צריך להיות סופי. |
SolveStatsProto
ייצוג JSON |
---|
{
"solveTime": string,
"problemStatus": {
object ( |
שדות | |
---|---|
solveTime |
הזמן שחלף של שעון קיר כפי שנמדד באמצעות Mat_opt, זהו הזמן המשוער בתוך Solver::Solve(). הערה: בקטגוריה הזו לא נכללים עבודה שהתבצעה במסגרת בניית המודל. משך זמן בשניות עם עד תשע ספרות עשרוניות, שמסתיים ב-' |
problemStatus |
סטטוסים של היתכנות לבעיות ראשוניות ולבעיות כפולות. |
simplexIterations |
|
barrierIterations |
|
firstOrderIterations |
|
nodeCount |
|