请帮助我解决这个问题
我有完全单模块矩阵A乘以二进制变量X的集合。
表示A * X <= B
如何在多项式时间内解决这个问题。我有兴趣找到一个可行的解决方案。
例如我有:
A= [ 1 1 1 0 0 0 0 0 ;
0 0 1 1 1 1 0 0 ;
0 0 0 0 1 1 1 1 ;
1 1 1 1 1 0 0 0 ;
0 0 0 0 0 1 1 1 ;
-1 -1 -1 -1 0 0 0 0 ;
0 -1 -1 -1 -1 0 0 0 ;
0 0 0 -1 -1 -1 -1 0 ;
0 0 0 0 0 -1 -1 -1 ];
B= [ 2 ; 2; 2; 3; 2;-3;-3;-2;-2];
答案 0 :(得分:0)
这可以通过优化工具箱中的bintprog
(二进制整数编程)轻松解决:
x = bintprog(ones(size(A,2),1),A,b)
返回
x =
0
1
1
1
0
0
1
1
您可以轻松确认A*x
收益b
。当然,并不能保证这是唯一的解决方案。有关bintprog
算法和调整选项的更多信息,请参阅this article。根据{{3}},bintprog
所基于的分支定界方法可能具有多项式时间复杂度。
此外,正如@thewaywewalk指出的那样,this Wikipedia page也可以被利用:
x = lsqlin(A,b,A,b,[],[],zeros(size(A,2),1),ones(size(A,2),1))