لحل نموذج الإدخال وعرض النتيجة مرة واحدة. استخدِم هذا الخيار عندما لا تحتاج إلى طلبات معاودة الاتصال أو التزايد أو عندما لا تحتاج إلى تتبُّع مستوى تقدّم عملية الحل.
طلب HTTP
POST https://optimization.googleapis.com/v1/mathopt:solveMathOptModel
يستخدم عنوان URL بنية تحويل الترميز gRPC.
نص الطلب
يحتوي نص الطلب على بيانات بالبنية التالية:
تمثيل JSON |
---|
{ "solverType": enum ( |
الحقول | |
---|---|
solverType |
اختياريّ. نوع أداة الحلّ لحلّ المسألة رقميًا. يُرجى العِلم أنّه إذا كانت أداة الحلّ لا تتيح ميزة معيّنة في النموذج، لن تنجح عملية التحسين. |
model |
مطلوبة. تمثيل رياضي لمسألة التحسين المطلوب حلها. |
parameters |
اختياريّ. معلَمات للتحكّم في حل واحد. ويتم التعامل مع معلَمة واجهة (enable واحرص) على وجه التحديد. بالنسبة إلى برامج الحل التي تتيح عمليات استدعاء الرسائل، سيؤدي ضبطها على "صحيح" إلى تسجيل الخادم لرد استدعاء الرسالة. سيتم عرض الرسائل الناتجة في SolveMathOptModelResponse.messages. بالنسبة إلى أدوات الحلّ الأخرى، سيؤدي ضبط ميزة "تفعيل الإخراج" على "صحيح" إلى حدوث خطأ. |
modelParameters |
اختياريّ. المعلَمات التي يمكنها التحكّم في حل واحد والخاص بنموذج الإدخال (يُرجى الاطّلاع على SolveParametersProto لمعرفة المعلمات المستقلة في النموذج). |
نص الاستجابة
ردّ على حل أحادي عن بُعد في MathOpt.
إذا كانت الاستجابة ناجحة، سيحتوي نص الاستجابة على بيانات بالبنية التالية:
تمثيل JSON |
---|
{
"result": {
object ( |
الحقول | |
---|---|
result |
وصف ناتج حل النموذج في الطلب. |
messages[] |
في حال استخدام SolveParametersProto.enable_output، سيحتوي ذلك على رسائل سجلّ أدوات الحلّ التي تتيح عمليات استدعاء الرسائل. |
SolverTypeProto
أدوات الحلّ المتوافقة مع MathOpt.
عمليات التعداد | |
---|---|
SOLVER_TYPE_UNSPECIFIED |
|
SOLVER_TYPE_GSCIP |
أداة حلّ برامج العدد الصحيح للقيود (SCIP) (تابعة لجهة خارجية) يتيح هذا الخيار المسائل التربيعية للأعداد الصحيحة غير المحدَّبة بتنسيق LP وMIP وMIP. ومع ذلك، لا يتم عرض بيانات مزدوجة عن LPs. أفضل GLOP لـ LPs. |
SOLVER_TYPE_GUROBI |
أداة حلّ Gurobi (جهة خارجية) يتيح هذا الخيار المسائل التربيعية للأعداد الصحيحة غير المحدَّبة بتنسيق LP وMIP وMIP. بشكل عام، الخيار الأسرع، ولكن لديه ترخيص خاص. |
SOLVER_TYPE_GLOP |
أداة حلّ Glop من Google. يدعم LP بالطرق الأولية والثنائية البسيطة. |
SOLVER_TYPE_CP_SAT |
أداة حلّ CP-SAT من Google يدعم المشكلات التي تكون فيها جميع المتغيرات عددًا صحيحًا ومحددة (أو تشير ضمنًا إلى أن تكون بعد presolve). الدعم التجريبي لإعادة قياس وتصنيف المشكلات باستخدام المتغيرات المستمرة. |
SOLVER_TYPE_PDLP |
أداة حل PDLP من Google لدعم الأهداف التربيعية القطرية المحدبة والشكل المحدب للأسفل. يستخدم طرق الطلب الأول بدلاً من البسيط. يمكنها حل مشاكل كبيرة جدًا. |
SOLVER_TYPE_GLPK |
مجموعة أدوات البرمجة الخطية GNU (GLPK) (طرف ثالث). يدعم MIP وLP. Thread-safety (أمان سلسلة التعليمات): يستخدم GLPK مساحة تخزين محلية على سلسلة محادثات لتخصيص الذاكرة. ونتيجةً لذلك، يجب إتلاف مثيلات أداة Solver في سلسلة التعليمات نفسها التي تم إنشاؤها بها وإلا سيتوقف GLPK. يبدو أنه من المقبول استدعاء Solver::Solve() من سلسلة رسائل أخرى غير تلك المستخدمة لإنشاء أداة 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 |
أداة حلّ التقسيم المخروطي (SCS) التابعة لجهة خارجية إمكانية دعم مشاكل LP وSOCP. يستخدم طريقة الترتيب الأول. |
SOLVER_TYPE_HIGHS |
أداة حلّ HiGHS (تابعة لجهة خارجية) أن يدعم مشاكل LP وMIP (لم يتم تنفيذ QPs المحدب). |
SOLVER_TYPE_SANTORINI |
تنفيذ مرجع MathOpt لأداة حل MIP. بطيئة/لا يُنصح بها للإصدار العلني. ليست أداة حل LP (لم يتم عرض معلومات مزدوجة). |
ModelProto
مشكلة في التحسين. يتيح Mathopt: - متغيّرات القرار المستمرة والأعداد الصحيحة مع حدود محدودة اختيارية. - الأهداف الخطية والتربيعية (أهداف واحدة أو متعددة)، سواء كانت مصغرة أو مكبرة. - عدد من أنواع القيود، بما في ذلك: * القيود الخطية * القيود التربيعية * قيود المستوى الثاني * القيود المنطقية > قيود SOS1 وSOS2 > قيود المؤشر
يتم تمثيل القيود افتراضيًا في خرائط "المعرف إلى البيانات". ومع ذلك، نمثل القيود الخطية بتنسيق "هيكلة مصفوفة" أكثر فاعلية.
تمثيل JSON |
---|
{ "name": string, "variables": { object ( |
الحقول | |
---|---|
name |
|
variables |
|
objective |
الهدف الأساسي في النموذج. |
auxiliaryObjectives |
الأهداف الإضافية للاستخدام في النماذج متعددة الأهداف. يجب أن تكون أرقام تعريف مفاتيح الخريطة بالتنسيق [0, max(int64)). يجب أن تكون كل أولوية وكل اسم غير فارغ فريدة وأن تكون مختلفة أيضًا عن قيمة عنصر يحتوي على قائمة من أزواج |
linearConstraints |
|
linearConstraintMatrix |
يشير ذلك المصطلح إلى المعاملات المتغيّرة للقيود الخطية. إذا تم حذف متغير متضمن في هذا القيد، فسيتم التعامل معه كما لو تم تعيينه على صفر. المتطلبات: * inlineConstraintMatrix.row_ids هي عناصر LineConstraints.ids. * LineConstraintMatrix.column_ids هي عناصر sort.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. تكون القيمة خاطئة للمتغيرات المستمرة، وتكون true لمتغيّرات الأعداد الصحيحة. |
names[] |
في حال ترك هذه السياسة بدون ضبط، يُفترض أن تكون جميع السلاسل فارغة. بخلاف ذلك، يجب أن يكون طوله #variables. يجب أن تكون جميع الأسماء غير الفارغة مختلفة. |
ObjectiveProto
تمثيل JSON |
---|
{ "maximize": boolean, "offset": number, "linearCoefficients": { object ( |
الحقول | |
---|---|
maximize |
false هو تصغير، true هو تكبير |
offset |
يجب أن يكون محدودًا وليس NaN. |
linearCoefficients |
يشير ذلك المصطلح إلى مصطلحات ObjectiveProto الخطية في متغيرات القرار. المتطلبات: * inlineCo transactions.ids عبارة عن عناصر من VariablesProto.ids. * VariablesProto غير محددة تتوافق مع الصفر. * يجب أن تكون جميع قيم LineCoشملs.values عددًا محدودًا. * يمكن أن تساوي قيم lineCoشملs.values صفرًا، ولكن هذا يؤدي إلى إهدار مساحة. |
quadraticCoefficients |
يشير ذلك المصطلح إلى المصطلحات الموضوعية التربيعية في متغيرات القرار. المتطلبات بالإضافة إلى تلك المذكورة في رسائل SparseDoubleMatrixProto: * يجب أن يكون كل عنصر من عناصر quadraticCoTransactions.row_ids وكل عنصر من عناصر quadraticCo خصوصيةs.column_ids، عنصرًا من VariablesProto.ids. * يجب أن تكون المصفوفة مثلثة علوية الشكل: لكل i, quadraticCoTransactions.row_ids[i] <= quadraticCofactors.column_ids[i]. ملاحظات: * المصطلحات التي لم يتم تخزينها بشكل صريح تتضمّن مُعاملاً صفريًا. * يمكن أن تكون عناصر quadraticCo مربعs.cotransactions صفرًا، ولكن هذا يؤدي إلى إهدار مساحة. |
name |
قد يكون للرسائل الرئيسية متطلبات فريدة في هذا الحقل، على سبيل المثال، راجع ModelProto.objectives وAuxiliaryObjectivesUpdatesProto.new_objectives. |
priority |
بالنسبة لمشكلات متعددة الأهداف، تكون أولوية هذا الهدف بالنسبة إلى الأهداف الأخرى (أقل أهمية). يجب أن تكون هذه القيمة غير سالبة. علاوة على ذلك، يجب أن تكون كل أولوية موضوعية في النموذج مستقلة في وقت الحل. لم يتم التحقّق من صحة هذا الشرط على مستوى النموذج الأولي، لذا قد يكون للنماذج مؤقتًا أهداف لها الأولوية نفسها. |
SparseDoubleVectorProto
تمثيل متفرق لمتجه المضاعفات.
تمثيل JSON |
---|
{ "ids": [ string ], "values": [ number ] } |
الحقول | |
---|---|
ids[] |
يجب ترتيبه (بترتيب متزايد) مع تضمين كل العناصر المميزة. |
values[] |
يجب أن يساوي طول الصورة أرقام التعريف. قد لا تحتوي على القيم غير الرقمية (NaN). |
SparseDoubleMatrixProto
تمثيل متفرق لمصفوفة من الأزواج.
يتم تخزين المصفوفة كثلاث ثلاثيات من معرف الصف ومعرف العمود ومعامل. يجب أن تكون هذه المتجهات الثلاثة متساوية الطول. بالنسبة إلى كل i، يجب أن يكون الصف (rowIds[i] وcolumnIds[i]) مختلفًا. يجب أن تكون الإدخالات بترتيب رئيسي في الصف.
تمثيل JSON |
---|
{ "rowIds": [ string ], "columnIds": [ string ], "coefficients": [ number ] } |
الحقول | |
---|---|
rowIds[] |
|
columnIds[] |
|
coefficients[] |
قد لا تحتوي على القيم غير الرقمية (NaN). |
LinearConstraintsProto
كما هو موضح أدناه، نحدد "#Lineالقيود" = الحجم(LinearConstraintsProto.ids).
تمثيل JSON |
---|
{ "ids": [ string ], "lowerBounds": [ number ], "upperBounds": [ number ], "names": [ string ] } |
الحقول | |
---|---|
ids[] |
يجب أن تكون القيمة غير سالبة وأن تكون متزايدة تمامًا. لا يمكن استخدام قيمة max(int64). |
lowerBounds[] |
يجب أن يكون طولها #line خطي، والقيم بـ [-inf, inf). |
upperBounds[] |
يجب أن يكون طولها #قابلاً للقيود الخطية، والقيم بـ (-inf, inf]. |
names[] |
في حال ترك هذه السياسة بدون ضبط، يُفترض أن تكون جميع السلاسل فارغة. بخلاف ذلك، يجب أن يكون طولاً يساوي #Line القيود. يجب أن تكون جميع الأسماء غير الفارغة مختلفة. |
QuadraticConstraintProto
قيد تربيعي واحد بالصيغة: lb <= sum{ LineTerms} + sum{quadraticTerms} <= ub.
إذا تم حذف متغير متضمن في هذا القيد، فسيتم التعامل معه كما لو تم تعيينه على صفر.
تمثيل JSON |
---|
{ "linearTerms": { object ( |
الحقول | |
---|---|
linearTerms |
العبارات الخطية في متغيرات القرار. بالإضافة إلى المتطلبات الخاصة برسائل SparseDoubleVectorProto، نطلب منك تنفيذ ما يلي: * LineTerms.ids هي عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم LineTerms.values محدودة وليست NaN. ملاحظات: * المعرّفات المتغيّرة التي تم حذفها لها معامل مقابل صفر. * يمكن أن تساوي قيم lineTerms.values صفرًا، ولكن هذا يؤدي إلى إهدار مساحة. |
quadraticTerms |
المصطلحات التربيعية في متغيرات القرار. بالإضافة إلى المتطلبات الخاصة برسائل SparseDoubleMatrixProto، نحن بحاجة إلى ما يلي: * يجب أن يكون كل عنصر من عناصر quadraticTerms.row_ids وكل عنصر فيها quadraticTerms.column_ids، عنصرًا من VariablesProto.ids. * يجب أن تكون المصفوفة مثلثة علوية: لكل i, quadraticTerms.row_ids[i] <= quadraticTerms.column_ids[i]. ملاحظات: * المصطلحات التي لم يتم تخزينها بشكل صريح تتضمّن مُعاملاً صفريًا. * يمكن أن تكون عناصر quadraticTerms.cotransactions صفرًا، ولكن هذا يؤدي إلى إهدار مساحة. |
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) الكاملة أقلBound <= التعبير <= upperBound.
في حال حذف متغيّر متضمن في هذا القيد (سواء المؤشر أو الذي يظهر في expression
)، سيتم التعامل معه كما لو تم ضبطه على صفر. على وجه الخصوص، يعني حذف متغير المؤشر أن قيد المؤشر يكون خاليًا إذا كان activateOnZero
خطأ، وأنه يعادل قيدًا خطيًا إذا كانت activateOnZero
true.
تمثيل 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
معلَمات للتحكّم في حل واحد.
يحتوي على كلتا المَعلمتَين المشتركتَين في جميع أدوات الحلّ، مثل timelimit، والمَعلمات الخاصة بأداة حل محدَّدة، مثل gcip. في حال ضبط قيمة في كل من الحقل الشائع والحقل الخاص بأداة الحلّ، يتم استخدام الإعداد الخاص بأداة الحلّ.
تشير المَعلمات الشائعة الاختيارية وغير المحدَّدة أو التعداد بدون تحديد قيمة إلى أنّه يتم استخدام الإعداد التلقائي لأداة الحلّ.
ويتم تجاهل المعلَمات الخاصة بأدوات الحلّ غير تلك المستخدَمة.
يتم تمرير المعلّمات التي تعتمد على النموذج (مثلاً، ضبط أولوية التشعّب لكل متغير) في ModelSolveParametersProto.
تمثيل JSON |
---|
{ "timeLimit": string, "enableOutput": boolean, "lpAlgorithm": enum ( |
الحقول | |
---|---|
timeLimit |
يشير ذلك إلى الحدّ الأقصى للوقت الذي يجب أن يقضيه الحلّ في حلّ المشكلة (أو غير محدود إذا لم يتم ضبط هذه الميزة). هذه القيمة ليست حدًا صارمًا، قد يتجاوز وقت الحل هذه القيمة قليلاً. يتم دائمًا تمرير هذه المَعلمة إلى أداة الحلّ الأساسية، ولا يتم استخدام الأداة التلقائية للحلّ. مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ " |
enableOutput |
يؤدي هذا الخيار إلى تفعيل طباعة آثار تنفيذ أداة الحلّ. ويعتمد موقع عمليات التتبُّع هذه على أداة الحلّ. بالنسبة إلى SCIP وGurobi، سيكون هذا هو مجموعات الإخراج العادية. بالنسبة إلى Glop وCP-SAT، سيؤدي ذلك إلى LOG(INFO). يُرجى العِلم أنّه إذا كانت أداة الحلّ توفّر إمكانية معاودة الاتصال بالرسالة وسجَّل المستخدم معاودة الاتصال بها، سيتم تجاهل قيمة المَعلمة هذه ولن تتم طباعة أي عمليات تتبُّع. |
lpAlgorithm |
يشير ذلك المصطلح إلى خوارزمية حل برنامج خطي. إذا كان LP_ALGORITHM_UNSPECIFIED، استخدِم الخوارزمية التلقائية لأداة الحلّ. بالنسبة إلى المسائل التي ليست برامج خطية ولكنها تكون فيها البرمجة الخطية روتينًا فرعيًا، يمكن أن تستخدم أدوات الحلّ هذه القيمة. على سبيل المثال، تستخدم أدوات حل MIP عادةً هذا لأسلوب LP الجذري (وتستخدم طريقة العرض المزدوج البسيط في الحالات الأخرى). |
presolve |
جهد لتبسيط المسألة قبل بدء الخوارزمية الرئيسية، أو مستوى الجهد الافتراضي لأداة الحلّ إذا وجدوا أن EVAL_UNSPECIFIED. |
cuts |
هناك الجهد المبذول في الحصول على مستوى أقوى للتخفيف من آثار LP (MIP فقط)، أو مستوى الجهد الافتراضي لأداة الحلّ في حالة LINK_UNSPECIFIED. ملاحظة: قد يؤدي إيقاف ميزة القطع إلى منع عمليات معاودة الاتصال من إضافة إمكانية إضافة اختصار في MIP_NODE، ولكن هذا السلوك مرتبط بأداة الحلّ. |
heuristics |
هناك جهد لإيجاد حلول مجدية تتجاوز تلك التي تتم مواجهتها في إجراء البحث الكامل (MIP فقط)، أو مستوى الجهد الافتراضي لأداة الحلّ في حالة ATTRIBUTE_UNSPECIFIED. |
scaling |
يبذل الجهد في تغيير نطاق المشكلة لتحسين الثبات العددي، أو مستوى الجهد الافتراضي لأداة الحلّ إذا لم تكن هذه القيمة LINK_UNSPECIFIED. |
iterationLimit |
تقييد التكرارات للخوارزمية الأساسية (على سبيل المثال، محورية بسيطة). يعتمد هذا السلوك المحدّد على أداة الحلّ والخوارزمية المستخدَمة، ولكن غالبًا ما يمكن أن يوفّر حدًا للحل (قد تكون هناك حاجة إلى ضبط إضافي، مثل سلسلة واحدة). تكون هذه الأدوات متوافقة عادةً مع أدوات حلّ مشاكل LP وQP وMIP، ولكن بالنسبة إلى أدوات حلّ MIP، يمكنك أيضًا الانتقال إلىNodelimit. |
nodeLimit |
يشير ذلك إلى الحد الأقصى لعدد المسائل الفرعية التي يتم حلها في البحث التعدادي (مثل الفرع والحدود). بالنسبة إلى العديد من أدوات الحلّ، يمكن استخدام هذه الطريقة لتحديد العمليات الحسابية بشكل حاسم (قد تكون هناك حاجة إلى ضبط إضافي، مثل سلسلة واحدة). بالنسبة إلى أدوات حلّ MIP، يمكنك أيضًا الاطّلاع على حدّ التكرار. |
cutoffLimit |
تتوقّف أداة الحلّ مبكرًا إذا تمكّنت من إثبات عدم توفّر حلول أولية، على الأقل هذه الحدود. في مرحلة مبكرة، تعرض أداة الحلّ سبب الإنهاء NO_SOLUTION_FOUND مع تحديد CUTOFF، وليس مطلوبًا منها تقديم أي معلومات إضافية عن الحلّ. ولن يكون لذلك أي تأثير في القيمة المعروضة في حال عدم التوقّف المبكر. يوصى باستخدام مقدار تفاوت إذا كنت تريد حلولاً بهدف تساوي تمامًا عرض القطع. يمكنك الاطّلاع على دليل المستخدم للحصول على مزيد من التفاصيل والمقارنة مع bestBoundlimited. |
objectiveLimit |
تتوقف أداة الحلّ في أقرب وقت عند العثور على حلّ بهذا الشكل على الأقل، مع إدراج سبب الإغلاق "مقبول" و"الحدّ من الهدف". |
bestBoundLimit |
تتوقف أداة الحلّ في أقرب وقت بعد أن تتأكّد من أنّ الحدّ الأفضل هو على الأقل هذا الحدّ، وذلك مع سبب الإغلاق FEASIBLE أو NO_SOLUTION_FOUND والحدّ الأقصى المسموح به. راجِع دليل المستخدم للاطّلاع على مزيد من التفاصيل والمقارنة مع حد أقصى نهائي. |
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, إعلان عشوائي)). |
absoluteGapTolerance |
مقياس تفاوت مثالي مطلق (في المقام الأول) لأدوات حل MIP. GAP المطلق هي القيمة المطلقة للفرق بين: * القيمة الموضوعية لأفضل حل عملي تم العثور عليه، * الحد المزدوج الناتج عن البحث. يمكن أن تتوقف أداة الحلّ عند بلوغ قيمة GAP المطلقة على الأكثر قيمة absoluteGapTolerance (عند ضبطها)، وتعرض القيمة TERMINATION_REASON_optIMAL. يجب أن تكون القيمة >= 0 في حال ضبطها. يمكنك أيضًا الاطّلاع على المقدار الذي يتناسب مع gapTolerance. |
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
مستوى الجهد الذي يتم تطبيقه على مهمة اختيارية أثناء الحل (انظر SolveParametersProto للاستخدام).
يتم استخدام التوكيد لضبط إعدادات أداة الحلّ على النحو التالي: * إذا لم تكن أداة الحلّ تتيح هذه الميزة، ستكون قيمة "UNSPECIFIED" فقط صالحة دائمًا، في حين يمثّل الإعداد الآخر عادةً خطأ في الوسيطة غير صالحة (قد تقبل بعض أدوات الحلّ أيضًا الإيقاف). * إذا كانت أداة الحلّ تتيح الميزة: - عند ضبط السياسة على UNSPECIFIED، يتم استخدام القيمة التلقائية الأساسية. - عندما يتعذر إيقاف تشغيل الميزة، سيعرض "إيقاف" رسالة خطأ. - إذا تم تفعيل الميزة تلقائيًا، يتم عادةً تعيين أداة الحلّ التلقائية على MEDIUM. - إذا كانت الميزة متوافقة، فلن تقدم الميزة أي أخطاء على الإطلاق، وهي "منخفضة" و"متوسطة" و"مرتفعة جدًا" و"مرتفعة جدًا" مطلقًا، وسيتم تعيينها إلى أفضل تطابق لها.
عمليات التعداد | |
---|---|
EMPHASIS_UNSPECIFIED |
|
EMPHASIS_OFF |
|
EMPHASIS_LOW |
|
EMPHASIS_MEDIUM |
|
EMPHASIS_HIGH |
|
EMPHASIS_VERY_HIGH |
ModelSolveParametersProto
تمثيل JSON |
---|
{ "variableValuesFilter": { object ( |
الحقول | |
---|---|
variableValuesFilter |
فلتر يتم تطبيقه على جميع الحاويات المتفرقة المعروضة والمحلية بمتغيرات في PrimalSolutionProto وPrimalSolutionProto (PrimalSolutionProto.variable_values، PrimalRayProto.variable_values). المتطلبات: * معرفات التصفية هي عناصر VariablesProto.ids. |
dualValuesFilter |
فلتر يتم تطبيقه على جميع الحاويات المتفرقة المعروضة والم الرئيسية بقيود خطية في DualSolutionProto وDualRay (DualSolutionProto.dual_values, DualRay.dual_values). المتطلبات: * أرقام التعريف المفلتَرة هي عناصر من LinearConstraints.ids. |
reducedCostsFilter |
فلتر يتم تطبيقه على جميع الحاويات المتفرقة المعروضة والمحلية بمتغيرات في DualSolutionProto وDualRay (DualSolutionProto.reduced_costs, DualRay.reduced_costs). المتطلبات: * معرفات التصفية هي عناصر VariablesProto.ids. |
initialBasis |
أساس اختياري مبدئي لأدوات حلّ LP بسيطة وسريعة التشغيل. في حال ضبطها، من المتوقّع أن تكون صالحة وفقًا لـ |
solutionHints[] |
تلميحات عن الحلول الاختيارية. إذا قبلت أداة الحلّ الأساسية تلميحًا واحدًا فقط، سيتم استخدام التلميح الأول. |
branchingPriorities |
أولويات التشعّب الاختيارية. سوف تتفرع المتغيرات ذات القيم الأعلى أولاً. تحصل المتغيرات التي لم يتم ضبط أولوياتها على الأولوية التلقائية لأداة الحلّ (عادةً ما تكون صفرًا). المتطلبات: * يجب أن تكون قيمة lineingpriities.values محدودة. * يجب أن تكون lineingPriorityities.ids ضمن عناصر VariablesProto.ids. |
SparseVectorFilterProto
تسمح هذه الرسالة بالاستعلام عن/ضبط أجزاء معينة من SparseXxxxVector. السلوك التلقائي هو عدم فلترة أي محتوى. الاستخدام الشائع هو الاستعلام عن أجزاء الحلول فقط (القيم غير الصفرية فقط و/أو مجموعة مختارة بعناية من قيم المتغيرات).
تمثيل JSON |
---|
{ "skipZeroValues": boolean, "filterByIds": boolean, "filteredIds": [ string ] } |
الحقول | |
---|---|
skipZeroValues |
بالنسبة إلى SpasesBoolVectorProto، فإن قيمة "zero" هي |
filterByIds |
عند الضبط على "صحيح"، يتم عرض القيم المقابلة لأرقام التعريف المدرَجة في معرّفات الكيانات المفلتَرة فقط. |
filteredIds[] |
قائمة المعرّفات المطلوب استخدامها عندما تكون قيمة filterByIds صحيحة. يجب أن يكون هذا الحقل فارغًا عندما تكون قيمة filterByIds خاطئة. ملاحظة: إذا كانت هذه السمة فارغة، وكانت قيمة filterByIds صحيحة، هذا يعني أنّك لا تريد تضمين أي معلومات في النتيجة. |
BasisProto
يشير ذلك المصطلح إلى وصف اتحادي لحلّ برنامج خطي.
تعرض الطريقة البسيطة لحل البرامج الخطية دائمًا "حلاً أساسيًا عمليًا" يمكن وصفه بشكل مجمّع باستخدام أساس. يعيّن الأساس BasisStatusProto لكل متغير وقيد خطي.
على سبيل المثال، ضع في الاعتبار نموذج LP: minc * 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 |
حالة أساس القيد. المتطلبات: * RestricttStatus.ids تبلغ قيمة LinearConstraints.ids. |
variableStatus |
حالة أساس متغير. المتطلبات: * idetStatus.ids تساوي VariablesProto.ids. |
basicDualFeasibility |
هذه ميزة متقدّمة تستخدمها شركة MathOpt لوصف جدوى حلول LP الأفضل (ستظل للحلول المثالية الحالة SOLUTION_STATUS_FEASIBLE). بالنسبة إلى LPs أحادية الاتجاه، يجب أن تكون مساوية لحالة الجدوى للحل الثنائي المرتبط. بالنسبة إلى LPs ذات الجانبين، قد يختلف الأمر في بعض الحالات الهامشية (على سبيل المثال، الحلول غير المكتملة باستخدام النظام الأساسي البسيط). إذا كنت تقدم أساسًا للبدء من خلال ModelSolveParametersProto.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 القائمة على النموذج الأولي أساسًا أوليًا إلى تلميح الحل (تحتاج إلى تبديل التلميح لتحويل التلميح إلى حل أساسي عملي بخلاف ذلك).
تمثيل JSON |
---|
{ "variableValues": { object ( |
الحقول | |
---|---|
variableValues |
يشير ذلك المصطلح إلى عملية تخصيص جزئية لقيم للمتغيرات الأساسية للمشكلة. في ما يلي المتطلبات المستقلة للحل لهذه الرسالة الفرعية: * المتغيرValues.ids هي عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم المتغيرValues.value محدودة. |
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[] |
تمثّل هذه السمة إرشادات التحسين الثنائي غير المحدود، أو شهادات عدم الإمكانية الأساسية المكافئة. يتم توفيره عادةً لسبب الإنهاء مهامProto INFEASIBLE. |
solveStats |
إحصاءات حول عملية الحل، مثل وقت التشغيل والتكرارات |
TerminationProto
جميع المعلومات المتعلقة بسبب إنهاء الاتصال إلى Solve().
تمثيل JSON |
---|
{ "reason": enum ( |
الحقول | |
---|---|
reason |
معلومات إضافية باللغة |
limit |
LIMIT_UNSPECIFIED ما لم يكن السبب TERMINATION_REASON_FEASIBLE أو TERMINATION_REASON_NO_SOLUTION_FOUND. لا يمكن لجميع أدوات الحلّ دائمًا تحديد الحد الذي تسبب في الإنهاء، ويتم استخدام LIMIT_UNDETERMINED في حالة تعذّر تحديد السبب. |
detail |
معلومات إضافية محدّدة عادةً عن أداة الحلّ حول إنهاء الاتفاقية |
problemStatus |
حالات الإمكانيات للمسائل الأولية والمزدوجة. اعتبارًا من 18 تموز (يوليو) 2023، قد تكون هذه الرسالة غير متوفّرة. في حال عدم توفّر المشكلة، يمكن العثور علىProblemStatus في SolveResultProto.solve_stats. |
objectiveBounds |
يقتصر على قيمة الهدف الأمثل. اعتبارًا من 18 تموز (يوليو) 2023، قد تكون هذه الرسالة غير متوفّرة. في حال عدم وجود هذه السمة، يمكن العثور على sampleBounds.primal_bound في SolveProto.solve.stats.best_primal_bound ويمكن العثور على objectBounds.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 |
المشكلة الرئيسية إما غير قابلة للتنفيذ أو غير محدودة. قد يتوفّر مزيد من التفاصيل حول حالة المشكلة فيresolveStats.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() في وقت مبكر باستخدام تسويةreasonProto FEASIBLE أو NO_SOLUTION_FOUND، يكون الحد المحدد الذي تم الوصول إليه.
عمليات التعداد | |
---|---|
LIMIT_UNSPECIFIED |
يتم استخدامها كقيمة فارغة عند الإنهاء وليس من حد (على سبيل المثال، 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 عندما يكون السبب معروفًا ولكن لا يتناسب مع أي من البدائل المذكورة أعلاه. قد يحتوي إنهاء Proto.detail على معلومات إضافية حول الحد. |
ProblemStatusProto
حالة الاحتمالية للمشكلة الأساسية وازدواجها (أو ازدواجية الاسترخاء المستمر) كما يدّعي برنامج الحلّ. ليس مطلوبًا من أداة الحلّ إرسال شهادة للمطالبة (على سبيل المثال، قد يدّعي أداة الحلّ المطالبة بالجدوى الأساسية بدون عرض حل مجدٍ ممكن). تقدّم هذه الحالة المجمّعة وصفًا شاملاً لادعاءات القائم بالحلّ حول إمكانية حلّ المشكلة التي تم حلها وعدم حدودها. على سبيل المثال:
- تشير الحالة الممكنة للمسائل الأولية والمزدوجة إلى أنّ المستوى الأولي ممكن ومحدود ومن المحتمل أن يكون له الحل الأمثل (مضمون للمشكلات بدون قيود غير خطية).
- الحالة الأساسية الممكنة، والحالة المزدوجة غير المستحيلة تشير إلى أن المشكلة الأساسية غير محدودة (أي أن لها حلول جيدة عشوائيًا).
لاحظ أن الحالة المزدوجة غير القابلة للتنفيذ في حد ذاتها (أي التي تكون مصحوبةً بالحالة الأولية غير المحددة) لا يعني أن المشكلة الأولية غير محدودة؛ لأنه يمكن أن يكون لدينا كلتا المشكلتين غير ممكنتين. وعلى الرغم من أنّ الحالة الأولية والمزدوجة قد تشير إلى توفّر الحلّ الأمثل، لا تضمنها أنّ أداة الحلّ قد عثرت على هذا الحل الأمثل.
تمثيل JSON |
---|
{ "primalStatus": enum ( |
الحقول | |
---|---|
primalStatus |
حالة المشكلة الأساسية |
dualStatus |
حالة المشكلة المزدوجة (أو لثنائيات الاسترخاء المستمر). |
primalOrDualInfeasible |
إذا كان الحلّ صحيحًا، يدّعي الحلّ أنّ المشكلة الأساسية أو المزدوجة غير قابلة للتنفيذ، ولكنّه لا يعرف أيًا منها (أو إذا كان كلاهما غير ممكن). يمكن أن يكون صحيحًا فقط عندما primal_problem_status = dual_problem_status = kUndetermined. غالبًا ما تكون هذه المعلومات الإضافية مطلوبة عندما تحدد المعالجة المسبقة أنه لا يوجد حل مثالي للمشكلة (ولكن لا يمكن تحديد ما إذا كان ذلك بسبب عدم التمكن أو عدم الحدود أو كليهما). |
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 |
يدّعي أداة الحلّ أنّ القيمة المُثلى تساوي أو أسوأ (أكبر من أجل تقليص القيمة وأصغر حجمًا للتكبير) من القيمة المزدوجة التي تصل إلى أداة الحلّ وفقًا للاحتمالية المزدوجة للقدرة على الحلّ (اطّلِع على التحذير أدناه): * تُعتبَر قيمة Dubound بسيطة (-inf لتصغيرها وتكبيرها) عندما لا يدّعي حلّ الحلّ أنّه لديه هذا الحدّ. على غرار primalBound، قد يحدث ذلك لبعض أدوات الحلّ حتى عند عرض القيمة المثلى. عادةً ما تُبلِغ أدوات حلّ MIP عن حدّ حتى إذا كان غير دقيق. * بالنسبة إلى المشكلات المستمرة، يمكن أن يكون DueBound أقرب إلى القيمة المثلى من هدف أفضل حل ثنائي ممكن. بالنسبة إلى MIP، فإن إحدى القيم الأولى غير البسيطة لـ DualBound غالبًا ما تكون القيمة المثلى لتخفيف LP لـ MIP. * يجب أن تكون قيمة DualBound أفضل (أصغر حجمًا للتصغير وأكبر لتكبيرها) من primalBound وصولاً إلى القيم المسموح بها للحلّ (اطّلِع على التحذير أدناه). تحذير: * بالنسبة إلى المسائل المستمرة، يكون الادّعاء الدقيق هو توفّر حل مزدوج: * ممكن رقميًا (أي ممكن حسب مقدار التفاوت في أدوات الحلّ)، و * يحتوي على قيمة موضوعية مزدوجة باوند. قد يكون هذا الحل الممكن من الناحية الرقمية غير ممكن إلى حد ما، وفي هذه الحالة يمكن أن يكون DueBound أسوأ تمامًا من القيمة المثلى وprimalBound. على غرار الحالة الأولية، فإن ترجمة مدى تفاوت دراسة الجدوى إلى مقدار تفاوت معيَّن على ثنائي باوند ليس أمرًا بسيطًا، خاصةً عندما يكون مقدار تفاوت الاحتمالية كبيرًا نسبيًا. ومع ذلك، توفِّر بعض أدوات الحلّ إصدارًا مصحّحًا من DualBound يمكن أن يكون أكثر أمانًا من الناحية الرقمية. يمكن الوصول إلى هذا الإصدار المصحَّح من خلال المُخرجات المحدّدة لأداة الحلّ (على سبيل المثال، ميزة PDLP وpdlp_output.convergence_information. corrected_dual_objective). * بالنسبة إلى أدوات حلّ مشاكل MIP، قد يتم ربط Dubound بحلّ ثنائي من أجل الاسترخاء المستمر (على سبيل المثال، الاسترخاء الناتج عن LP)، ولكن غالبًا ما يكون نتيجة معقّدة لتنفيذ أدوات الحلّ وتكون عادةً أكثر دقة من الحدود التي توفّرها أدوات الحلّ. |
SolutionProto
يعتمد ما يتم تضمينه في الحل على نوع المشكلة والحل. الأنماط الشائعة الحالية هي 1. لا تعرض أدوات حلّ MIP سوى الحل الأساسي. 2. غالبًا ما تُرجع أدوات حل LP البسيطة أساسًا والحلول الأولية والثنائية المرتبطة بهذا الأساس. 3- غالبًا ما تعرض أدوات الحلّ المستمرة الأخرى حلاً أوليًا وثنائيًا يتم ربطه بصيغة تعتمد على تلك الأداة.
المتطلبات: * يجب ضبط حقل واحد على الأقل، ولا يمكن أن يكون الحل فارغًا.
تمثيل JSON |
---|
{ "primalSolution": { object ( |
الحقول | |
---|---|
primalSolution |
|
dualSolution |
|
basis |
|
PrimalSolutionProto
حل لمشكلة في التحسين.
على سبيل المثال، ضع في الاعتبار برنامجًا خطيًا بسيطًا: الحد الأدنى c * x s.t. A * x >= b x >= 0. الحل الأساسي هو قيم التعيين إلى س. من الممكن تحقيقه إذا كانت تتوافق مع A * x >= b و x >= 0 من أعلاه. في الرسالة PrimalSolutionProto أدناه، تكون sortValues هي x و objectValue هي c * x.
تمثيل JSON |
---|
{ "variableValues": { object ( |
الحقول | |
---|---|
variableValues |
المتطلبات: * المتغيرValues.ids هي عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم المتغيرValues.value محدودة. |
objectiveValue |
القيمة الموضوعية وفقًا لحسابها من خلال أداة الحلّ الأساسية. لا يمكن أن تكون قيمة غير محدودة أو غير فارغة. |
auxiliaryObjectiveValues |
تمثّل هذه السمة القيم الهدف الإضافية التي يتم احتسابها من خلال أداة الحلّ الأساسية. يجب أن تكون المفاتيح أرقام تعريف أهداف إضافية صالحة. لا يمكن أن تكون القيم لانهائية أو NaN. عنصر يحتوي على قائمة من أزواج |
feasibilityStatus |
تشير هذه السمة إلى حالة إمكانية الحلّ وفقًا للأداة الأساسية. |
DualSolutionProto
حل للمعادلات المزدوجة لمشكلة التحسين.
على سبيل المثال، ضع في الاعتبار زوج البرنامج الخطي الثنائي الأساسي: (أساسي) (ثنائي) الحدّ الأدنى c * x max b * y s.t. A * x >= b s.t. y * A + r = c x >= 0 y, r >= 0. الحل الثنائي هو الزوج (y, r). ويمكن تحقيقه إذا استوفى القيود المفروضة من (ثنائي) أعلاه.
في الرسالة أدناه، ص هي DualValues، وr هي discountCosts، وb * y هي قيمة موضوعية.
تمثيل JSON |
---|
{ "dualValues": { object ( |
الحقول | |
---|---|
dualValues |
المتطلبات: * dualValues.ids هي عناصر من LinearConstraints.ids. * يجب أن تكون جميع قيم DualValues.value محدودة. |
reducedCosts |
المتطلبات: * minCosts.ids هي عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم shoppingCosts.values محدودة. |
feasibilityStatus |
تشير هذه السمة إلى حالة إمكانية الحلّ وفقًا للأداة الأساسية. |
objectiveValue |
|
PrimalRayProto
يشير ذلك المصطلح إلى اتجاه تحسين غير محدود لمشكلة تحسين، وهو ما يعادل ذلك شهادة عدم الجدوى لمضاعفة مشكلة التحسين.
على سبيل المثال، ضع في الاعتبار برنامجًا خطيًا بسيطًا: min c * x s.t. A * x >= b x >= 0 A primal ray هو x الذي يفي بـ: c * x < 0 A * x >= 0 x >= 0 لاحظ أنه إذا أعطينا حلاً لا يزال قابلاً للتطبيق، فإن أي مضاعف موجب لـ Primal حصل، كما يثبت الشعاع الأولي أن مشكلة التحسين المزدوج غير مجدية.
في رسالة PrimalRay أدناه، تكون valueValues هي x.
تمثيل JSON |
---|
{
"variableValues": {
object ( |
الحقول | |
---|---|
variableValues |
المتطلبات: * المتغيرValues.ids هي عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم المتغيرValues.value محدودة. |
DualRayProto
يشير ذلك المصطلح إلى توجيه تحسين غير محدود إلى ثنائي تحسين أو مشكلة، أي شهادة عدم جدوى أساسية.
على سبيل المثال، ضع في الاعتبار زوج البرنامج الخطي الثنائي الأساسي: (أساسي) (ثنائي) الحدّ الأدنى 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 هي shoppingCosts.
تمثيل JSON |
---|
{ "dualValues": { object ( |
الحقول | |
---|---|
dualValues |
المتطلبات: * dualValues.ids هي عناصر من LinearConstraints.ids. * يجب أن تكون جميع قيم DualValues.value محدودة. |
reducedCosts |
المتطلبات: * minCosts.ids هي عناصر من VariablesProto.ids. * يجب أن تكون جميع قيم shoppingCosts.values محدودة. |
SolveStatsProto
تمثيل JSON |
---|
{
"solveTime": string,
"problemStatus": {
object ( |
الحقول | |
---|---|
solveTime |
الوقت المنقضي على الحائط كما تم قياسه باستخدامMath_opt، وهو الوقت التقريبي داخل Solver::Solve(). ملاحظة: لا يشمل ذلك العمل المنجز في إنشاء النموذج. مدة بالثواني يصل عددها إلى تسعة أرقام كسرية وتنتهي بـ " |
problemStatus |
حالات الإمكانيات للمسائل الأولية والمزدوجة. |
simplexIterations |
|
barrierIterations |
|
firstOrderIterations |
|
nodeCount |
|