אינדקס
BasisProto
(הודעה)BasisStatusProto
(טיפוסים בני מנייה (enum))DualRayProto
(הודעה)DualSolutionProto
(הודעה)EmphasisProto
(טיפוסים בני מנייה (enum))FeasibilityStatusProto
(טיפוסים בני מנייה (enum))IndicatorConstraintProto
(הודעה)LPAlgorithmProto
(טיפוסים בני מנייה (enum))LimitProto
(טיפוסים בני מנייה (enum))LinearConstraintsProto
(הודעה)LinearExpressionProto
(הודעה)ModelProto
(הודעה)ModelSolveParametersProto
(הודעה)ObjectiveBoundsProto
(הודעה)ObjectiveProto
(הודעה)PrimalRayProto
(הודעה)PrimalSolutionProto
(הודעה)ProblemStatusProto
(הודעה)QuadraticConstraintProto
(הודעה)SecondOrderConeConstraintProto
(הודעה)SolutionHintProto
(הודעה)SolutionProto
(הודעה)SolutionStatusProto
(טיפוסים בני מנייה (enum))SolveParametersProto
(הודעה)SolveResultProto
(הודעה)SolveStatsProto
(הודעה)SolverTypeProto
(טיפוסים בני מנייה (enum))SosConstraintProto
(הודעה)SparseBasisStatusVector
(הודעה)SparseDoubleMatrixProto
(הודעה)SparseDoubleVectorProto
(הודעה)SparseInt32VectorProto
(הודעה)SparseVectorFilterProto
(הודעה)TerminationProto
(הודעה)TerminationReasonProto
(טיפוסים בני מנייה (enum))VariablesProto
(הודעה)
BasisProto
אפיון קומבינטורי לפתרון לתוכנית לינארית.
השיטה החד-כיוונית לפתרון תוכניות ליניאריות תמיד מחזירה "פתרון בר-ביצוע בסיסי" שניתן לתאר אותו באופן משולב באמצעות בסיס. בסיס מקצה את BasisStatusProto לכל משתנה ואילוץ לינארי.
לדוגמה, ניקח לדוגמה תבנית סטנדרטית LP: min c * x s.t. A * x = b x >= 0 שיש בו יותר משתנים מאילוצים ועם דירוג שורה מלא A.
תן n למספר המשתנים, ו-m את מספר האילוצים הלינאריים. ניתן לבנות בסיס חוקי לבעיה הזו באופן הבא: * סטטוס הבסיס של כל האילוצים יהיה 'מתוקן'. * בוחרים m משתנים כך שהעמודות של A הן בלתי תלויות באופן לינארי ומקצים את הסטטוס BASIC. * הקצה את הסטטוס AT_LOWER עבור n - m המשתנים הנותרים.
הפתרון הבסיסי לבסיס זה הוא הפתרון הייחודי של A * x = b, שכל המשתנים שהסטטוס שלהם הוא AT_LOWER קבועים בגבולות הנמוכים שלהם (כל אפס). הפתרון שמתקבל נקרא פתרון בר-ביצוע בסיסי אם הוא עונה גם על x >= 0.
שדות | |
---|---|
constraint_status |
סטטוס בסיס האילוץ. דרישות: * Restrict_status.ids שווה ל-linConstraints.ids. |
variable_status |
סטטוס בסיס משתנה. דרישות: * האילוץ 'אילוץ_status.ids' שווה ל-VariablesProto.ids. |
basic_dual_feasibility |
זוהי תכונה מתקדמת שבה משתמשת MathOpt כדי לאפיין את ההיתכנות של פתרונות LP לא אופטימליים (הסטטוס של פתרונות אופטימליים תמיד יהיה SOLUTION_STATUS_FEASIBLE). עבור דפי נחיתה חד-צדדיים, הוא צריך להיות שווה לסטטוס ההיתכנות של הפתרון הכפול המשויך. עבור דפי נחיתה דו-צדדיים, הוא עשוי להיות שונה במקרים מסוימים בקצוות (למשל, פתרון חלקי עם פתרון חלקיקי פשוט). אם אתם מספקים בסיס התחלתי דרך ModelSolveParametersProto.first_basis, המערכת תתעלם מהערך הזה. היא רלוונטית רק לבסיס שהוחזר על ידי SolutionProto.basis. |
BasisStatusProto
הסטטוס של משתנה/אילוץ על בסיס LP.
טיפוסים בני מנייה (enums) | |
---|---|
BASIS_STATUS_UNSPECIFIED |
ערך שומר שמייצג 'אין סטטוס'. |
BASIS_STATUS_FREE |
המשתנה/האילוץ הוא חופשי (אין לו גבולות מוגבלים). |
BASIS_STATUS_AT_LOWER_BOUND |
המשתנה/האילוץ נמצא בגבול התחתון שלו (שחייב להיות סופי). |
BASIS_STATUS_AT_UPPER_BOUND |
המשתנה/האילוץ נמצא בגבול העליון שלו (שחייב להיות סופי). |
BASIS_STATUS_FIXED_VALUE |
למשתנה/לאילוץ יש גבול עליון ותחתון זהה. |
BASIS_STATUS_BASIC |
המשתנה/האילוץ הוא בסיסי. |
DualRayProto
כיוון של שיפור חסר תקדים בקישור הכפול של אופטימיזציה, בעיה; ובדומה, אישור של אי-יכולת מעשית.
לדוגמה, ניקח לדוגמה את זוג התוכניות הלינאריות הכפולות הראשוניות: (Primal) (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 הוא dual_values ו-r הוא מופחת_costs.
שדות | |
---|---|
dual_values |
דרישות: * dual_values.ids הם רכיבים של לינאריConstraints.ids. * Dual_values.values חייבים להיות סופיים. |
reduced_costs |
דרישות: * low_costs.ids הם אלמנטים של VariablesProto.ids. * below_costs.values חייבים להיות סופיים. |
DualSolutionProto
פתרון לכפול של בעיית אופטימיזציה.
לדוגמה, ניקח לדוגמה את זוג התוכניות הלינאריות הכפולות הראשוניות: (Primal) (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 הוא ערך כפול, r הוא ערך מופחת ו-b * y הוא ערך אובייקטיבי.
שדות | |
---|---|
dual_values |
דרישות: * dual_values.ids הם רכיבים של לינאריConstraints.ids. * Dual_values.values חייבים להיות סופיים. |
reduced_costs |
דרישות: * low_costs.ids הם אלמנטים של VariablesProto.ids. * below_costs.values חייבים להיות סופיים. |
feasibility_status |
סטטוס ההיתכנות של הפתרון לפי הפותר הבסיסי. |
objective_value |
|
EmphasisProto
רמת המאמץ שהוחלה על משימה אופציונלית בזמן פתרון (יש לעיין ב-SolveParametersProto לשימוש).
ההדגשה משמשת להגדרת תכונת פתרון באופן הבא: * אם הפותר לא תומך בתכונה, רק UNSPECIFIED תמיד יהיה תקף, כל הגדרה אחרת תהיה בדרך כלל שגיאת ארגומנט לא חוקית (חלק מהפותרים עשויים גם לקבל את האפשרות 'מושבת'). * אם הפותר תומך בתכונה: - כשהאפשרות מוגדרת ל-UNSPECIFIED, ייעשה שימוש בברירת המחדל הבסיסית. - אם לא ניתן להשבית את התכונה, הכיתוב 'כבוי' יחזיר הודעת שגיאה. - אם התכונה מופעלת כברירת מחדל, ברירת המחדל של הפותר ממופה בדרך כלל ל-MEDIUM. - אם התכונה נתמכת, הערכים LOW, MEDIUM, גבוה ו-VERY high אף פעם לא יספקו שגיאה, והם ימופו לפי ההתאמה הטובה ביותר שלהם.
טיפוסים בני מנייה (enums) | |
---|---|
EMPHASIS_UNSPECIFIED |
|
EMPHASIS_OFF |
|
EMPHASIS_LOW |
|
EMPHASIS_MEDIUM |
|
EMPHASIS_HIGH |
|
EMPHASIS_VERY_HIGH |
FeasibilityStatusProto
סטטוס ההיתכנות של הבעיה כפי שנתבע על ידי הפותר (פותר אינו נדרש להחזיר אישור עבור התביעה).
טיפוסים בני מנייה (enums) | |
---|---|
FEASIBILITY_STATUS_UNSPECIFIED |
ערך שומר שמייצג 'אין סטטוס'. |
FEASIBILITY_STATUS_UNDETERMINED |
הפותר לא טוען לסטטוס. |
FEASIBILITY_STATUS_FEASIBLE |
המפתח טוען שהבעיה אפשרית. |
FEASIBILITY_STATUS_INFEASIBLE |
פותר טוען שהבעיה בלתי אפשרית. |
IndicatorConstraintProto
נתונים שמייצגים אילוץ של מדד יחיד בצורת: Variable(indicator_id) = (activate_on_zero ? 0 : 1) <!-- below_bound <= ביטוי <= עליון_bound.
אם משתנה שמעורב באילוץ הזה (האינדיקטור או שמופיע ב-expression
) נמחק, המערכת מתייחסת אליו כאילו הוא הוגדר לאפס. באופן ספציפי, מחיקת משתנה האינדיקטור פירושה שאילוץ המחוון הוא ריק אם activate_on_zero
שגוי, ושהיא שוות ערך לאילוץ לינארי אם activate_on_zero
נכון.
שדות | |
---|---|
activate_on_zero |
אם True, אז אם משתנה המדד מקבל את הערך 0, האילוץ המשתמע חייב להחזיק. אחרת, אם משתנה המדד מקבל ערך 1, האילוץ המשתמע חייב להישאר בתוקף. |
expression |
חייב להיות ביטוי לינארי חוקי ביחס למודל המכיל: * כל התנאים שצוינו ב- |
lower_bound |
חייב להיות ערך בטווח [ -inf, inf); לא יכול להיות NaN. |
upper_bound |
חייב להיות ערך ב-(-inf, inf]; לא יכול להיות NaN. |
name |
ייתכן שלהודעות ההורה יהיו דרישות ייחודיות בשדה הזה. למשל, ניתן לראות את |
indicator_id |
מזהה שתואם למשתנה בינארי, או לא מוגדר. אם המדיניות לא מוגדרת, המערכת תתעלם מהאילוץ של האינדיקטור. אם היא מוגדרת, אנחנו דורשים: * VariablesProto.integers[indicator_id] = true, * VariablesProto.lower_bounds[indicator_id] >= 0, * VariablesProto.upper_bounds[indicator_id] <= 1. התנאים האלה לא אומתו על ידי MathOpt, אבל אם לא מתקיימים התנאים האלה, הפותר יחזיר שגיאה לאחר הפתרון. |
LPAlgorithmProto
בחירת אלגוריתם לפתרון תוכניות ליניאריות.
טיפוסים בני מנייה (enums) | |
---|---|
LP_ALGORITHM_UNSPECIFIED |
|
LP_ALGORITHM_PRIMAL_SIMPLEX |
השיטה (ראשית) חד-כיוונית. בדרך כלל יכולות לספק פתרונות ראשוניים וכפולים, קרניים ראשוניות/כפולות על בעיות ראשוניות/כפולות, ובסיס. |
LP_ALGORITHM_DUAL_SIMPLEX |
השיטה הכפולה חד-כיוונית. בדרך כלל יכולות לספק פתרונות ראשוניים וכפולים, קרניים ראשוניות/כפולות על בעיות ראשוניות/כפולות, ובסיס. |
LP_ALGORITHM_BARRIER |
שיטת המחסום, שנקראת גם שיטת נקודה פנימית (IPM). לרוב יכול לתת גם פתרונות ראשוניים וגם פתרונות כפולים. הטמעות מסוימות יכולות גם להפיק קרניים בבעיות לא תקינות או בלתי מעשיות. לא ניתן בסיס, אלא אם הפותר הבסיסי מבצע "מעבר קרוסאובר" ומסתיים בביטוי חד-כיווני. |
LP_ALGORITHM_FIRST_ORDER |
אלגוריתם שמבוסס על שיטה מסדר ראשון. בדרך כלל הם יפיקו פתרונות ראשוניים וכפולים, ואולי גם אישורים של יכולת ראשונית ו/או כפולה. שיטות מסדר ראשון בדרך כלל יספקו פתרונות ברמת דיוק נמוכה יותר, ולכן על המשתמשים להגדיר פרמטרים של איכות פתרון (למשל, סבילות) ולאמת את הפתרונות. |
LimitProto
כאשר פונקציית Solve() מפסיקה מוקדם עם FinishReasonProto FEASIBLE או NO_SOLUTION_FOUND, המגבלה הספציפית שהתקבלה.
טיפוסים בני מנייה (enums) | |
---|---|
LIMIT_UNSPECIFIED |
משמש כערך אפסי במקרים שבהם אנחנו מסיימים את השימוש ללא הגבלה (למשל, QUERYINATION_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_UNDEPERIODINED כאשר לא ניתן לקבוע את הסיבה, ובשימוש ב-LIMIT_OTHER אם הסיבה ידועה אבל אינה מתאימה לאף אחת מהחלופות שלמעלה. FinishProto.detail עשוי להכיל מידע נוסף על המגבלה. |
LinearConstraintsProto
כפי שנעשה בהמשך, אנחנו מגדירים "#לינארי אילוצים" = size(לינאריConstraintsProto.ids).
שדות | |
---|---|
ids[] |
חייב להיות מספר לא שלילי ולהיות במגמת עלייה. לא ניתן להשתמש בערך המקסימלי(int64). |
lower_bounds[] |
האורך צריך להיות שווה ל- #לינארי, הערכים בטווח [-inf, inf). |
upper_bounds[] |
האורך צריך להיות שווה ל- #לינארי אילוצים, והערכים ב-(-inf, inf]. |
names[] |
אם הפרמטר לא מוגדר, ההנחה היא שכל המחרוזות הריקות. אחרת, האורך שלו צריך להיות שווה ל- #לינארי אילוצים. כל השמות שאינם ריקים חייבים להיות ייחודיים. |
LinearExpressionProto
ייצוג מועט של ביטוי לינארי (סכום משוקלל של משתנים, עם קיזוז קבוע).
שדות | |
---|---|
ids[] |
המזהים של משתנים. יש למיין (בסדר עולה) כאשר כל הרכיבים ייחודיים. |
coefficients[] |
חייבים להיות באורך זהה למזהים. הערכים חייבים להיות סופיים, ולא יכולים להיות NaN. |
offset |
חייב להיות סופי ולא יכול להיות NaN. |
ModelProto
בעיית אופטימיזציה. MathOpt תומך ב: - משתני החלטה רציפים ומספרים שלמים עם גבולות סופיים אופציונליים. - יעדים לינאריים וריבועיים (יעדים יחידים או מרובים), ממוזערים או מוגדלים. - מספר סוגי אילוצים, כולל: * אילוצים לינאריים * אילוצים ריבועיים * אילוצים בקונוס מסדר שני * אילוצים לוגיים > אילוצים מסוג חירום1 ו-SOS2 > אילוצי אינדיקטור
כברירת מחדל, האילוצים מיוצגים במפות "id-to-data". עם זאת, אנחנו מייצגים מגבלות לינאריות בפורמט יעיל יותר של "struct-of-arrays".
שדות | |
---|---|
name |
|
variables |
|
objective |
המטרה העיקרית של המודל. |
auxiliary_objectives |
יעדי עזר לשימוש במודלים מרובי מטרות. מזהים של מפתחות מפה חייבים להיות באותיות [0, max(int64)). כל עדיפות, וכל שם שאינו ריק, חייבים להיות ייחודיים ונפרדים מה- |
linear_constraints |
|
linear_constraint_matrix |
מקדמי המשתנים של האילוצים הליניאריים. אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו הוא הוגדר כאפס. דרישות: * קווים לינאריים_constraint_matrix.row_id הם רכיבים של לינארי_constraints.id. * לינארי_constraint_matrix.column_id הם אלמנטים של משתנים. * ערכי המטריצה שלא צוינו הם אפס. * לינארי_constraint_matrix.values חייבים להיות סופיים. |
quadratic_constraints |
מגבלות ריבועיות במודל. |
second_order_cone_constraints |
אילוצים של חרוטים מסדר שני במודל. |
sos1_constraints |
אילוצים מסוג חירום1 במודל, שמגבילים את הערך של |
sos2_constraints |
אילוצים מסוג SMB2 במודל, שמגבילים את האפשרות של שתי רשומות לכל היותר של |
indicator_constraints |
אילוצים של אינדיקטורים במודל, שאוכפים אותם, אם "משתנה אינדיקטור" בינארי מוגדר ל-1, אז "אילוץ משתמע" חייב להתקיים. |
ModelSolveParametersProto
שדות | |
---|---|
variable_values_filter |
מסנן שמוחל על כל הקונטיינרים הדלילים שהוחזרו באמצעות משתנים ב-PrimalSolutionProto וב-PrimalRayProto (PrimalSolutionProto.variable_values, PrimalRayProto.variable_values). דרישות: * filter_ids הם רכיבים של VariablesProto.ids. |
dual_values_filter |
מסנן שמוחל על כל הקונטיינרים הדלילים שהוחזרו, שמקשים על בסיס אילוצים לינאריים ב-DualSolutionProto וב-DualRay (DualSolutionProto.dual_values, DualRay.dual_values). דרישות: * filter_id (מזהים) הם רכיבים של LCtraints.ids. |
reduced_costs_filter |
מסנן שמוחל על כל הקונטיינרים האיטיים שהוחזרו, שקודדו על ידי משתנים ב-DualSolutionProto וב-DualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs). דרישות: * filter_ids הם רכיבים של VariablesProto.ids. |
initial_basis |
בסיס ראשוני אופציונלי לפותרי בעיות LP חד-פעמיות במצב ביניים (warm start). אם היא מוגדרת, היא צפויה להיות תקפה לפי |
solution_hints[] |
רמזים אופציונליים לפתרונות. אם הפותר הבסיסי מקבל רק רמז אחד, המערכת תשתמש ברמז הראשון. |
branching_priorities |
אפשרויות עדיפות להסתעפות. משתנים עם ערכים גבוהים יותר יסתעפו קודם. משתנים שלא הוגדרו עבורם עדיפויות מקבלים את עדיפות ברירת המחדל של הפותר (בדרך כלל אפס). דרישות: * branching_priorities.values חייבים להיות סופיים. * branching_priorities.id חייב להיות רכיבים של VariablesProto.ids. |
ObjectiveBoundsProto
גבול של ערך המטרה האופטימלי.
שדות | |
---|---|
primal_bound |
הפותר טוען שהערך האופטימלי שווה או טוב יותר (קטן יותר למזעור וגדול יותר לאופטימיזציה) מאשר primal_bound בסבילות של היתכנות ראשוני של המפותרים (ראו אזהרה בהמשך): * primal_bound הוא טריוויאלי (+inf for minimization ו-inf maximization) כאשר הפותר לא טוען שיש לו גבול כזה. * primal_bound יכול להיות קרוב יותר לערך האופטימלי מהמטרה של הפתרון הראשוני הטוב ביותר האפשרי. באופן ספציפי, primal_bound עשוי להיות לא טריוויאלי גם אם לא מוחזרים פתרונות ראשוניים אפשריים. אזהרה: הטענה המדויקת היא שקיים פתרון ראשוני: * הוא בר-ביצוע ממוספר (כלומר, עד לסבילות המפותרים), ו-* יש לו ערך אובייקטיבי primal_bound. הפתרון המספרי הזה יכול להיות לא בר-ביצוע, ובמקרה כזה primal_bound יכול להיות טוב יותר מהערך האופטימלי. תרגום של סבילות היתכנות ראשוניות לסבילות ב-primal_bound הוא לא טריוויאלי, במיוחד כאשר סבילות ההיתכנות גדולה יחסית (למשל, בעת פתרון באמצעות PDLP). |
dual_bound |
הפותר טוען שהערך האופטימלי שווה או גרוע יותר (גדול למזעור וקטן יותר לאופטימיזציה) מאשר סבילות של Dual_bound למעלה למתלים של היתכנות כפולה (ראו אזהרה בהמשך): * dual_bound הוא טריוויאלי (-inf for minimization ו-+inf maximization) כשהפותר לא טוען שיש לו גבול כזה. בדומה ל-primal_bound, המצב הזה עשוי לקרות עבור חלק מהפותרים גם כשחוזרים למצב מיטבי. פתרונות MIP בדרך כלל מדווחים על גבול, גם אם הוא לא מדויק. * במקרה של בעיות רציפות, Dual_bound יכול להיות קרוב יותר לערך האופטימלי מאשר המטרה של הפתרון הכפול הטוב ביותר האפשרי. עבור MIP, אחד מהערכים הלא-טריוויאליים הראשונים של dual_bound הוא בדרך כלל הערך האופטימלי של הרגיעה LP של ה-MIP. * Dual_bound צריך להיות טוב יותר (קטן יותר למינימום וגדול יותר לאופטימיזציה) מאשר primal_bound עד לסבילות של הפותרים (ראו אזהרה בהמשך). אזהרה: * במקרה של בעיות מתמשכות, הטענה המדויקת היא שקיים פתרון כפול אשר: * הוא בר-ביצוע ממוספר (כלומר, עד לסבילות של המפתרות), ו-* יש ערך אובייקטיבי מסוג dual_bound. הפתרון המספרי הזה יכול להיות לא בר-ביצוע, ובמקרה כזה dual_bound יכול להיות גרוע לחלוטין מהערך האופטימלי ו-primal_bound. בדומה למקרה הפרימלי, תרגום של סבילות של היתכנות כפולה לסובלות ב-Double_bound הוא לא טריוויאלי, במיוחד כאשר סבילות ההיתכנות גדולה יחסית. עם זאת, חלק מהפותרים מספקים גרסה מתוקנת של Dual_bound שיכולה להיות בטוחה יותר מבחינה מספרית. ניתן לגשת לגרסה המתוקנת הזו דרך הפלט הספציפי של הפותר (למשל, עבור PDLP, pdlp_output.convergence_information. corrected_dual_objective). * עבור פתרוןי MIP, ייתכן ש-Dual_bound יהיה משויך לפתרון כפול לצורך רגיעה מתמשכת מסוימת (למשל, רגיעה בעזרת LP), אבל לרוב מדובר בתוצאה מורכבת של ביצוע הפותרים, ולרוב היא לא מדויקת יותר מהגבולות שמדווחים על ידי פותחי LP. |
ObjectiveProto
שדות | |
---|---|
maximize |
false הוא מזעור, TRUE הוא מקסימום |
offset |
חייב להיות סופי ולא NaN. |
linear_coefficients |
מונחים אובייקטיביים שהם לינאריים במשתני ההחלטה. דרישות: * קווים לינאריים_מקודמים הם אלמנטים של VariablesProto.ids. * הערך של VariablesProto שלא צוין תואם לאפס. * לינארי_cofactors.values חייב להיות סופי. * לינארי_coPromotes.values יכול להיות אפס, אבל הדבר פשוט מבזבז מקום. |
quadratic_coefficients |
מונחים אובייקטיביים שהם ריבועיים במשתני ההחלטה. דרישות בנוסף לדרישות שבהודעות SparseDoubleMatrixProto: * כל רכיב של quadratic_coadmobs.row_ids וכל רכיב של quadratic_co לאימותs.column_ids חייב להיות רכיב של VariablesProto.ids. * המטריצה צריכה להיות משולשת עליונה: לכל i, quadratic_cos.row_ids[i] <= quadratic_cos.column_ids[i]. הערות: * למונחים שלא אוחסנו באופן מפורש יש מקדם אפס. * אלמנטים של quadratic_coPromotes.coPromotes יכולים להיות אפס, אבל הם פשוט מבזבזים מקום. |
name |
ייתכן שלהודעות ההורה יהיו דרישות ייחודיות בשדה הזה. למשל, אפשר לעיין ב-ModelProto.objectives וב-AuxiliaryObjectivesUpdatesProto.new_objectives. |
priority |
בבעיות עם מטרות עסקיות מרובות, העדיפות של המטרה הזו ביחס לאחרות (העדיפות הנמוכה יותר חשובה יותר). הערך הזה חייב להיות מספר שאינו שלילי. בנוסף, כל עדיפות אובייקטיבית במודל חייבת להיות ייחודית בזמן פתרון הבעיות. התנאי הזה לא מאומת ברמת האב, ולכן למודלים יכולים להיות באופן זמני יעדים עם אותה עדיפות. |
PrimalRayProto
כיוון של שיפור חסר תקדים בבעיית אופטימיזציה, ובדומה לכך, אישור של חוסר יכולת לבצע את הפעולה הכפולה של בעיית האופטימיזציה.
דוגמה: נבחן תוכנית לינארית פשוטה: min c * x s.t. A * x >= b x >= 0 קרנית ראשוניות הן x שעונה על הצרכים הבאים: c * x < 0 A * x >= 0 x >= 0 נראה כאילו הוא נותן פתרון אפשרי, כל ערך חיובי שהוא עדיין קיימא, וכל ערך חיובי שהוא עדיין קיימא. קרן ראשונית מוכיחה גם שבעיית האופטימיזציה הכפולה לא ניתנת לביצוע.
בהודעה PrimalRay שבהמשך, הפרמטר variable_values הוא x.
שדות | |
---|---|
variable_values |
דרישות: * variable_values.ids הם אלמנטים של VariablesProto.ids. * variable_values.values חייב להיות סופי. |
PrimalSolutionProto
פתרון לבעיית אופטימיזציה.
דוגמה לתוכנית לינארית פשוטה: min c * x s.t. A * x >= b x >= 0. פתרון ראשוני הוא הקצאת ערכים ל-x. היא אפשרית אם היא עומדת ב-A * x >= b ו-x >= 0 מלמעלה. בהודעה של PrimalSolutionProto שבהמשך, המשתנה_values הוא x ו-destination_value הוא c * x.
שדות | |
---|---|
variable_values |
דרישות: * variable_values.ids הם אלמנטים של VariablesProto.ids. * variable_values.values חייב להיות סופי. |
objective_value |
ערך אובייקטיבי כפי שחושב על ידי הפותר הבסיסי. אינו יכול להיות אינסופי או NaN. |
auxiliary_objective_values |
ערכי יעד עזר כפי שמחושבים על ידי הפותר הבסיסי. המפתחות חייבים להיות מזהים תקפים של מטרת עזר. הערכים לא יכולים להיות אינסופיים או NN. |
feasibility_status |
סטטוס ההיתכנות של הפתרון לפי הפותר הבסיסי. |
ProblemStatusProto
סטטוס ההיתכנות של הבעיה הראשונית והכפולה שלה (או הכפולה של רגיעה מתמשכת) בהתאם לטענה של הפותר. הפותר אינו נדרש להחזיר אישור להצהרה (למשל, הפותר יכול לטעון להיתכנות ראשוניות מבלי להחזיר מסיסות בר-ביצוע ראשוניות). הסטטוס המשולב הזה מספק תיאור מקיף של טענות הפותר לגבי ההיתכנות והאימון של הבעיה שנפתרה. למשל:
- סטטוס בר-ביצוע עבור בעיות ראשוניות וכפולות מציין כי הראשוני הוא בר-ביצוע ומוגבל, וסביר להניח שיש לו פתרון אופטימלי (מובטח לבעיות ללא אילוצים לא ליניאריים).
- אם סטטוס ראשוני לא בר-ביצוע והסטטוס שלו הוא 'לא בר-ביצוע', המשמעות היא שהבעיה הקדמונית היא בלתי מוגבלת (כלומר, יש לה פתרונות טובים שרירותיים).
שימו לב שסטטוס בלתי אפשרי לבדו (כלומר, מלווה בסטטוס ראשוני לא מוגדר) לא מרמז על כך שהבעיה הפרימלית היא בלתי מוגבלת, כי יכול להיות ששתי הבעיות לא יהיו ניתנות לביצוע. בנוסף, למרות שסטטוס ראשוני ובר-ביצוע כפול עשוי לרמוז על קיומו של פתרון אופטימלי, הוא לא מבטיח שהפותר אכן מצא פתרון אופטימלי כזה.
שדות | |
---|---|
primal_status |
הסטטוס של הבעיה הראשונית. |
dual_status |
הסטטוס של הבעיה הכפולה (או עבור הכפילות של רגיעה מתמשכת). |
primal_or_dual_infeasible |
אם הבעיה היא true, הפותר טוען שהבעיה הראשונית או הכפולה אינה ניתנת לביצוע, אבל הוא לא יודע איזו מהן (או אם שתיהן לא ניתנות לביצוע). הערך יכול להיות true רק כאשר primal_problem_status = dual_problem_status = kUndetermined. המידע הנוסף הזה נדרש לעיתים קרובות כשעיבוד מראש קובע שאין פתרון אופטימלי לבעיה (אבל לא יכול לקבוע אם הסיבה היא חוסר היתכנות, חוסר גבולות או שניהם). |
QuadraticConstraintProto
אילוץ ריבועי יחיד בצורה הזו: lb <= sum{לינארי_terms} + sum{quadratic_terms} <= ub.
אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו הוא הוגדר כאפס.
שדות | |
---|---|
linear_terms |
מונחים לינאריים במשתני ההחלטה. בנוסף לדרישות לגבי הודעות SparseDoubleVectorProto, אנחנו דורשים שהערכים הבאים יהיו: * ירים_terms.ids הם רכיבים של VariablesProto.ids. * לינארי_terms.values חייבים להיות סופיים ו-not-NaN. הערות: * למזהי המשתנים שהושמטו יש מקדם תואם של אפס. * ערכים ליניאריים לינאריים יכולים להיות אפס, אבל הדבר פשוט מבזבז מקום. |
quadratic_terms |
מונחים שהם ריבועיים במשתני ההחלטה. בנוסף לדרישות לגבי הודעות SparseDoubleMatrixProto, כל רכיב של quadratic_terms.row_id וכל רכיב של quadratic_terms.column_ids חייב להיות רכיב של VariablesProto.ids. * המטריצה צריכה להיות משולשת עליונה: לכל i, quadratic_terms.row_ids[i] <= quadratic_terms.column_ids[i]. הערות: * למונחים שלא אוחסנו באופן מפורש יש מקדם אפס. * אלמנטים של quadratic_terms.coPromotes יכולים להיות אפס, אבל זה פשוט בזבוז מקום. |
lower_bound |
הערך חייב להיות בטווח [-inf, inf) וקטן מ- |
upper_bound |
חייב להיות ערך בטווח (-inf, inf], וגדול מ- |
name |
ייתכן שלהודעות ההורה יהיו דרישות ייחודיות בשדה הזה. למשל, ניתן לעיין ב-ModelProto.quadratic_constraints ו-QadraticConstraintUpdatesProto.new_constraints. |
SecondOrderConeConstraintProto
אילוץ חרוט יחיד מסדר שני מהצורה:
||arguments_to_norm
||_2 <= upper_bound
,
upper_bound
וכל רכיב של arguments_to_norm
הם ביטויים ליניאריים.
אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו הוא הוגדר כאפס.
שדות | |
---|---|
upper_bound |
|
arguments_to_norm[] |
|
name |
ייתכן שלהודעות ההורה יהיו דרישות ייחודיות בשדה הזה. למשל, ניתן לראות את |
SolutionHintProto
פתרון מוצע להתחלה עבור הפותר.
בדרך כלל, פתרוןי MIP רוצים רק מידע ראשוני (variable_values
), ואילו פתרוןי LP רוצים גם מידע ראשוני וגם מידע כפול (dual_values
).
הרבה פתרונות MIP יכולים לעבוד עם: (1) פתרונות חלקיים שלא מציינים את כל המשתנים, או (2) פתרונות בלתי אפשריים. במקרים כאלה, הפותרים בדרך כלל פותרים את בעיית ה-MIP כדי להשלים/לתקן את הרמז.
האופן שבו הפותר משתמש ברמז, אם בכלל, תלוי במידה רבה בפותר, בסוג הבעיה ובאלגוריתם שבו נעשה שימוש. הדרך המהימנה ביותר להבטיח לרמז שלך יש השפעה היא לקרוא את היומנים של הפותרים הבסיסיים עם או בלי הרמז.
פתרוןי LP מבוססי סימפלקס מעדיפים בדרך כלל בסיס ראשוני לרמז לפתרון (הם צריכים להמיר את הרמז לפתרון בר-ביצוע בסיסי אחרת).
שדות | |
---|---|
variable_values |
הקצאה חלקית של ערכים למשתנים הפרימליים של הבעיה. הדרישות הבלתי-תלויות לפותר עבור הודעת המשנה הזו הן: * variable_values.ids הם רכיבים של VariablesProto.ids. * variable_values.values חייב להיות סופי. |
dual_values |
הקצאה (שעשויה להיות חלקית) של ערכים למגבלות הליניאריות של הבעיה. דרישות: * dual_values.ids הם אלמנטים של linConstraintsProto.ids. * Dual_values.values חייבים להיות סופיים. |
SolutionProto
מה נכלל בפתרון תלוי בסוג הבעיה ובפותר הבעיות. הדפוסים הנפוצים הנוכחיים הם 1. פתרוןי MIP מחזירים רק פתרון ראשוני. 2. בדרך כלל, פתרוןי ה-Simplex LP מחזירים בסיס ואת הפתרונות הראשוניים והכפולים שמשויכים לבסיס הזה. 3. פתרונות רציפים אחרים בדרך כלל מחזירים פתרונות ראשוניים וכפולים שמחוברים באופן תלוי בפותר.
דרישות: * יש להגדיר שדה אחד לפחות. פתרון לא יכול להיות ריק.
שדות | |
---|---|
primal_solution |
|
dual_solution |
|
basis |
SolutionStatusProto
היתכנות של פתרון ראשוני או כפול כפי שטען הפותר.
טיפוסים בני מנייה (enums) | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
ערך שומר שמייצג 'אין סטטוס'. |
SOLUTION_STATUS_UNDETERMINED |
הפותר לא טוען לסטטוס היתכנות. |
SOLUTION_STATUS_FEASIBLE |
הפותר טוען שהפתרון בר-ביצוע. |
SOLUTION_STATUS_INFEASIBLE |
הפותר טוען שהפתרון אינו ישים. |
SolveParametersProto
פרמטרים שמאפשרים לשלוט בפתרון יחיד.
מכילה את שני הפרמטרים המשותפים לכל הפותרים, למשל time_limit, ופרמטרים של פותר ספציפי, למשל gscip. אם הערך מוגדר גם בשדה נפוץ וגם בשדה הספציפי לפותר, המערכת משתמשת בהגדרה הספציפית לפותר.
הפרמטרים הנפוצים הם אופציונליים ולא מוגדרים, או 'טיפוסים בני מנייה (enum) עם ערך שלא צוין' מציינים שנעשה שימוש בברירת המחדל של הפותר.
המערכת מתעלמת מפרמטרים ספציפיים של פתרון לפותרים שאינם זה שנמצא בשימוש.
פרמטרים התלויים במודל (למשל, הוגדרה עדיפות הסתעפות לכל משתנה) מועברים ב-ModelSolveParametersProto.
שדות | |
---|---|
time_limit |
משך הזמן המקסימלי שצריך להקדיש לפתרון הבעיה (או זמן אינסופי אם היא לא מוגדרת). הערך הזה אינו מגבלה קשיחה. זמן הביצוע עשוי לחרוג מעט מהערך הזה. הפרמטר הזה תמיד מועבר אל הפותר הבסיסי. לא נעשה שימוש בברירת המחדל של הפותר. |
enable_output |
מאפשרת להדפיס את עקבות ההטמעה של הפותר. המיקום של העקבות האלה תלוי בפותר. עבור SCIP ו-Gurobi, זו תהיה ברירת המחדל של זרמי הפלט. עבור Glop ו-CP-SAT, הפעולה הזו תבוצע LOG(INFO). חשוב לשים לב שאם הפותר תומך בקריאה חוזרת (callback) של הודעות והמשתמש מבצע קריאה חוזרת (callback) עבורו, המערכת תתעלם מערך הפרמטר הזה ולא יודפסו עקבות. |
lp_algorithm |
האלגוריתם לפתרון תוכנית לינארית. אם LP_ALGORITHM_UNSPECIFIED, יש להשתמש באלגוריתם ברירת המחדל של הפותר. במקרה של בעיות שאינן תוכניות ליניאריות אבל כאשר תכנות ליניארי הוא תת-שגרה, הפותרים יכולים להשתמש בערך הזה. למשל, פותרים של MIP בדרך כלל משתמשים בפונקציה הזו לפתרון ברמה הבסיסית (root) בלבד (ואחרת, משתמשים בפונקציה דו-כיוונית חד-צדדית). |
presolve |
כדאי לנסות לפשט את הבעיה לפני הפעלת האלגוריתם הראשי, או לנסות להגדיר את רמת המאמץ שהוגדרה כברירת מחדל לפותר אם {/8}_UNSPECIFIED. |
cuts |
מאמץ להשגת הרגיעה חזקה יותר של רמת ה-LP (MIP בלבד), או רמת המאמץ שמוגדרת כברירת המחדל של הפותר אם {/8}_UNSPECIFIED. הערה: השבתת החיתוכים עלולה למנוע אפשרות להוסיף חיתוכים ב-MIP_NODE. התנהגות זו היא ספציפית לפותר. |
heuristics |
מאמץ למצוא פתרונות אפשריים מעבר לאלו שהתקבלו בתהליך החיפוש המלא (MIP בלבד), או רמת המאמץ שהוגדרה כברירת מחדל של הפותר אם {/8}_UNSPECIFIED. |
scaling |
משקיעים מאמצים בשינוי קנה מידה של הבעיה כדי לשפר את היציבות המספרית, או את רמת המאמץ שמוגדרת כברירת המחדל של הפותר אם {/8}_UNSPECIFIED. |
iteration_limit |
הגבלה על מספר החזרות של האלגוריתם הבסיסי (למשל, צירים חד-כיווניים). ההתנהגות הספציפית תלויה בפותר ובאלגוריתם שבו נעשה שימוש, אבל לעיתים קרובות היא יכולה לקבוע מגבלה דטרמיניסטית על פתרון (ייתכן שיהיה צורך בהגדרות נוספות, למשל ב-thread אחד). בדרך כלל הפתרונות נתמכים ב-LP, QP ו-MIP, אבל בפותרי MIP רואים גם את הכיתוב node_limit. |
node_limit |
הגבלה של מספר בעיות המשנה שנפתרות בחיפוש ספירה (למשל ענף ותחום). פתרונות רבים יכולים להשתמש באפשרות הזו כדי להגביל את החישוב באופן מוחלט (ייתכן שיהיה צורך בהגדרות נוספות, למשל ב-thread אחד). בדרך כלל לפותרי MIP, כדאי לעיין גם בערך iteration_limit. |
cutoff_limit |
הפותר מפסיק מוקדם אם הוא יכול להוכיח שאין פתרונות ראשוניים שטובים לפחות כמו המועד האחרון. בעצירה מוקדמת, הפותר מחזיר את סיבת הסיום NO_SOLUTION_FOUND ועם המגבלה CUTOFF והוא אינו נדרש לספק מידע נוסף על הפתרון. אין השפעה על הערך המוחזר אם אין עצירה מוקדמת. מומלץ להשתמש בסבילות אם רוצים שיוחזרו פתרונות עם יעד השווה בדיוק לחיתוך. כדאי לעיין במדריך למשתמש לקבלת פרטים נוספים והשוואה בין הפרמטר Best_bound_limit. |
objective_limit |
הפותר מפסיק מוקדם ברגע שהוא מוצא פתרון טוב כזה, עם סיבת הסיום FEASIBLE ומגביל את היעד. |
best_bound_limit |
הפותר מפסיק בשלב מוקדם ברגע שמוכיח שהגבול הטוב ביותר הוא לפחות הטוב הזה, עם סיבת הסיום FEASIBLE או NO_SOLUTION_FOUND ומגביל את ObjectIVE. כדאי לעיין במדריך למשתמש לפרטים נוספים ולהשוואה עם cutoff_limit. |
solution_limit |
הפותר מפסיק בשלב מוקדם אחרי שהוא מוצא את הפתרונות האפשריים הרבים, וסיבת הסיום FEASIBLE ומגבילה את SOLUTION. הערך חייב להיות גדול מאפס אם הוא מוגדר. משתמשים בה בדרך כלל כדי לגרום לפותר להפסיק למצוא את הפתרון האפשרי הראשון. שימו לב: אין ערובה לערך המטרה של אף אחד מהפתרונות המוחזרים. בדרך כלל הפותרים לא יחזירו יותר פתרונות ממגבלת הפתרונות, אבל זה לא נאכף על ידי MathOpt. מידע נוסף זמין גם ב-b/214041169. כרגע יש תמיכה ב-Gurobi וב-SCIP, וב-CP-SAT בלבד עם ערך 1. |
threads |
אם הוא מוגדר, הוא צריך להיות >= 1. |
random_seed |
המקור למחולל המספרים המדומה האקראיים בפותר הבסיסי. שימו לב שכל הפותרים משתמשים במספרים פסאודו-אקראיים כדי לבחור פעולות כמו הפרעה באלגוריתם של LP, כללים ליצירת פיצולים ותיקון היוריסטיקה. שינוי הפרטים האלה עשוי להשפיע בצורה משמעותית על התנהגות הפותרים. לכל הפותרים יש תפיסה של זרעים, אבל חשוב לזכור שהערכים החוקיים תלויים בפותר בפועל. - Gurobi: [0:GRB_MAXINT] (החל מתאריך Gurobi 9.0 הוא 2x10^9). - GSCIP: [0:2147483647] (שהוא MAX_INT או kint32max או 2^31-1). - גלובלי: [0:2147483647] (כמו למעלה) בכל המקרים, הפותר יקבל ערך השווה ל: MAX(0, MIN(MAX_LEGAL_VALUE_FOR_SOLVER, אירוע אקראי)). |
absolute_gap_tolerance |
סובלנות אבסולוטית מוחלטת (בעיקר) לפותרי MIP. ה-GAP המוחלט הוא הערך המוחלט של ההבדל בין: * הערך האובייקטיבי של הפתרון האפשרי הטוב ביותר שנמצא, * הגבולות הכפולים שנוצרו על ידי החיפוש. הפותר יכול להפסיק לאחר שה-GAP המוחלט מגיע לכל היותר bolute_gap_tolerance (כאשר ערך מוגדר), ולהחזיר QUERYINATION_REASON_OPTIMAL. אם מגדירים ערך לפרמטר הזה, הערך חייב להיות >= 0. אפשר לעיין גם ביחס ליחסי גובה-רוחב של הפער. |
relative_gap_tolerance |
סובלנות יחסית אופטימלית (בעיקר) לפותרי MIP. ה-GAP היחסי הוא גרסה מנורמלת של ה-GAP המוחלט (מוגדר על ידי bolute_gap_tolerance). הנירמול תלוי בפותר, למשל ה-GAP המוחלט חלקי הערך האובייקטיבי של הפתרון המעשי הטוב ביותר שנמצא. הפותר יכול להפסיק לאחר ש-GAP היחסי מגיע לכל היותר ביחס לחוסר התאמה (יחסי) (כאשר הוא מוגדר), ולהחזיר QUERYINATION_REASON_OPTIMAL. אם מגדירים ערך לפרמטר הזה, הערך חייב להיות >= 0. כדאי לעיין גם בקטע 'bolute_gap_tolerance'. |
solution_pool_size |
עדכון של עד |
SolveResultProto
החוזה של מקרים שבהם פתרונות/קרניים ראשוניות/כפולות הוא מורכב, ראו סיום_reasons.md לתיאור מלא.
עד לסיום החוזה המדויק, מומלץ פשוט לבדוק אם יש פתרון או קרנית במקום להסתמך על סיבת הסיום.
שדות | |
---|---|
termination |
הסיבה שבגללה הפותר הפסיק לפעול. |
solutions[] |
החוזה הכללי לגבי סדר הפתרונות שפותרים עתידיים צריכים ליישם הוא הקצאה לפי: 1. הפתרונות עם פתרון ראשוני בר-ביצוע, לפי סדר היעדים הראשוניים הטובים ביותר. 2. הפתרונות עם פתרון כפול בר-ביצוע, המסודרים לפי המטרה הכפולה הטובה ביותר (יעד כפול לא ידוע הוא במקרה הגרוע ביותר) 3. אפשר להחזיר את כל הפתרונות שנותרו בכל סדר. |
primal_rays[] |
הוראות לשיפור ראשוני ללא הגבלה, או אישורים כפולים של אי היתכנות כפולה. בדרך כלל מסופק ל-EndReasonProtos UNBOUNDED ול-DUAL_INFEASIBLE |
dual_rays[] |
הוראות של שיפור כפול ללא גבולות, או אישורים מקבילים של בלתי היתכנות ראשוניות. בדרך כלל סופק ל-FinishReasonProto INFEASIBLE. |
solve_stats |
נתונים סטטיסטיים על תהליך פתרון, למשל זמן ריצה, איטרציות. |
SolveStatsProto
שדות | |
---|---|
solve_time |
הזמן שחלף של שעון קיר, כפי שנמדד על ידי Mat_opt, בערך הזמן ב-Solver::Solve(). הערה: הנתון לא כולל את העבודה שמתבצעת בבניית המודל. |
problem_status |
סטטוסי היתכנות לבעיות ראשוניות וכפולות. |
simplex_iterations |
|
barrier_iterations |
|
first_order_iterations |
|
node_count |
|
SolverTypeProto
הפותרים שנתמכים על ידי MathOpt.
טיפוסים בני מנייה (enums) | |
---|---|
SOLVER_TYPE_UNSPECIFIED |
|
SOLVER_TYPE_GSCIP |
פתרון בעיות שקשורות לתוכניות של מספרים שלמים (SCIP) (צד שלישי). תמיכה בבעיות מסוג LP, MIP ובעיות ריבועיות של מספרים שלמים לא-קמורות. עם זאת, לא מוחזרים נתונים כפולים עבור דפי נחיתה. העדפה ל-GLOP ל-LPs. |
SOLVER_TYPE_GUROBI |
פותר הבעיות של Gurobi (צד שלישי). תמיכה בבעיות מסוג LP, MIP ובעיות ריבועיות של מספרים שלמים לא-קמורות. בדרך כלל זו האפשרות המהירה ביותר, אבל יש לה רישוי מיוחד. |
SOLVER_TYPE_GLOP |
פותר Glop של Google. תומך ב-LP עם שיטות ראשוניות וכפולות חד-כיווניות. |
SOLVER_TYPE_CP_SAT |
פתרון CP-SAT של Google. תומכת בבעיות שבהן כל המשתנים הם מספרים שלמים ומוגבלים (או משתמעים שהם אחרי presolve). תמיכה ניסיונית במדידה מחדש ובהבחנה של בעיות עם משתנים רציפים. |
SOLVER_TYPE_PDLP |
פתרון PDLP של Google. תומכת בערכי LP ובמטרות ריבועיות קמורות באלכסון. משתמש בשיטות מסדר ראשון במקום בשיטות חד-כיווניות. יכול לפתור בעיות גדולות מאוד. |
SOLVER_TYPE_GLPK |
ערכת תכנות לינארית של GNU (GLPK) (צד שלישי). תמיכה ב-MIP וב-LP. בטיחות בשרשורים: GLPK משתמש באחסון מקומי בשרשור בשביל הקצאות זיכרון. כתוצאה מכך, צריך להשמיד מכונות של Solver באותו thread כפי שהן נוצרות, אחרת ה-GLPK יקרוס. נראה בסדר לקרוא ל-Solver::Solve() מ-thread אחר מזה ששימש ליצירת ה-Solver, אבל הוא לא מתועד על ידי GLPK ויש להימנע מכך. כשפותרים LP באמצעות המפענח, מוחזרים תמיסה (והקרניים הבלתי מאוגדות) רק אם נמצא פתרון אופטימלי. אחרת לא מוחזרים כלום. לפרטים נוספים, אפשר לעיין בדף glpk-5.0/doc/glpk.pdf #40 הזמין בכתובת glpk-5.0.tar.gz. |
SOLVER_TYPE_OSQP |
פותר הבעיות של התוכנית המפוצלת של המפעיל (OSQP) (צד שלישי). תמיכה בבעיות מתמשכות עם מגבלות ליניאריות ויעדים ריבועיים ליניאריים או קמורים. משתמשת בשיטת מסדר ראשון. |
SOLVER_TYPE_ECOS |
הפותר בעיות מוטמע (ECOS) (צד שלישי). תמיכה בבעיות מסוג LP ו-SOCP. משתמש בשיטות של נקודה פנימית (מחסום). |
SOLVER_TYPE_SCS |
Splitting Conic Solver (SCS) (צד שלישי). תמיכה בבעיות מסוג LP ו-SOCP. משתמשת בשיטת מסדר ראשון. |
SOLVER_TYPE_HIGHS |
HiGHS Solver (צד שלישי). תמיכה בבעיות מסוג LP ו-MIP (בדיקות QP קמורות לא מיושמות). |
SOLVER_TYPE_SANTORINI |
הטמעת MathOpt של פותר MIP. איטי/לא מומלץ לייצור. לא פותר LP (לא הוחזר מידע כפול). |
SosConstraintProto
נתונים לייצוג של אילוץ חירום יחיד או SD2.
אם משתנה שמעורב באילוץ הזה נמחק, המערכת מתייחסת אליו כאילו הוא הוגדר כאפס.
שדות | |
---|---|
expressions[] |
הביטויים שעליהם יש להחיל את מגבלת ה-SOS: * לכולם 1: לכל היותר רכיב אחד מקבל ערך שהוא לא אפס. * תמיכה ב-SOS2: לכל היותר שני רכיבים יכולים לקבל ערכים שונים מאפס, והם חייבים להיות סמוכים בסדר החוזר. |
weights[] |
ריק או באורך שווה לביטויים. אם השדה ריק, משקלי ברירת המחדל הם 1, 2, ... אם קיים, הערכים חייבים להיות ייחודיים. |
name |
ייתכן שלהודעות ההורה יהיו דרישות ייחודיות בשדה הזה. למשל, אפשר לעיין ב-ModelProto.sos1_constraints ו-SosConstraintUpdatesProto.new_constraints. |
SparseBasisStatusVector
ייצוג דל של וקטור של סטטוסים של בסיס.
שדות | |
---|---|
ids[] |
יש למיין (בסדר עולה) כאשר כל הרכיבים ייחודיים. |
values[] |
חייבים להיות באורך זהה למזהים. |
SparseDoubleMatrixProto
ייצוג מועט של מטריצה של זוגות.
המטריצה מאוחסנת כשלשות של מזהה שורה, מזהה עמודה ומקדם. שלושת הווקטורים האלה חייבים להיות באורך זהה. לכל ה-i, ה-tuple (row_ids[i], column_id[i]) צריך להיות נפרד. הרשומות חייבות להופיע בסדר ראשי.
שדות | |
---|---|
row_ids[] |
|
column_ids[] |
|
coefficients[] |
עשוי שלא להכיל NaN. |
SparseDoubleVectorProto
ייצוג מועט של וקטור של זוגות.
שדות | |
---|---|
ids[] |
יש למיין (בסדר עולה) כאשר כל הרכיבים ייחודיים. |
values[] |
חייבים להיות באורך זהה למזהים. עשוי שלא להכיל NaN. |
SparseInt32VectorProto
ייצוג חלקי של וקטור של int.
שדות | |
---|---|
ids[] |
צריך למיין (בסדר עולה) כך שכל הרכיבים יהיו ייחודיים. |
values[] |
חייבים להיות באורך זהה למזהים. |
SparseVectorFilterProto
הודעה זו מאפשרת להריץ שאילתה/להגדיר חלקים ספציפיים של SparseXxxxVector. התנהגות ברירת המחדל היא לא לסנן החוצה. אחת הדרכים הנפוצות היא להריץ שאילתות רק על חלקים של פתרונות (רק ערכים שאינם אפס ו/או רק קבוצה של ערכי משתנה שנבחרו ידנית).
שדות | |
---|---|
skip_zero_values |
עבור SparseBoolVectorProto הערך "אפס" הוא |
filter_by_ids |
אם הערך הוא True, המערכת תחזיר רק את הערכים שתואמים למזהים המפורטים ב-FILTER_id. |
filtered_ids[] |
רשימת המזהים לשימוש כאשר filter_by_ids הוא TRUE. הערך צריך להיות ריק אם filter_by_ids אינו FALSE. הערה: אם השדה ריק וה-filter_by_ids נכון, הכוונה היא שאינך רוצה לקבל שום מידע בתוצאה. |
TerminationProto
כל המידע לגבי הסיבה שבגללה הסתיימה קריאה ל-Solve() .
שדות | |
---|---|
reason |
מידע נוסף ב- |
limit |
הוא LIMIT_UNSPECIFIED אלא אם הסיבה היא QUERYINATION_REASON_FEASIBLE או QUERYINATION_REASON_NO_SOLUTION_FOUND. לא כל הפותרים יכולים תמיד לקבוע את המגבלה שגרמה לסגירת החשבון. אם לא ניתן לקבוע מהי הסיבה, המערכת משתמשת ב-LIMIT_UNDE הקשורותINED. |
detail |
בדרך כלל מידע ספציפי נוסף לפותר הבעיות לגבי סגירת החשבון. |
problem_status |
סטטוסי היתכנות לבעיות ראשוניות וכפולות. החל מ-18 ביולי 2023 ייתכן שההודעה הזו לא תופיע. אם הפרמטר לא נמצא, ניתן למצוא את הבעיה_status ב-SolveResultProto.solve_stats. |
objective_bounds |
גבול של ערך המטרה האופטימלי. החל מ-18 ביולי 2023 ייתכן שההודעה הזו לא תופיע. אם חסרים נתונים, object_bounds.primal_bound יימצא ב-SolveResultProto.solve.stats.best_primal_bound ו-Object_bounds.dual_bound יכולים למצוא את SolveResultProto.solve.stats.best_dual_bound |
TerminationReasonProto
הסיבה לסיום קריאה ל-Solve() .
טיפוסים בני מנייה (enums) | |
---|---|
TERMINATION_REASON_UNSPECIFIED |
|
TERMINATION_REASON_OPTIMAL |
נמצא פתרון אופטימלי לכאורה (עד סבילות מספרית). |
TERMINATION_REASON_INFEASIBLE |
לבעיה הראשונית אין פתרונות אפשריים. |
TERMINATION_REASON_UNBOUNDED |
הבעיה הפרימלית היא מעשית, ואפשר למצוא פתרונות טובים ושרירותיים לאורך קרן ראשונית. |
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED |
הבעיה הראשונית היא בלתי מעשית או בלתי מוגבלת. ייתכן שיהיו פרטים נוספים על סטטוס הבעיה ב-resolve_stats.problem_status. שים לב, ניתן למפות כאן את הסטטוס המלא של Gurobi. |
TERMINATION_REASON_IMPRECISE |
הבעיה טופלה בהתאם לאחד מהקריטריונים המפורטים למעלה ('אופטימלי', 'לא בר-ביצוע', 'לא מוגבל' או 'InfeasibleOrUnbounded), אבל אין עמידה בתנאים. קיימים מספר פתרונות/קרניים ראשוניות/כפולות, אבל ייתכן שהם יהיו מעט בלתי אפשריים. לחלופין, אם הבעיה הייתה כמעט אופטימלית, ייתכן שיהיו פערים בין המטרה הטובה ביותר של הפתרון הטוב ביותר לבין היעד המתאים ביותר. המשתמשים עדיין יכולים להריץ שאילתות על פתרונות/קרניים ראשוניים/כפולים ועל נתונים סטטיסטיים של פתרונות, אבל הם אחראים לטפל בחוסר הדיוק המספרי. |
TERMINATION_REASON_FEASIBLE |
האופטימיזציה הגיעה למגבלה מסוימת והוחזר פתרון ראשוני בר-ביצוע. לקבלת תיאור מפורט של סוג המגבלה שהגעת אליה, ראה SolveResultProto.limit_detail. |
TERMINATION_REASON_NO_SOLUTION_FOUND |
האופטימיזציה הגיעה למגבלה מסוימת ולא מצאה פתרון ראשוני בר ביצוע. לקבלת תיאור מפורט של סוג המגבלה שהגעת אליה, ראה SolveResultProto.limit_detail. |
TERMINATION_REASON_NUMERICAL_ERROR |
האלגוריתם הופסק עקב שגיאה מספרית שלא ניתן לשחזר. אין מידע זמין על הפתרון. |
TERMINATION_REASON_OTHER_ERROR |
האלגוריתם הופסק עקב שגיאה שלא נכללת באחד מהסטטוסים שהוגדרו למעלה. אין מידע זמין על הפתרון. |
VariablesProto
כפי שנעשה בהמשך, אנחנו מגדירים "#variables" = size(VariablesProto.ids).
שדות | |
---|---|
ids[] |
חייב להיות מספר לא שלילי ולהיות במגמת עלייה. לא ניתן להשתמש בערך המקסימלי(int64). |
lower_bounds[] |
האורך צריך להיות שווה ל- #variable, הערכים ב-[-inf, inf]. |
upper_bounds[] |
האורך צריך להיות שווה ל- #variables, הערכים ב-(-inf, inf]. |
integers[] |
האורך צריך להיות שווה ל- #variables. במשתנים רציפים, הערך יכול להיות FALSE במשתנים עם מספרים שלמים. |
names[] |
אם הפרמטר לא מוגדר, ההנחה היא שכל המחרוזות הריקות. אחרת, האורך צריך להיות שווה ל- #variables. כל השמות שאינם ריקים חייבים להיות ייחודיים. |