سؤال

ابحث عن المتجه X الذي يقلل C. X خاضع للقيود م. x> = b ، x integer.

إليك مجموعة إدخال عينة:

c : {1,2,3}
m : {{1,0,0},
     {0,1,0},
     {1,0,1}}
b : {1,1,1}

مع الإخراج:

x = {1,1,0}

ما هي الأدوات الجيدة لحل هذا النوع من المشكلة ، وأمثلة على كيفية استخدامها؟

هل كانت مفيدة؟

المحلول

الرياضيات

Mathematica لديه هذا مدمج في. (NB: Mathematica ليس برنامجًا مجانيًا.)

LinearProgramming[c, m, b, Automatic, Integers]

المخرجات:

{1, 1, 0}

نصائح أخرى

GLPK

أنا أقدم إجابة باستخدام GLPK's GLPSOL, ، لكنني آمل أن تكون هناك طرق أفضل بكثير للقيام بذلك (يبدو أن GLPK قوي/عام للغاية لهذا النوع من الحالة الخاصة البسيطة لمشكلة البرمجة الخطية):

من أجل إنشاء ملف .mps الوارد أدناه ، يجب عليك تقسيم المصفوفات الخاصة بك إلى نظام من المعادلات ، وبالتالي يصبح وصف المشكلة:

minimize

cost = 1 x_1 + 2 x_2 + 3 x_3

s.t. constraints:

S1 = 1 x_1 + 0 x_2 + 0 x_3
S2 = 0 x_1 + 1 x_2 + 0 x_3
S3 = 1 x_1 + 0 x_2 + 1 x_3

S1 >= 1
S2 >= 1
S3 >= 1

0 <= x1 <= 1
0 <= x2 <= 1
0 <= x3 <= 1

وثائق GLPK لديه معلومات مفصلة عن تنسيق .mps ، لكنك تحدد الصفوف والأعمدة و RHS والحدود. في قسم الصفوف ، حدد "N" و "G" نوع القيد (الرقم ، وأكبر من على التوالي). في قسم الحدود ، يحدد "واجهة المستخدم" أن الحدود عدد صحيح علوي اكتب ، إجبار الحل على أن يكون صحيحًا.

لتشغيل المحاليل على مواصفات المشكلة:

> glpsol --freemps example.mps -o example.out

ملف example.mps:

NAME          VM
ROWS
 N cost
 G S1
 G S2
 G S3
COLUMNS
 x_1    cost    1.0
 x_1    S1      1.0
 x_1    S3      1.0
 x_2    cost    2.0
 x_2    S2      1.0
 x_3    cost    3.0
 x_3    S3      1.0
RHS 
 RHS1 cost   0.0
 RHS1 S1     1.0
 RHS1 S2     1.0
 RHS1 S3     1.0
BOUNDS
 UI BND1 x_1 1.0
 UI BND1 x_2 1.0
 UI BND1 x_3 1.0
ENDATA

المخرجات:

Problem:    VM
Rows:       4
Columns:    3 (3 integer, 3 binary)
Non-zeros:  7
Status:     INTEGER OPTIMAL
Objective:  cost = 3 (MINimum)

   No.   Row name        Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 cost                        3
     2 S1                          1             1
     3 S2                          1             1
     4 S3                          1             1

   No. Column name       Activity     Lower bound   Upper bound
------ ------------    ------------- ------------- -------------
     1 x_1          *              1             0             1
     2 x_2          *              1             0             1
     3 x_3          *              0             0             1

Integer feasibility conditions:

INT.PE: max.abs.err. = 0.00e+00 on row 0
        max.rel.err. = 0.00e+00 on row 0
        High quality

INT.PB: max.abs.err. = 0.00e+00 on row 0
        max.rel.err. = 0.00e+00 on row 0
        High quality

End of output

أيضًا ، لست واضحًا حول كيفية الحصول مباشرة على متجه X الذي يحل المشكلة ، على الرغم من ترميزه في الإخراج أعلاه في هذا القسم:

  No. Column name       Activity     
------ ------------    ------------- 
     1 x_1          *              1 
     2 x_2          *              1 
     3 x_3          *              0  

لقد حددت مشكلة برمجة عدد صحيح نقي. تتضمن معظم التطبيقات العملية عادة ما يسمى برمجة عدد صحيح مختلط حيث تكون بعض المتغيرات فقط عدد صحيح. يمكن العثور على برنامج تعليمي ومقال موجز حول هذا الموضوع:

http://mat.gsia.cmu.edu/orclass/integer/integer.html

تقنيات الحلول النموذجية لمشاكل IP هي البرمجة الديناميكية أو الفرع والمرتبطة. يجب أن يساعدك البحث في هذه الشروط في العثور على بعض الكود المجاني أو المشكلات أو الشفرة الأكاديمية.

حظا طيبا وفقك الله

بيثون: لب

يمكن أيضًا حل هذا النوع من المشكلات البسيطة باستخدام تقنية تسمى برمجة القيد. يمكنك العثور على مزيد من التفاصيل حول التقنية والمحللون المجانيين والتجاريين المتاحة لحل هذه المشكلات من مقابلة دخول ويكيبيديا. إذا كانت المشكلات التي تنطوي على متغيرات عدد صحيح أكثر تعقيدًا مما ذكرته ، فمن الأفضل أن تنظر في حلول البرمجة الخطية/البرمجة الصحيح للأغراض العامة (مثل GLPK). هناك مجموعة منهم ، بعض الأسماء هي: LPSOLVE (مجاني) ، IBM ILOG CPLEX (تجاري).

أنا أستخدم Python & Pyomo. هناك نظرة عامة جيدة على المزايا على موقع المشروع: http://www.pyomo.org

هنالك سؤال مماثل على scicomp.stackexchange.com وإجابة تسرد بعض المكتبات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top