我在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
的每个元素都是0
或1
且mu
稀疏)
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
修改
感谢下面的一些评论/答案,我发现对于我的具体示例,intlinprog
比linprog
快得多。这可以通过运行它来看到:
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
答案 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))