在Matlab中返回linprog的输出作为稀疏向量

时间:2018-04-09 15:08:07

标签: matlab linear-programming

我在Matlab中使用mu=linprog(f,A,b, Aeq, beq)A,b, Aeq, beq作为稀疏矩阵传递,因为它们很大,例如,A具有维度2000 x 2000

Matlab没有给我任何内存错误,但运行线性编程需要很长时间(正如预期的那样,考虑到大尺寸)。

我注意到的一件事是,尽管我将A,b, Aeq, beq作为稀疏传递,但输出mu作为非稀疏返回。将mu作为稀疏向量返回有助于节省一些时间(和内存)吗?为什么linprog不这样做?我怎么能修改linprog来强迫它?

这是我的具体示例(您可以看到,通过约束,mu的每个元素都是01mu稀疏)

n_m=10;
n_w=15;
C=n_m*n_w+n_m+n_w;

%Inequalities A*mu<=b
b=sparse(C,1);
i=1:1:C;
v1=-ones(1,C);
A=sparse(i,i,v1,C,C);


%Equalities Aeq*mu=beq

row1=kron(1:1:n_m, ones(1,n_w+1)); 
temp=zeros(n_w+1, n_m);
for i=1:n_m
    temp(:,i)=(i:n_m:n_m*n_w+i).'; 
end
column1=temp(:).'; 
v1=ones(1,n_m*n_w+n_m);
Aeqmen=sparse(row1, column1, v1, n_m, C); 


row2=kron(1:1:n_w, ones(1,n_m+1)); 
temp=zeros(n_m+1,n_w);
for j=1:n_w
    temp(:,j)=[(j-1)*n_m+1:j*n_m n_m*n_w+n_m+j].';
end
column2=temp(:).'; 
v2=ones(1,n_m*n_w+n_w);
Aeqwomen=sparse(row2, column2, v2, n_w, C); 

Aeq=[Aeqmen; Aeqwomen]; 
beq=ones(n_m+n_w,1); 

%Objective function
f=-(randn(n_m*n_w+n_m+n_w,1));  %Cx1

%LP
mu= linprog(f,A,b, Aeq, beq); %Cx1

修改 感谢下面的一些评论/答案,我发现对于我的具体示例intlinproglinprog快得多。这可以通过运行它来看到:

clear
N=100:100:500;
mu1=cell(size(N,2),1);
mu2=cell(size(N,2),1);
rng default

for n=1:size(N,2)
n_m=N(n);
n_w=N(n);
C=n_m*n_w+n_m+n_w;

%Inequalities A*mu<=b
b=zeros(C,1);
i=1:1:C;
v1=-ones(1,C);
A=sparse(i,i,v1,C,C);


%Equalities Aeq*mu=beq
row1=kron(1:1:n_m, ones(1,n_w+1)); 
temp=zeros(n_w+1, n_m);
for i=1:n_m
    temp(:,i)=(i:n_m:n_m*n_w+i).'; 
end
column1=temp(:).'; 
v1=ones(1,n_m*n_w+n_m);
Aeqmen=sparse(row1, column1, v1, n_m, C); 

row2=kron(1:1:n_w, ones(1,n_m+1)); 
temp=zeros(n_m+1,n_w);
for j=1:n_w
    temp(:,j)=[(j-1)*n_m+1:j*n_m n_m*n_w+n_m+j].';
end
column2=temp(:).'; 
v2=ones(1,n_m*n_w+n_w);
Aeqwomen=sparse(row2, column2, v2, n_w, C); 

Aeq=[Aeqmen; Aeqwomen]; 
beq=ones(n_m+n_w,1); 

%Objective function
f=-(randn(n_m*n_w+n_m+n_w,1));  %Cx1

%Intcon
intcon=1:1:C; 

tic
mu1{n}= linprog(f,A,b, Aeq, beq); %Cx1
toc
tic
mu2{n}= intlinprog(f,intcon,A,b, Aeq, beq); %Cx1
toc
end

2 个答案:

答案 0 :(得分:0)

具有稀疏矩阵的方程组(Ax = b或变量)的结果不需要(并且在绝大多数情况下不是)稀疏的。

E.g。

  • 有限元方法(系统矩阵稀疏,但是 潜在的物理结果通常不是)
  • 大多数类型的断层扫描

答案 1 :(得分:0)

虽然在线性规划公式中,平等和不等式约束的典型特征是稀疏的,但这并不一定意味着所得到的解决方案将是稀疏的(实际上,通常它不会用于LP,除非限制特别要求它)。

如果整数约束将大量输出强制为零(例如,如果你有很多约束为&lt; = 1的决策变量,那么在MIP中看到稀疏填充的解决方案可能更常见对总容量的耦合约束,这可能要求绝大多数决策变量都精确为零)。在等效的LP(也称为&#34;松弛&#34; MIP问题,因为LP有效地放宽了整数约束),你更有可能获得许多小的非整数值用于决策变量

函数linprog是Matlab提供的优化包中的一个函数,因此你不太可能直接修改它(这可能不是一个好主意)。

您可能希望检查结果以找出有多少输出正好为零 - 这可以告诉您稀疏解决方案是否存在于此问题的卡中:

% Total number of entries that are nonzero
nnz(D)
% Density of the matrix relative to total number of elements
nnz(D)/prod(size(D))