整数线性编程:示例和好工具?

时间:2009-12-28 17:56:41

标签: mathematical-optimization linear-programming

找到最小化c的向量x。 x受约束条件m。 x> = b,x整数。

以下是一个示例输入集:

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

输出:

x = {1,1,0}

什么是解决此类问题的好工具,以及如何使用它们的示例?

7 个答案:

答案 0 :(得分:4)

<强> 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 documentation包含.mps格式的详细信息,但您指定了行,列,rh和边界。在ROWS部分中,'N'和'G'指定约束的类型(数字,分别大于)。在BOUNDS部分中,'UI'指定边界是上整数类型,强制解为整数。

在问题规范上运行求解器:

> 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  

答案 1 :(得分:2)

您已指定纯整数编程问题。大多数实际应用程序通常涉及所谓的混合整数编程,其中只有一些变量是整数。一个相当简洁的教程&amp;关于这个问题的论文可以在这里找到:

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

IP问题的典型解决方案技术是动态编程或分支绑定。搜索这些条款应该可以帮助您找到一些免费软件,共享软件或学术代码。

祝你好运

答案 2 :(得分:1)

数学

Mathematica内置了这个。(注意:Mathematica不是免费软件。)

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

输出:

{1, 1, 0}

答案 3 :(得分:1)

Python:PULP

答案 4 :(得分:1)

这些类型的简单问题也可以使用称为约束编程的技术来解决。您可以从corresponding wikipedia entry找到有关该技术的更多详细信息以及可用于解决这些问题的免费和商业解算器。 如果涉及整数变量的问题比你提到的更复杂,最好考虑通用线性编程/整数编程求解器(如GLPK)。其中有一堆,一些名称是:LPSOLVE(免费),IBM ILOG CPLEX(商业)。

答案 5 :(得分:1)

我正在使用Python&amp; Pyomo。对项目网站的优势有一个很好的概述:http://www.pyomo.org

答案 6 :(得分:0)

scicomp.stackexchange.com上有a similar question,答案列出了几个库。