找到最小化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}
什么是解决此类问题的好工具,以及如何使用它们的示例?
答案 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,答案列出了几个库。