حل نموذج الإدخال وعرض النتيجة دفعة واحدة. استخدِم هذه الطريقة عندما لا تحتاج إلى استدعاءات أو تزايد، ولا تحتاج إلى تتبُّع مستوى تقدّم الحل.
طلب HTTP
POST https://optimization.googleapis.com/v1/mathopt:solveMathOptModel
يستخدِم عنوان URL بنية تحويل ترميز gRPC.
نص الطلب
يحتوي نص الطلب على بيانات بالبنية التالية:
تمثيل JSON |
---|
{ "solverType": enum ( |
الحقول | |
---|---|
solverType |
اختياريّ. استخدِم أداة الحلّ لحلّ المسألة رقميًا. لاحظ أنه إذا كانت أداة الحلّ لا توفّر ميزة معيّنة في النموذج، لن يكون إجراء التحسين ناجحًا. |
model |
مطلوب. تمثيل رياضي لمسألة التحسين المطلوب حلها. |
parameters |
اختياريّ. مَعلمات للتحكّم في حلّ فردي ويتم التعامل مع معلمة enableOutput على وجه التحديد. بالنسبة إلى أدوات حل المشاكل التي تتيح استدعاء الرسائل، سيؤدي ضبطها على "صحيح" إلى تسجيل الخادم لمعاودة الاتصال عبر الرسالة. سيتم عرض الرسائل الناتجة في SolveMathOptModelResponse.messages. بالنسبة إلى أدوات الحلّ الأخرى، سيؤدي ضبط تفعيل الإخراج على "صحيح" إلى حدوث خطأ. |
modelParameters |
اختياريّ. معلَمات للتحكّم في حلّ فردي خاص بنموذج الإدخال (يمكنك الاطّلاع على SolveparametersProto للاطّلاع على المعلَمات المستقلة في النموذج) |
نص الاستجابة
استجابة لحل أحادي عن بُعد في MathOpt.
إذا كانت الاستجابة ناجحة، سيحتوي نص الاستجابة على بيانات بالبنية التالية:
تمثيل JSON |
---|
{
"result": {
object ( |
الحقول | |
---|---|
result |
وصف ناتج حل النموذج في الطلب. |
messages[] |
في حال استخدام SolveparamsProto.enable_output، سيحتوي ذلك على رسائل السجل لأدوات الحل التي تدعم استدعاءات الرسائل. |
SolverTypeProto
أدوات الحلّ المتوافقة مع MathOpt
عمليات التعداد | |
---|---|
SOLVER_TYPE_UNSPECIFIED |
|
SOLVER_TYPE_GSCIP |
حلّ أداة حلّ البرامج الصحيحة المقيّدة (SCIP) (جهة خارجية) يدعم المسائل التربيعية للأعداد الصحيحة غير المحروقة LP وMIP. ومع ذلك، لا يتم عرض بيانات مزدوجة لملفات LPs. تفضيل GLOP لـ LPs. |
SOLVER_TYPE_GUROBI |
أداة حلّ Gurobi (جهة خارجية) يدعم المسائل التربيعية للأعداد الصحيحة غير المحروقة LP وMIP. وبوجه عام، هذا هو الخيار الأسرع، ولكنه يتضمّن ترخيصًا خاصًا. |
SOLVER_TYPE_GLOP |
أداة حلّ Glop من Google. يدعم LP بالطرق الأساسية والثنائية البسيطة. |
SOLVER_TYPE_CP_SAT |
أداة حلّ CP-SAT من Google يدعم المسائل التي تكون فيها جميع المتغيرات عددًا صحيحًا وحدودًا (أو يتم تضمينها بعد حل). دعم تجريبي لإعادة تقييم المشكلات وتصنيفها باستخدام المتغيرات المستمرة. |
SOLVER_TYPE_PDLP |
أداة حل PDLP من Google. يدعم الأهداف التربيعية الدائرية المحدبة والأهداف التربيعية المحدبة. تستخدم طرق الطلب الأول بدلاً من البسيط. يمكنها حل مشكلات كبيرة جدًا. |
SOLVER_TYPE_GLPK |
مجموعة أدوات البرمجة الخطية GNU (GLPK) (جهة خارجية). يدعم MIP و LP. Thread-safety: يستخدم برنامج GLPK مساحة تخزين على مستوى سلسلة التعليمات من أجل عمليات تخصيص الذاكرة. نتيجةً لذلك، يجب إتلاف مثيلات أداة الحلّ في سلسلة المحادثات نفسها التي تم إنشاؤها وإلا ستتعطّل GLPK. يبدو أنّه من المقبول استدعاء Solver::Solve() من سلسلة محادثات أخرى غير التي تم استخدامها لإنشاء أداة Solver ولكن لم يتم توثيقها بواسطة GLPK ويجب تجنبها. عند حل المحلول الفينولي باستخدام المُحلِّل، لا يتم إرجاع المحلول (والشعاع غير المرتبط) إلا إذا تم العثور على الحلّ الأمثل. وإلا، لن يتم إرجاع أي شيء. راجع 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 |
"أداة حلّ المخروطات المخروطية" (SCS) (شركة خارجية). دعم مسائل LP وSOCP. تستخدم طريقة الترتيب الأول. |
SOLVER_TYPE_HIGHS |
The HiGHS Solver (طرف ثالث) دعم مشاكل LP وMIP (وحدات QP المحدبة غير قابلة للتنفيذ). |
SOLVER_TYPE_SANTORINI |
التنفيذ المرجعي لـ MathOpt لأداة حلّ MIP. بطيء/غير مستحسن للإنتاج لا تعمل أداة حل LP (لا يتم عرض معلومات مزدوجة). |
ModelProto
مشكلة في التحسين. يدعم MathOpt: - متغيّرات القرار المستمرّة والأعداد الصحيحة مع حدود محدودة اختيارية. - الأهداف الخطية والتربيعية (أهداف فردية أو متعددة)، سواء تم تصغيرها أو تعظيمها. - عدد من أنواع القيود، بما في ذلك: * القيود الخطية * القيود التربيعية * القيود المخروطية من الدرجة الثانية * القيود المنطقية > قيود SOS1 وSOS2 > قيود المؤشر
بشكل افتراضي، يتم تمثيل القيود في "id-to-data" خرائط Google. ومع ذلك، نمثل القيود الخطية في "هيكل صفيف" أكثر كفاءة .
تمثيل JSON |
---|
{ "name": string, "variables": { object ( |
الحقول | |
---|---|
name |
|
variables |
|
objective |
الهدف الأساسي في النموذج. |
auxiliaryObjectives |
الأهداف الإضافية للاستخدام في النماذج المتعددة الأهداف. يجب أن تكون أرقام تعريف مفاتيح الخريطة في [0, max(int64)). يجب أن تكون كل أولوية وكل اسم غير فارغ فريدًا ومختلفًا أيضًا عن قيمة عنصر يحتوي على قائمة بأزواج |
linearConstraints |
|
linearConstraintMatrix |
يشير ذلك المصطلح إلى المعامِلات المتغيّرة للقيود الخطية. إذا تم حذف متغير متضمن في هذا القيد، فإنه يتم التعامل معه كما لو تم تعيينه على صفر. المتطلبات: * LineConstraintMatrix.row_ids هي عناصر من lineConstraints.ids. * lineConstraintMatrix.column_ids هي عناصر من فرص المتغيّرات.ids. * إدخالات المصفوفة غير المحددة تساوي صفرًا. * يجب أن تكون جميع القيم ذات الصلة lineConstraintMatrix.value محدودة. |
quadraticConstraints |
القيود التربيعية في النموذج. عنصر يحتوي على قائمة بأزواج |
secondOrderConeConstraints |
القيود المخروطية من الدرجة الثانية في النموذج. عنصر يحتوي على قائمة بأزواج |
sos1Constraints |
هي قيود SOS1 في النموذج، ما يحدّ من إمكانية أن تكون قيمة عنصر يحتوي على قائمة بأزواج |
sos2Constraints |
قيود SOS2 في النموذج، والتي تفرض قيودًا على أنّ إدخالَين كحد أقصى من عنصر يحتوي على قائمة بأزواج |
indicatorConstraints |
قيود المؤشر في النموذج، والتي تفرض ذلك، إذا كان هناك "متغير مؤشر" ثنائي على واحد، فإن "القيد الضمني" لازمة. عنصر يحتوي على قائمة بأزواج |
VariablesProto
كما هو موضح أدناه، نعرّف "#variables" = size(VariablesProto.ids).
تمثيل JSON |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "integers": [ boolean ], "names": [ string ] } |
الحقول | |
---|---|
ids[] |
يجب ألا تكون القيمة سالبة وأن ترتفع بشكل صارم. لا يمكن استخدام قيمة max(int64). |
lowerBounds[] |
يجب أن يكون الطول يساوي #variables، والقيم في [-inf, inf). |
upperBounds[] |
يجب أن يكون الطول يساوي #variables، والقيم في (-inf، inf]. |
integers[] |
يجب أن يكون الطول يساوي #variables. تكون القيمة خاطئة للمتغيرات المستمرة وصحيحة لمتغيرات الأعداد الصحيحة. |
names[] |
وإذا لم يتم ضبطها، يُفترض أن تكون جميع السلاسل الفارغة. بخلاف ذلك، يجب أن يكون الطول يساوي #variables. يجب أن تكون جميع الأسماء غير الفارغة مميزة. |
ObjectiveProto
تمثيل JSON |
---|
{ "maximize": boolean, "offset": number, "linearCoefficients": { object ( |
الحقول | |
---|---|
maximize |
false هو تصغير، صواب هو مضاعفة |
offset |
يجب أن تكون محدودة وليست NaN. |
linearCoefficients |
مصطلحات ObjectiveProto الخطية في متغيرات القرار. المتطلبات: * inlineCoefficients.ids هي عناصر من VariablesProto.ids. * VariablesProto غير محدد تتجاوب مع الصفر. * يجب أن تكون جميع قيم المعاملات الخطية محدودة. * يمكن أن تكون قيم المعاملات الخطية صفرًا، ولكن هذا يؤدي فقط إلى إهدار المساحة. |
quadraticCoefficients |
يشير ذلك المصطلح إلى المصطلحات الموضوعية التي تكون تربيعية في متغيّرات القرار. المتطلبات بالإضافة إلى المتطلبات الواردة في رسائل Spirse DoubleMatrixProto: * يجب أن يكون كل عنصر من عناصر quadraticCoefficients.row_ids وكل عنصر من عناصر quadraticCoefficients.column_ids عنصرًا من عناصر VariablesProto.ids. * يجب أن تكون المصفوفة مثلثًا علويًا لكل i، quadraticCoefficients.row_ids[i] <= quadraticCoefficients.column_ids[i]. ملاحظات: * العبارات غير المخزنة بشكل صريح لها معامل صفر. * يمكن أن تكون عناصر quadraticCoefficients.coمعامِلات صفرًا، ولكن هذا يؤدي فقط إلى إهدار المساحة. |
name |
قد تكون للرسائل الرئيسية متطلبات فريدة في هذا الحقل. على سبيل المثال، راجع modelProto.objectives وAuxiliaryObjectivesUpdatesProto.new_objectives. |
priority |
بالنسبة للمشكلات متعددة الأهداف، تكون أولوية هذا الهدف بالنسبة إلى الأهداف الأخرى (الأدنى أكثر أهمية). يجب أن تكون هذه القيمة غير سالبة. علاوةً على ذلك، يجب أن تكون كل أولوية موضوعية في النموذج مميزة في وقت الحل. لم يتم التحقق من صحة هذا الشرط على مستوى النموذج الأولي، لذلك قد يكون للنماذج أهدافًا لها نفس الأولوية مؤقتًا. |
SparseDoubleVectorProto
تمثيل متفرق لمتجه مزدوج.
تمثيل JSON |
---|
{ "ids": [ string ], "values": [ number ] } |
الحقول | |
---|---|
ids[] |
يجب ترتيبها (بترتيب متزايد) مع تمييز جميع العناصر. |
values[] |
يجب أن يكون طولها مساويًا للأرقام التعريفية. قد لا يحتوي على NaN. |
SparseDoubleMatrixProto
تمثّل هذه السمة تمثيلاً متفرقًا لمصفوفة من المضاعفات.
يتم تخزين المصفوفة كثلاث مرات لمعرف الصف ومعرف العمود والمعامل. يجب أن تكون هذه المتجهات الثلاثة متساوية في الطول. بالنسبة إلى كل i، يجب أن يكون الصف (rowIds[i], columnId[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[] |
يجب ألا تكون القيمة سالبة وأن ترتفع بشكل صارم. لا يمكن استخدام قيمة max(int64). |
lowerBounds[] |
يجب أن يكون الطول مساويًا للقيود الخطية #، والقيم في [ -inf، inf). |
upperBounds[] |
يجب أن يكون الطول مساويًا للقيود الخطية #، والقيم في (-inf، inf]. |
names[] |
وإذا لم يتم ضبطها، يُفترض أن تكون جميع السلاسل الفارغة. بخلاف ذلك، يجب أن يكون طولها مساويًا للقيود الخطية #. يجب أن تكون جميع الأسماء غير الفارغة مميزة. |
QuadraticConstraintProto
قيد تربيعي واحد بالصيغة: lb <= sum{ التحقّق من البنود} + الجمع {quadratic terms} <= ub
إذا تم حذف متغير متضمن في هذا القيد، فإنه يتم التعامل معه كما لو تم تعيينه على صفر.
تمثيل JSON |
---|
{ "linearTerms": { object ( |
الحقول | |
---|---|
linearTerms |
المصطلحات الخطية في متغيرات القرار. بالإضافة إلى المتطلبات المتعلقة برسائل Spirse DoubleVectorProto، نحتاج إلى ما يلي: * characterTerm.ids عبارة عن عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم منهجية محدودة (منهجية) محدودة وليست بتنسيق NaN. ملاحظات: * إنّ معرّفات المتغيّرات التي تم حذفها لها معامل مقابل صفر. * يمكن أن تكون القيم الخطية بعضها صفرية، إلا أنّ هذه القيمة تهدر المساحة. |
quadraticTerms |
يشير ذلك المصطلح إلى المصطلحات التربيعية في متغيّرات القرار. بالإضافة إلى المتطلبات المتعلّقة برسائل Spirse DoubleMatrixProto، يجب توفير ما يلي: * يجب أن يكون كل عنصر من عناصر quadraticTerm.row_ids وكل عنصر من عناصر quadraticTerm.column_ids عنصرًا من عناصر VariablesProto.ids. * يجب أن تكون المصفوفة مثلثية الشكل العليا: لكل i، quadraticTerm.row_ids[i] <= quadratic terms.column_ids[i]. ملاحظات: * العبارات غير المخزنة بشكل صريح لها معامل صفر. * يمكن أن تكون عناصر quadraticTerm.costructs صفرًا، ولكن هذا يؤدي فقط إلى إهدار المساحة. |
lowerBound |
يجب أن تكون قيمتها [-inf, inf)، وأن تكون أقل من أو تساوي |
upperBound |
يجب أن تكون القيمة في (-inf, inf]، وأن تكون أكبر من أو تساوي |
name |
قد تكون للرسائل الرئيسية متطلبات فريدة في هذا الحقل. على سبيل المثال، راجع modelProto.quadratic_Restrictts وQuadraticConstraintUpdatesProto.new_Restrictts. |
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
بيانات تمثيل قيد SOS1 أو SOS2 واحد.
إذا تم حذف متغير متضمن في هذا القيد، فإنه يتم التعامل معه كما لو تم تعيينه على صفر.
تمثيل JSON |
---|
{
"expressions": [
{
object ( |
الحقول | |
---|---|
expressions[] |
التعبيرات التي يتم تطبيق قيد SOS عليها: * SOS1: يأخذ عنصر واحد في الغالب قيمة غير صفرية. * SOS2: يأخذ عنصران في الغالب قيمًا غير صفرية ويجب أنهما متجاوران بالترتيب المتكرّر. |
weights[] |
إما أن تكون فارغة أو ذات طول مساوٍ للتعبيرات. إذا كانت فارغة، فإن قيم الترجيح الافتراضية هي 1، 2، ... في حالة وجودها، يجب أن تكون الإدخالات فريدة. |
name |
قد تكون للرسائل الرئيسية متطلبات فريدة في هذا الحقل. على سبيل المثال، راجع modelProto.sos1_Restrictts وSosConstraintUpdatesProto.new_Restrictts. |
IndicatorConstraintProto
بيانات تمثيل قيد مؤشر واحد من النموذج: Variable(indicatorId) = (activateOnZero ? 0 : 1) ◄ الحدّ الأدنى <= التعبير <= الطابع الأعلى
إذا تم حذف متغيّر مرتبط بهذا القيد (سواء كان المؤشر أو يظهر في expression
)، يتم التعامل معه كما لو تم ضبطه على صفر. وعلى وجه التحديد، يعني حذف متغيّر المؤشر أنّ قيد المؤشر يكون فارغًا إذا كانت القيمة activateOnZero
خاطئة، وأنّه معادِل لقيد خطي في حال ضبط السمة activateOnZero
على القيمة "صحيح".
تمثيل JSON |
---|
{
"activateOnZero": boolean,
"expression": {
object ( |
الحقول | |
---|---|
activateOnZero |
إذا كانت القيمة هي "صحيح"، يجب أن يكون القيد الضمني مُطبَّقًا إذا أخذ متغيّر المؤشر القيمة 0. بخلاف ذلك، إذا أخذ متغيّر المؤشر القيمة 1، يجب أن يحتفظ القيد الضمني بالقيمة 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. إذا تم ضبط قيمة في كل من الحقل المشترك والحقل الخاص بالأداة، سيتم استخدام الإعداد الخاص بأداة الحلّ.
يشير استخدام المعلَمات الشائعة الاختيارية والتي لم يتم ضبطها أو تعداد يتضمّن قيمة غير محدَّدة إلى أنّه يتم استخدام الأداة التلقائية للحلّ.
ويتم تجاهل مَعلمات خاصة بأدوات الحلّ غير تلك المستخدَمة.
يتم تمرير المَعلمات التي تعتمد على النموذج (على سبيل المثال، تحديد أولوية التشعّب لكل متغيّر) في modelSolveparametersProto.
تمثيل JSON |
---|
{ "timeLimit": string, "enableOutput": boolean, "lpAlgorithm": enum ( |
الحقول | |
---|---|
timeLimit |
الحد الأقصى للوقت الذي يجب أن تقضيه أداة الحلّ في المسألة (أو لا محدَّد إذا لم يتم تحديده). هذه القيمة ليست حدًا صارمًا، وقد يتجاوز وقت الحل هذه القيمة قليلاً. يتم دائمًا تمرير هذه المَعلمة إلى أداة الحلّ الأساسية، ولا يتم استخدام أداة الحلّ التلقائية. مدة بالثواني مكونة من تسعة أرقام كسور كحد أقصى وتنتهي بالأرقام " |
enableOutput |
تُفعِّل هذه السياسة طباعة آثار تتبُّع تنفيذ أداة الحل. ويعتمد موقع عمليات التتبّع هذه على أداة الحل. بالنسبة إلى SCIP وGurobi، ستكون هذه هي مصادر الإخراج العادية. بالنسبة إلى Glop وCP-SAT، سيتم تسجيل الدخول(INFO). تجدر الإشارة إلى أنّه إذا كانت أداة الحلّ تتوافق مع معاودة استدعاء الرسائل وسجَّل المستخدم استدعاء لها، سيتم تجاهل قيمة المَعلمة هذه ولن تتم طباعة أي عمليات تتبُّع. |
lpAlgorithm |
خوارزمية حل برنامج خطي. إذا كان LP_ALGORITHM_UNSPECIFIED، يجب استخدام الخوارزمية التلقائية للحل. بالنسبة إلى المسائل التي ليست برامج خطية ولكن تكون فيها البرمجة الخطية روتينًا فرعيًا، يمكن أن تستخدم أدوات الحلّ هذه القيمة. مثلاً: وعادة ما تستخدم أدوات حل MIP هذا الحل مع حل LP الجذري فقط (وتستخدم التنسيق المزدوج البسيط بخلاف ذلك). |
presolve |
جهد تبسيط المشكلة قبل بدء الخوارزمية الرئيسية، أو مستوى الجهد التلقائي لأداة حلّ الحلّ في حال الخطأ FEATURE_UNSPECIFIED. |
cuts |
الجهود المبذولة لتخفيف قيود LP فقط (MIP فقط)، أو مستوى الجهد التلقائي لأداة الحلّ في حال MINUTES_UNSPECIFIED. ملاحظة: قد يؤدي إيقاف الاقتطاعات إلى منع معاودة الاتصال من إتاحة فرصة إضافة عمليات الاقتصاص في MIP_NODE، لأنّ هذا السلوك خاص بأداة الحلّ. |
heuristics |
الجهود المبذولة لإيجاد حلول مجدية غير تلك التي تمت مصادفتها في إجراء البحث الكامل (MIP فقط)، أو مستوى الجهد التلقائي للحل في حال MINUTES_UNSPECIFIED. |
scaling |
جهد إعادة تغيير حجم المشكلة لتحسين الثبات العددي، أو مستوى الجهد التلقائي لأداة الحلّ في حال MINUTES_UNSPECIFIED. |
iterationLimit |
الحد المفروض على التكرارات للخوارزمية الأساسية (على سبيل المثال، المحورات البسيطة). ويعتمد السلوك المحدّد على أداة الحلّ والخوارزمية المستخدَمة، ولكن غالبًا ما يمكن أن توفّر حدًا حاسمًا للحل (قد تكون هناك حاجة إلى مزيد من الضبط، مثل سلسلة محادثات واحدة). عادةً ما تكون متوافقة مع أدوات حل LP وQP وMIP، ولكن بالنسبة إلى أدوات حل MIP، يمكنك الاطّلاع أيضًا على نقطة "قيد الإيقاف". |
nodeLimit |
الحد المفروض على عدد المسائل الفرعية التي يتم حلها في البحث العددي (مثل الفرع والحد.) بالنسبة إلى العديد من أدوات الحلّ، يمكن استخدام ذلك للحدّ من العمليات الحسابية حتمًا (قد يلزم إعداد المزيد من الخيارات، مثل سلسلة محادثات واحدة). بالنسبة إلى أدوات حل MIP، يمكنك الاطّلاع أيضًا على "حد التكرار". |
cutoffLimit |
تتوقف أداة الحلّ مبكرًا إذا تمكّنت من إثبات عدم وجود حلول أولية بدرجة مناسبة على الأقل تمامًا مثل القطْع. عند إيقاف العملية مبكرًا، ترسل أداة الحلّ سبب الإنهاء NO_SOLUTION_FOUND مع الحدّ الأقصى CUTOFF، وليس مطلوبًا تقديم أي معلومات إضافية عن الحلّ. ولن يؤثر في القيمة المعروضة إذا لم تكن هناك محطة توقّف مبكّرة. يوصى باستخدام مقدار تفاوت معيَّن إذا كنت ترغب في إرجاع حلول ذات هدف يساوي تمامًا الموعد النهائي. راجِع دليل المستخدم للحصول على مزيد من التفاصيل وللمقارنة مع bestBoundLimit. |
objectiveLimit |
تتوقف أداة الحلّ مبكرًا عند العثور على حل جيد على الأقل، ويكون سبب الإنهاء "مجد" ويحدّ من الهدف. |
bestBoundLimit |
تتوقف أداة الحلّ مبكرًا بمجرد أن تثبت أنّ أفضل حد هو جيد على الأقل، مع سبب الإنهاء FEASIBLE أو NO_SOLUTION_FOUND والحد من الهدف. يُرجى الاطّلاع على دليل المستخدم للحصول على مزيد من التفاصيل والمقارنة مع cutoffLimit. |
solutionLimit |
تتوقف أداة الحلّ في وقت مبكر بعد إيجاد هذا العدد الكبير من الحلول المجدية، ويكون سبب الإنهاء أكثر سهولة ويحدّ من الحل. يجب أن تكون القيمة أكبر من صفر في حال ضبطها. وغالبًا ما يتم استخدامه لإيقاف أداة الحل عند العثور على أول حل ممكن. يُرجى العلم أنّه ما مِن ضمانة على قيمة الهدف لأيّ من الحلول التي تم إرجاعها. لن تعرض أدوات الحلّ عادةً حلولاً أكثر من حد الحل، ولكن لا يتم فرض ذلك بواسطة MathOpt، راجع أيضًا b/214041169. يتم اعتمادها حاليًا مع Gurobi وSCIP، وCP-SAT فقط بالقيمة 1. |
threads |
في حال ضبطها، يجب أن تكون القيمة >= 1. |
randomSeed |
قيمة الإدخال العشوائية لمنشئ الأرقام العشوائية الزائفة في أداة الحلّ الأساسية تجدر الإشارة إلى أنّ جميع أدوات الحلّ تستخدم أرقامًا عشوائية زائفة لتحديد عوامل، مثل الاضطراب في خوارزمية LP، ولتحديد قواعد لفواصل الربط، وتصحيح الأخطاء. وقد يكون لتنويع هذه القيم تأثير ملحوظ في سلوك أداة الحلّ. على الرغم من أنّ جميع أدوات الحلّ تعتمد على مفهوم البذور، يُرجى العِلم أنّ القيم الصالحة تعتمد على أداة الحلّ الفعلية. - Gurobi: [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, SpamSeed)). |
absoluteGapTolerance |
يشير ذلك المصطلح إلى تسامح مثالي مطلق (بشكل أساسي) لأدوات حل MIP. GAP المطلقة هي القيمة المطلقة للفرق بين: * القيمة الموضوعية لأفضل حل ممكن تم العثور عليه، * الحد الثنائي الناتج عن البحث. يمكن أن تتوقف أداة الحلّ بمجرد وصول GAP المطلق إلى أقصى حد لـ GapTolerance (عند الضبط)، وعرض TERMINATION_REASON_OPTIMAL. يجب أن تكون القيمة >= 0 في حال ضبطها. راجع أيضًا مقياس التسامح النسبي. |
relativeGapTolerance |
يشير ذلك المصطلح إلى تفاوت نسبي وتقديري (بشكل أساسي) لأدوات حل مشاكل MIP. يعد GAP النسبي نسخة تمت تسويتها من GAP المطلق (معرَّف في absoluteGapTolerance)، حيث تعتمد التسوية على أداة الحل، على سبيل المثال قيمة GAP المطلقة مقسومةً على القيمة الموضوعية لأفضل حل ممكن تم العثور عليه. يمكن أن تتوقف أداة الحل بمجرد أن يصبح GAP النسبي GapTolerance نسبيًا على الأكثر (عند تعيينه)، وتعرض TERMINATION_REASON_OPTIMAL. يجب أن تكون القيمة >= 0 في حال ضبطها. راجع أيضًا absoluteGapTolerance. |
solutionPoolSize |
يمكنك الحفاظ على ما يصل إلى |
LPAlgorithmProto
تختار خوارزمية لحل البرامج الخطية.
عمليات التعداد | |
---|---|
LP_ALGORITHM_UNSPECIFIED |
|
LP_ALGORITHM_PRIMAL_SIMPLEX |
الطريقة البسيطة (الأساسية). يمكن أن توفر عادة حلولاً أساسية وثنائية، والشعاع الأولي/المزدوج للمسائل الأساسية/الثنائية، وأساس. |
LP_ALGORITHM_DUAL_SIMPLEX |
الطريقة المزدوجة البسيطة. يمكن أن توفر عادة حلولاً أساسية وثنائية، والشعاع الأولي/المزدوج للمسائل الأساسية/الثنائية، وأساس. |
LP_ALGORITHM_BARRIER |
طريقة الحاجز، وتسمى أيضًا طريقة النقطة الداخلية (IPM). يمكن أن تعطي عادةً كلاً من الحلول الأولية والثنائية. ويمكن أن تؤدي بعض عمليات التنفيذ أيضًا إلى ظهور إشارات على المسائل غير المحدودة/غير المجدية. لا يتم منح أي أساس ما لم تجرِ أداة الحلّ الأساسية "التقاطع" وينتهي بطريقة بسيطة. |
LP_ALGORITHM_FIRST_ORDER |
يشير ذلك المصطلح إلى خوارزمية تستند إلى طريقة من الرتبة الأولى. وستنتج عادةً هذه الحلول كلاً من الحلول الأولية والثنائية، ومن المحتمل أيضًا أن تنتج شهادات عدم الجدوى الأولية و/أو المزدوجة. توفِّر الطُرق ذات الترتيب الأول عادةً حلولاً بدقة أقل، لذلك يجب أن يحرص المستخدمون على ضبط معلَمات جودة الحل (مثل حالات التفاوت) والتحقّق من صحة الحلول. |
EmphasisProto
مستوى الجهد الذي تم تطبيقه على مهمة اختيارية أثناء حلها (يمكنك الاطّلاع على Solve محدّدات بهدف الاستخدام).
يُستخدَم التوكيد لتهيئة ميزة أداة الحلّ على النحو التالي: * إذا كانت أداة الحلّ لا تدعم هذه الميزة، فستبقى السياسة UNSPECIFIED صالحة دائمًا، وعادة ما يكون أي إعداد آخر خطأ وسيطة غير صالح (قد تقبل بعض أدوات الحلّ أيضًا إيقاف). * إذا كانت أداة الحلّ متوافقة مع الميزة: - يتم استخدام القيمة التلقائية الأساسية عند ضبط السياسة على UNSPECIFIED. - عندما يتعذر إيقاف تشغيل هذه الميزة، فسيعرض "إيقاف" خطأ. - إذا كانت الميزة مفعَّلة تلقائيًا، يتم عادةً ربط أداة الحلّ التلقائية بالإعداد MEDIUM. - إذا كانت الميزة متاحة، لن تظهر أخطاء LOW وMEDIUM وHIGH وVERY HIGH مطلقًا، وسيتم تعيينها إلى أفضل مطابقة.
عمليات التعداد | |
---|---|
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). المتطلبات: * filterId هي عناصر من VariablesProto.ids. |
dualValuesFilter |
عامل تصفية يتم تطبيقه على جميع الحاويات المتفرقة المستندة إلى قيود خطية في DualSolutionProto وDualRay (DualSolutionProto.dual_values, DualRay.dual_values). المتطلبات: * filterId هي عناصر من LinearConstraints.ids. |
reducedCostsFilter |
عامل تصفية يتم تطبيقه على جميع الحاويات المتفرقة التي تم إرجاعها بالاستناد إلى متغيرات في DualSolutionProto وDualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs). المتطلبات: * filterId هي عناصر من VariablesProto.ids. |
initialBasis |
أساس مبدئي اختياري لأدوات حل مشاكل LP البسيطة التي تبدأ بالبدء. وفي حال ضبطها، من المتوقّع أن تكون صالحة وفقًا لمعيار |
solutionHints[] |
تلميحات الحلول الاختيارية. إذا قبلت أداة الحلّ الأساسية تلميحًا واحدًا فقط، سيتم استخدام التلميح الأول. |
branchingPriorities |
أولويات التشعّب الاختيارية. إنّ المتغيّرات ذات القيم الأعلى ستتفرّع أولاً. وتحصل المتغيّرات التي لم يتم ضبط أولوياتها على الأولوية التلقائية لأداة الحلّ (تكون عادةً صفرًا). المتطلبات: * يجب أن تكون قيمة السمة التحقّق (الأولوية) محدودة. * يجب أن تكون عناصر التحقّق من أوجه الاختلاف بين عناصر واجهة برمجة التطبيقات VariablesProto.ids. |
SparseVectorFilterProto
تسمح هذه الرسالة بطلب/تعيين أجزاء معينة من SpirseXxxxVector. ويتمثل السلوك الافتراضي في عدم تصفية أي شيء. من الاستخدامات الشائعة الاستعلام عن أجزاء من الحلول فقط (قيم غير صفرية فقط و/أو مجرد مجموعة من القيم المتغيرة منتقاة بعناية).
تمثيل JSON |
---|
{ "skipZeroValues": boolean, "filterByIds": boolean, "filteredIds": [ string ] } |
الحقول | |
---|---|
skipZeroValues |
لـ SpirseBoolVectorProto "zero" |
filterByIds |
عند ضبط السياسة على "صحيح"، يجب عرض القيم المقابلة لأرقام التعريف المدرَجة فقط في المعرِّفات المفلترة. |
filteredIds[] |
قائمة المعرّفات التي يجب استخدامها عندما تكون filterByIds true. يجب ترك الحقل فارغًا عندما تكون filterByIds خاطئة. ملاحظة: إذا كان هذا الحقل فارغًا، وكانت filterByIds صحيحة، هذا يعني أنّك لا تريد الحصول على أي معلومات في النتيجة. |
BasisProto
يشير ذلك المصطلح إلى استخدام خاصية موحّدة لحلّ مسائل خطية.
تُرجع الطريقة البسيطة لحل البرامج الخطية دائمًا "حل أساسي عملي" التي يمكن وصفها بشكل مجمّع باستخدام الأساس. يعين الأساس أساسًا لكل متغير وقيد خطي.
مثلاً: ضع في الاعتبار نموذجًا قياسيًا LP: min c * x s.t. A * x = b x >= 0 التي تحتوي على متغيرات أكثر من القيود وبترتيب الصف الكامل A.
لنفترض أن n هو عدد المتغيرات وm عدد القيود الخطية. يمكن إنشاء أساس صالح لهذه المشكلة على النحو التالي: * سيتم وضع حالة الأساس لجميع القيود. * اختر متغيرات m بحيث تكون أعمدة A مستقلة خطيًا وتعين الحالة BASIC. * عيّن الحالة AT_FILTER لمتغيرات n - m المتبقية.
الحل الأساسي لهذا الأساس هو الحل الفريد لـ A * x = b الذي يحتوي على جميع المتغيرات ذات الحالة AT_FILTER ثابتة في حدودها الأدنى (كلها صفر). يسمى الحل الناتج بالحل الأساسي المجدي إذا كان أيضًا يفي بـ x >= 0.
تمثيل JSON |
---|
{ "constraintStatus": { object ( |
الحقول | |
---|---|
constraintStatus |
حالة أساس القيد. المتطلبات: * RestricttStatus.ids تساوي LinearConstraints.ids. |
variableStatus |
حالة الأساس المتغير. المتطلبات: * RestricttStatus.ids تساوي VariablesProto.ids. |
basicDualFeasibility |
تعتبر هذه إحدى الميزات المتقدمة التي تستخدمها MathOpt لوصف جدوى حلول LP دون المستوى الأمثل (ستكون للحلول المثلى دائمًا الحالة SOLUTION_STATUS_FEASIBLE). وبالنسبة إلى LPs أحادية الجانب، يجب أن تكون مساوية لحالة جدوى الحل الثنائي المرتبط. وقد يختلف الأمر في بعض الحالات الحدّية (مثل الحلول غير المكتملة باستخدام تنسيق LPs البسيط). إذا كنت تقدم أساس البدء من خلال modelSolveparamsProto.initial_basis، سيتم تجاهل هذه القيمة. وهي ملائمة فقط للأساس الذي يعرضه SolutionProto.basis. |
SparseBasisStatusVector
تمثيل متفرق لمتّجه لحالات الأساس.
تمثيل JSON |
---|
{
"ids": [
string
],
"values": [
enum ( |
الحقول | |
---|---|
ids[] |
يجب ترتيبها (بترتيب متزايد) مع تمييز جميع العناصر. |
values[] |
يجب أن يكون طولها مساويًا للأرقام التعريفية. |
BasisStatusProto
حالة المتغيّر/القيد على أساس LP.
عمليات التعداد | |
---|---|
BASIS_STATUS_UNSPECIFIED |
قيمة الحرس التي تمثل "لا توجد حالة" |
BASIS_STATUS_FREE |
المتغير/القيد حر (ليس له حدود محدودة). |
BASIS_STATUS_AT_LOWER_BOUND |
المتغير/القيد عند الحد الأدنى (الذي يجب أن يكون محددًا). |
BASIS_STATUS_AT_UPPER_BOUND |
يقع المتغير/القيد في الحد الأعلى (الذي يجب أن يكون محدودًا). |
BASIS_STATUS_FIXED_VALUE |
المتغير/القيد له حد أدنى وحدود علوية متطابقة. |
BASIS_STATUS_BASIC |
المتغير/القيد أساسي. |
SolutionStatusProto
إمكانية تطبيق حل أولي أو ثنائي على النحو الذي تطالب به أداة الحلّ.
عمليات التعداد | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
قيمة الحرس التي تمثل "لا توجد حالة" |
SOLUTION_STATUS_UNDETERMINED |
لم يطالب أداة الحلّ بحالة دراسة الجدوى. |
SOLUTION_STATUS_FEASIBLE |
يدّعي الحلّ أن الحل ممكن. |
SOLUTION_STATUS_INFEASIBLE |
يدّعي الحلّ أن الحل غير ممكن. |
SolutionHintProto
تمثّل هذه السمة حلّ بدء مقترَحًا لأداة الحلّ.
تريد أدوات حلّ ملفات MIP بشكل عام المعلومات الأولية فقط (variableValues
)، بينما تريد أدوات حلّ LP كلاً من المعلومات الأولية والثنائية (dualValues
).
يمكن أن تعمل العديد من أدوات حل MIP باستخدام: (1) حلول جزئية لا تحدد جميع المتغيرات أو (2) حلول غير قابلة للتنفيذ. في هذه الحالات، تحل أدوات الحلّ عادةً ملف MIP فرعيًا لإكمال/تصحيح التلميح.
وتعتمد كيفية استخدام أداة الحلّ، في حال استخدامها، بشكل كبير على أداة الحلّ ونوع المسألة والخوارزمية المستخدَمة. الطريقة الأكثر موثوقية لضمان تأثير التلميح هو قراءة سجلات أدوات الحلّ الأساسية مع التلميح وبدونه.
عادةً ما تفضل أدوات حل LP المستندة إلى Simplex الأساس الأولي إلى تلميح الحل (يجب أن تؤدي إلى التبديل لتحويل التلميح إلى حل أساسي عملي بخلاف ذلك).
تمثيل JSON |
---|
{ "variableValues": { object ( |
الحقول | |
---|---|
variableValues |
ربما تخصيص جزئي لقيم للمتغيرات الأساسية في المشكلة. المتطلبات المستقلة للحل لهذه الرسالة الفرعية هي: * VariableValues.ids هي عناصر VariablesProto.ids. * يجب أن تكون جميع قيمة المتغيّرValues.values محدودة. |
dualValues |
تخصيص (يحتمل أن يكون جزئي) لقيم للقيود الخطية للمسألة. المتطلبات: * dualValues.ids هي عناصر من LinearConstraintsProto.ids. * يجب أن تكون جميع قيم DualValues.value محدودة. |
SparseInt32VectorProto
تمثيل متفرق لمتّجه عدد صحيح
تمثيل JSON |
---|
{ "ids": [ string ], "values": [ integer ] } |
الحقول | |
---|---|
ids[] |
يجب ترتيبها (بترتيب متزايد) مع تمييز جميع العناصر. |
values[] |
يجب أن يكون طولها مساويًا للأرقام التعريفية. |
SolveResultProto
إذا كان العقد بشأن الحالات التي تكون فيها الحلول الأولية/الثنائية/الأشعة معقّدة، يمكنك الاطّلاع على end_reasons.md للحصول على وصف كامل.
حتى يتم إبرام عقد دقيق، من الأفضل التحقق ببساطة من وجود محلول أو شعاع بدلاً من الاعتماد على سبب الإنهاء.
تمثيل JSON |
---|
{ "termination": { object ( |
الحقول | |
---|---|
termination |
سبب توقّف أداة الحل |
solutions[] |
العقد العام لترتيب الحلول التي يجب على أدوات الحلّ المستقبلية تنفيذها هو الترتيب حسب: 1. يشير ذلك المصطلح إلى الحلول الأساسية المتاحة والمرتبة حسب الهدف الأساسي الأفضل أولاً. 2. الحلول ذات الحلول المزدوجة الممكنة، مرتبة حسب أفضل هدف ثنائي (الهدف الثنائي غير المعروف هو الأسوأ) 3. يمكن إرجاع جميع الحلول المتبقية بأي ترتيب. |
primalRays[] |
إرشادات التحسين الأولي غير المحدود، أو ما يعادلها، شهادات عدم الجدوى المزدوجة يتم تقديمه عادةً لسبب الإنهاء: Protos UNBOUNDED وDUAL_INFEASIBLE |
dualRays[] |
إرشادات التحسين الثنائي غير المحدود، أو ما يعادلها، شهادات عدم الجدوى الأولية يتم تقديمه عادةً لسبب الإنهاء بشكل غير صحيح. |
solveStats |
إحصاءات عن عملية الحل، مثل ووقت التشغيل والتكرارات. |
TerminationProto
جميع المعلومات المتعلقة بأسباب إنهاء الاتصال بـ Solve().
تمثيل JSON |
---|
{ "reason": enum ( |
الحقول | |
---|---|
reason |
معلومات إضافية في |
limit |
يبلغ LIMIT_UNSPECIFIED ما لم يكن السبب TERMINATION_REASON_FEASIBLE أو TERMINATION_REASON_NO_SOLUTION_FOUND. لا يمكن لبعض أدوات الحلّ دائمًا تحديد الحد الأقصى الذي تسبَّب في الإنهاء، ويتم استخدام LIMIT_UNDETERMINED عندما لا يمكن تحديد السبب. |
detail |
معلومات إضافية خاصة بأداة حلّ المشكلة في العادة |
problemStatus |
حالات دراسة الجدوى للمسائل الأساسية والثنائية. اعتبارًا من 18 تموز (يوليو) 2023، قد لا تظهر هذه الرسالة. إذا لم يتم العثور على مشكلة، يمكن العثور على توفّرها في SolveResultProto.solve_stats. |
objectiveBounds |
القيود على القيمة الموضوعية المثلى. اعتبارًا من 18 تموز (يوليو) 2023، قد لا تظهر هذه الرسالة. إذا لم يتم تحديد قيمة، يمكن العثور على objectBounds.primal_bound في SolveResultProto.solve.stats.best_primal_bound وtopicBounds.dual_bound في SolveResultProto.solve.stats.best_dual_bound |
TerminationReasonProto
سبب إنهاء استدعاء Solve().
عمليات التعداد | |
---|---|
TERMINATION_REASON_UNSPECIFIED |
|
TERMINATION_REASON_OPTIMAL |
تم العثور على حل مثالي يمكن إثباته (يصل إلى قيم التفاوت العددية). |
TERMINATION_REASON_INFEASIBLE |
المشكلة الأساسية ليس لها حلول قابلة للتنفيذ. |
TERMINATION_REASON_UNBOUNDED |
المشكلة الأساسية قابلة للتنفيذ، ويمكن إيجاد الحلول الجيدة بشكل عشوائي على طول الشعاع الأساسي. |
TERMINATION_REASON_INFEASIBLE_OR_UNBOUNDED |
المشكلة الأساسية إما غير قابلة للتنفيذ أو غير محدودة. قد تتوفّر المزيد من التفاصيل حول حالة المشكلة في SolStats.problem_status. يُرجى ملاحظة أنّه يمكن وضع حالة "غير حدود" لـ Gurobi هنا. |
TERMINATION_REASON_IMPRECISE |
تم حل المشكلة وفقًا لأحد المعايير المذكورة أعلاه (مثالي، أو غير قابل للتنفيذ، أو غير محدود، أو غير ممكن أو غير مقيّد)، ولكن لم يتم استيفاء واحد أو أكثر من التفاوتات. بعض الحلول/الأشعة الأولية/الثنائية موجودة، ولكنها إما ستكون غير قابلة للتنفيذ إلى حد ما، أو (إذا كانت المشكلة شبه مثالية)، فقد تكون فجوة بين أفضل هدف للحل وأفضل حد موضوعي. لا يزال بإمكان المستخدمين الاستعلام عن الحلول/الأشعة الأولية/الثنائية وإحصاءات الحلول، لكنهم مسؤولون عن التعامل مع عدم الدقة العددي. |
TERMINATION_REASON_FEASIBLE |
بلغ المحسّن نوعًا ما من الحدود، وتم عرض حل عملي أساسي. راجِع SolveResultProto.limit_detail للحصول على وصف تفصيلي لنوع الحد الذي تم بلوغه. |
TERMINATION_REASON_NO_SOLUTION_FOUND |
وصل المحسّن إلى حد ما إلى حد ما ولم يعثر على أي حل ممكن عملي. راجِع SolveResultProto.limit_detail للحصول على وصف تفصيلي لنوع الحد الذي تم بلوغه. |
TERMINATION_REASON_NUMERICAL_ERROR |
توقفت الخوارزمية بسبب حدوث خطأ رقمي غير قابل للإصلاح. لا تتوفر أي معلومات عن الحل. |
TERMINATION_REASON_OTHER_ERROR |
توقفت الخوارزمية بسبب خطأ لا تشمله إحدى الحالات المحددة أعلاه. لا تتوفر أي معلومات عن الحل. |
LimitProto
عند إيقاف Solve() مبكرًا مع FinishreasonProto FEASIBLE أو NO_SOLUTION_FOUND، الحدّ الأقصى الذي تم الوصول إليه.
عمليات التعداد | |
---|---|
LIMIT_UNSPECIFIED |
يتم استخدامها كقيمة فارغة عند إنهاء الاتفاقية ليس من حدود حد (مثل TERMINATION_REASON_OPTIMAL). |
LIMIT_UNDETERMINED |
لا تكشف أداة الحلّ الأساسية عن الحدّ الذي تم بلوغه. |
LIMIT_ITERATION |
توقف خوارزمية تكرارية بعد إجراء الحد الأقصى لعدد التكرارات (على سبيل المثال التكرارات البسيطة أو الحاجزة). |
LIMIT_TIME |
توقفت الخوارزمية بعد وقت الحساب الذي حدده المستخدم. |
LIMIT_NODE |
توقفت خوارزمية "فرع وربط" بسبب استكشافها للحد الأقصى لعدد العُقد في شجرة الروابط والارتباطات. |
LIMIT_SOLUTION |
توقفت الخوارزمية لأنها وجدت عدد الحلول المطلوب. وغالبًا ما يستخدم هذا في ملفات MIPs لجعل أداة الحل تعرض أول حل ممكن مصادفتها. |
LIMIT_MEMORY |
توقفت الخوارزمية بسبب نفاد الذاكرة. |
LIMIT_CUTOFF |
تم تشغيل أداة الحلّ مع تحديد قيمة فاصلة (على سبيل المثال، تم ضبط Solveparams.cutoff_limit) على الهدف، ما يشير إلى أنّ المستخدم لا يريد أيّ حلّ أسوأ من الموعد النهائي، وتوصّلت أداة الحلّ إلى أنّه لا تتوفّر حلول على الأقل عالية الجودة. وفي العادة، لا يتم تقديم معلومات إضافية عن الحلول. |
LIMIT_OBJECTIVE |
توقفت الخوارزمية لأنها إما عثرت على حل أو حد أفضل من الحد الذي حدده المستخدم (راجع Solveparams.objective_limit و Solveparameters.best_bound_limit). |
LIMIT_NORM |
توقفت الخوارزمية لأن قاعدة التكرار أصبحت كبيرة جدًا. |
LIMIT_INTERRUPTED |
توقفت الخوارزمية بسبب إشارة مقاطعة أو طلب مقاطعة من المستخدم. |
LIMIT_SLOW_PROGRESS |
توقفت الخوارزمية لأنها لم تتمكن من مواصلة إحراز تقدم نحو الحل. |
LIMIT_OTHER |
توقفت الخوارزمية بسبب حد لا يشمله أحد العناصر المذكورة أعلاه. تجدر الإشارة إلى أنّه يتم استخدام LIMIT_UNDETERMINED عندما يتعذّر تحديد السبب، وLIMIT_OTHER تُستخدَم عندما يكون السبب معروفًا ولكنّه لا يندرج ضمن أي من البدائل المذكورة أعلاه. قد تحتوي FinishProto.detail على معلومات إضافية عن الحد. |
ProblemStatusProto
يشير ذلك المصطلح إلى إمكانية دراسة المشكلة الأولية والرمز المزدوج (أو كليهما من خلال حل الحلّ المستمر) وفق ما تشير إليه أداة الحلّ. لا يُطلب من أداة الحلّ إرجاع شهادة للمطالبة (على سبيل المثال، قد تطالب أداة الحلّ بالإمكانية الأساسية بدون إرجاع حل ممكن عملي). تقدّم هذه الحالة المجمّعة وصفًا شاملاً لادعاءات جهة الحلّ بشأن جدوى المشكلة التي تم حلها وعدم حدودها. على سبيل المثال:
- تشير الحالة العملية للمشكلات البدائية والثنائية إلى أن العنصر الأساسي ممكن ومحدود ومن المحتمل أن يكون له حل مثالي (مضمون للمشكلات بدون قيود غير خطية).
- أن تكون أصلاً ممكناً والحالة المزدوجة غير القابلة للتنفيذ تشير إلى أن المشكلة الأساسية غير محدودة (أي أنها تشتمل على حلول جيدة بشكل عشوائي).
لاحظ أن الحالة المزدوجة غير القابلة للتنفيذ في حد ذاتها (أي مصحوبة بحالة أولية غير محددة) لا تشير إلى أن المشكلة الأساسية غير محدودة حيث قد يكون لدينا كلتا المشكلتين غير ممكنتين. كذلك، في حين أن الحالة الأولية والمزدوجة الممكنة قد تشير إلى وجود حل مثالي، إلا أنها لا تضمن أن أداة الحلّ قد وجدت هذا الحل الأمثل بالفعل.
تمثيل JSON |
---|
{ "primalStatus": enum ( |
الحقول | |
---|---|
primalStatus |
حالة المشكلة الأساسية. |
dualStatus |
الحالة للمسألة المزدوجة (أو لمضاعفة التعافي المستمر). |
primalOrDualInfeasible |
إذا كانت الإجابة "صحيح"، تدّعي أداة الحلّ أنّ المشكلة الأساسية أو المزدوجة غير قابلة للتنفيذ، لكنّها لا تعرف أيهما (أو ما إذا كان كلاهما غير ممكن). لا يمكن أن تكون صحيحة إلا عندما تكون primal_problem_status = dual_problem_status = kUnUnused. غالبًا ما تكون هذه المعلومات الإضافية مطلوبة عندما تحدد مرحلة المعالجة المسبقة عدم وجود حل مثالي للمشكلة (ولكن لا يمكن تحديد ما إذا كان السبب يعود إلى عدم الجدوى أو العدم الحد أو كليهما). |
FeasibilityStatusProto
حالة إمكانية حلّ المشكلة وفقًا لما طالبت به أداة الحلّ (ليس مطلوبًا من الحلّ إرسال شهادة للمطالبة)
عمليات التعداد | |
---|---|
FEASIBILITY_STATUS_UNSPECIFIED |
قيمة الحرس التي تمثل "لا توجد حالة" |
FEASIBILITY_STATUS_UNDETERMINED |
لا يطالب أداة الحلّ بإحدى التجارب. |
FEASIBILITY_STATUS_FEASIBLE |
يدعي الحل أن المشكلة قابلة للتنفيذ. |
FEASIBILITY_STATUS_INFEASIBLE |
يدعي الحل أن المشكلة غير قابلة للتنفيذ. |
ObjectiveBoundsProto
القيود على القيمة الموضوعية المثلى.
تمثيل JSON |
---|
{ "primalBound": number, "dualBound": number } |
الحقول | |
---|---|
primalBound |
يدّعي أداة الحلّ أنّ القيمة المثلى تساوي أو أفضل (أصغر للتصغير وأكبر للتكبير) من primalBound حتى تصل إلى تفاوت الجدوى الأساسية لأدوات الحلّ (انظر التحذير أدناه): * primalBound هو تافه (+inf للتصغير و-inf إلى أقصى حد) عندما لا تدّعي أداة الحلّ أنّ لها حدّ معيّن. * قد يكون primalBound أقرب إلى القيمة المثلى من هدف أفضل حل ممكن عملي. وعلى وجه الخصوص، قد يكون primalBound غير تافه حتى عند عدم إرجاع أي حلول ممكنة ممكنة. تحذير: يتمثّل الادّعاء الدقيق في توفّر حلّ أساسي: * ممكن رقميًا (أي ممكن وفقًا لاحتمالية الحلّ)، و * له قيمة primalBound موضوعية. وقد يكون هذا الحل المناسب رقميًا غير ممكن بعض الشيء، وفي هذه الحالة يمكن أن يكون primalBound أفضل من القيمة المثلى. إن ترجمة مقدار التفاوت الأساسي للجدوى تجاه التفاوت في primalBound هي ترجمة غير بسيطة، خاصةً عندما يكون تفاوت الاحتمالية كبيرًا نسبيًا (على سبيل المثال عند حل التفاوت باستخدام PDLP). |
dualBound |
يدّعي أداة الحلّ أنّ القيمة المثلى تساوي أو أسوأ (أكبر للتصغير وأصغر للتكبير) مقارنةً بـ DoubleBound يصل إلى مقدار التفاوت في الجدوى مع أدوات الحل (انظر التحذير أدناه): * DoubleBound هو قيمة بسيطة (-inf للتصغير و+inf إلى أقصى حدّ) عندما لا تدّعي أداة الحلّ أنّ لها حدّ أقصى. وعلى غرار primalBound، قد يحدث هذا الأمر لبعض أدوات الحلّ حتى عند عرض الخيار الأمثل. عادةً ما تُبلغ أدوات حل MIP عن حد حتى إذا كان غير دقيق. * بالنسبة إلى المشكلات المستمرة، يمكن أن يكون نظام DualBound أقرب إلى القيمة المثلى من هدف أفضل حل ثنائي ممكن. بالنسبة لـ MIP، غالبًا ما تكون إحدى القيم غير التافهة لـ DualBound هي القيمة المثلى لتخفيف LP لـ MIP. * يجب أن تكون السمة DualBound أفضل (أصغر حجمًا للتصغير وأكبر حجمًا للتكبير) من primalBound حتى تصل إلى حدود تفاوتات أدوات الحلّ (راجِع التحذير أدناه). تحذير: * بالنسبة إلى المشاكل المستمرة، يشير الادّعاء الدقيق إلى توفُّر حلّ مزدوج: * ممكن رقميًا (أي ممكن بما يصل إلى تسامح أدوات الحلّ)، و * له قيمة DualBound موضوعية. وقد يكون هذا الحل المناسب رقميًا غير قابل للتنفيذ بعض الشيء، وفي هذه الحالة يمكن أن يكون DualBound أسوأ من القيمة المثلى وprimalBound. على غرار الحالة الأساسية، فإنّ ترجمة مقدار التفاوت في الاحتمالات إلى تفاوت في DualBound ليس تافهًا، خاصةً عندما يكون مقدار التفاوت في الاحتمالية كبيرًا نسبيًا. ومع ذلك، توفر بعض أدوات الحلّ إصدارًا مصحّحًا من DualBound يمكن أن يكون أكثر أمانًا من الناحية الرقمية. ويمكن الوصول إلى هذا الإصدار المصحَّح من خلال مخرجات أداة الحل المحددة (على سبيل المثال، لـ PDLP وpdlp_output.convergence_information. corrected_dual_objective). * بالنسبة إلى أدوات حل MIP، قد ترتبط السمة المزدوجة Bound بحل مزدوج لتوفير بعض الاسترخاء المستمر (مثل تخفيف LP)، ولكنها غالبًا ما تكون نتيجة معقدة لتنفيذ أدوات الحلّ، وعادة ما تكون غير دقيقة أكثر من الحدود التي تم الإبلاغ عنها بواسطة أدوات حلّ LP. |
SolutionProto
ما يتم تضمينه في الحل يعتمد على نوع المشكلة والحل. الأنماط الشائعة الحالية هي 1. تعرض أدوات حل MIP حلاً أساسيًا فقط. 2. غالبًا ما تعرض أدوات حل Simplex LP الأساس والحلول الأساسية والثنائية المرتبطة بهذا الأساس. 3- تعرض أدوات الحلّ المستمرة الأخرى غالبًا حلاً أساسيًا وثنائيًا يكون مرتبطًا في شكل يعتمد على أداة الحلّ.
المتطلبات: * يجب ضبط حقل واحد على الأقل. لا يمكن أن يكون الحل فارغًا.
تمثيل JSON |
---|
{ "primalSolution": { object ( |
الحقول | |
---|---|
primalSolution |
|
dualSolution |
|
basis |
|
PrimalSolutionProto
حل لمشكلة في التحسين.
مثلاً: ضع في الاعتبار برنامج خطي بسيط: min c * x s.t. A * x >= b x >= 0. الحل الأساسي هو قيم التعيين إلى س. وهذا ممكن إذا استوفى x x >= b وx >= 0 أعلاه. في الرسالة PrimalSolutionProto أدناه، وهي قيمةVariableValues هي x وsubjectValue هي c * x.
تمثيل JSON |
---|
{ "variableValues": { object ( |
الحقول | |
---|---|
variableValues |
المتطلبات: * VariableValues.ids هي عناصر VariablesProto.ids. * يجب أن تكون جميع قيمة المتغيّرValues.values محدودة. |
objectiveValue |
القيمة الموضوعية التي تم احتسابها بواسطة أداة الحلّ الأساسية لا يمكن أن تكون لانهائية أو NaN. |
auxiliaryObjectiveValues |
قيم الهدف الإضافية التي تحسبها أداة الحلّ الأساسية يجب أن تكون المفاتيح معرّفات صالحة للأهداف الإضافية. لا يمكن أن تكون القيم لانهائية أو NaN. عنصر يحتوي على قائمة بأزواج |
feasibilityStatus |
حالة إمكانية تنفيذ الحلّ وفقًا لأداة الحلّ الأساسية |
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). يمكن تنفيذ الإجراء إذا استوفى القيود الواردة من (الثنائي) أعلاه.
في الرسالة أدناه، y هي DualValues، و r هي انخفاضCosts، و b * y هي قيمة موضوعية.
تمثيل JSON |
---|
{ "dualValues": { object ( |
الحقول | |
---|---|
dualValues |
المتطلبات: * DualValues.ids هي عناصر من LinearConstraints.ids. * يجب أن تكون جميع قيم DualValues.value محدودة. |
reducedCosts |
المتطلبات: * lessCosts.ids هي عناصر VariablesProto.ids. * يجب أن تكون جميع القيم المخفّضة التكلفة محدودة. |
feasibilityStatus |
حالة إمكانية تنفيذ الحلّ وفقًا لأداة الحلّ الأساسية |
objectiveValue |
|
PrimalRayProto
يشير ذلك المصطلح إلى اتجاه التحسين غير المحدود لمشكلة تحسين. وبالمثل، شهادة عدم جدوى حل ثنائي مشكلة التحسين.
مثلاً: ضع في الاعتبار برنامج خطي بسيط: min c * x s.t. A * x >= b x >= 0 الشعاع الأساسي هو x يفي بـ: c * x < 0 A * x >= 0 x >= 0 لاحظ أنه وفقًا لحل عملي، أي مضاعف موجب للشعاع الأساسي بالإضافة إلى ذلك الحل يبقى مجدية، ويعطي قيمة موضوعية أفضل. كما يثبت الشعاع البدائي أن مشكلة التحسين المزدوج غير قابلة للتنفيذ.
في الرسالة PrimalRay أدناه، تكون قيمة changeValues هي x.
تمثيل JSON |
---|
{
"variableValues": {
object ( |
الحقول | |
---|---|
variableValues |
المتطلبات: * VariableValues.ids هي عناصر VariablesProto.ids. * يجب أن تكون جميع قيمة المتغيّرValues.values محدودة. |
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. الشعاع المزدوج هو زوج (ص، r) مُرضٍ: ب * ص > 0 y * A + r = 0 y, r >= 0 لاحظ أن إضافة مضاعف موجب (ص, r) إلى حل مزدوج ممكن يؤدي إلى الحفاظ على دراسة جدوى مزدوجة وتحسين الهدف (بإثبات أن القيمة المزدوجة غير محددة). كما أثبت الشعاع المزدوج أن المشكلة الأساسية غير قابلة للتنفيذ.
في الرسالة DualRay أدناه، تكون y DualValues وr هي انخفاضCosts.
تمثيل JSON |
---|
{ "dualValues": { object ( |
الحقول | |
---|---|
dualValues |
المتطلبات: * DualValues.ids هي عناصر من LinearConstraints.ids. * يجب أن تكون جميع قيم DualValues.value محدودة. |
reducedCosts |
المتطلبات: * lessCosts.ids هي عناصر VariablesProto.ids. * يجب أن تكون جميع القيم المخفّضة التكلفة محدودة. |
SolveStatsProto
تمثيل JSON |
---|
{
"solveTime": string,
"problemStatus": {
object ( |
الحقول | |
---|---|
solveTime |
الوقت المنقضي لساعة الحائط كما تم قياسه بواسطة weather_opt، حوالي الوقت داخل Solver::Solve(). ملاحظة: لا يشمل ذلك العمل المنجز لإنشاء النموذج. مدة بالثواني مكونة من تسعة أرقام كسور كحد أقصى وتنتهي بالأرقام " |
problemStatus |
حالات دراسة الجدوى للمسائل الأساسية والثنائية. |
simplexIterations |
|
barrierIterations |
|
firstOrderIterations |
|
nodeCount |
|