线性规划的求解算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性规划的求解算法
线性规划(linear programming )是运筹学中的一个重要分支,在现代工业、
农业、商业、交通运输、国防军事及经济管理等诸多领域都有着广泛重要的应用。在数学系的竞赛数学建模中,也多次应用线性规划来建模从而解决实际问题。在这里介绍单纯性法和对偶单纯形法两种求解线性规划的方法。
一、单纯形法算法主体思想 标准线性规划简记如下:
LP-max LP-min s.t {
0Ax b x =≥ s.t {0
Ax b
x =≥ 这里只以LP-min 为例。
1、算法思想
单纯形法是在已知一个可行基的前提下采用的解决线性规划的算法。步骤
如下:
(1)输入初始矩阵:0102
0,111121,112
,1n n m m m n a a a a a a a a a +++⎡⎤⎢⎥⎢
⎥
⎢
⎥⎢
⎥⎣⎦
,并化为典则形式。 用R (i )记录单位矩阵I 中元素1的位置。
(2)求{}0min
|0,1j
j a
j n t >≤≤
若t 不存在,则得到最优解;(i),1R i n x a += (i=1,2,...m ).其他j x =0,
停。否则,转到(3)。
(3)求,1
min{|0,1}i n it it
a a i m a λ+>≤≤。 若
λ不存在,则
LP-min 无下届,所以无最优解,停;否则,求
,1min (i)|,0,1(s)i n it it a R a i m R a λ+⎧⎫
=>≤≤⎨⎬
⎩⎭
,转到(4)。
(4)sj
sj st
a a a ⇐,(j=1,2....n+1)
ij
ij sj it a a a a ⇐-,(i=0,1,2...m;i ≠s;j=1,2,....,n+1),
(s)t R ⇐,转到(2).
二、对偶单纯形法
对偶单纯形法是在已知一个正则基的条件下的求解线性规划的方法。步骤如下:
(1)输入初始矩阵:0102
0,111121,112
,1n n m m m n a a a a a a a a a +++⎡⎤⎢⎥⎢
⎥
⎢
⎥⎢
⎥⎣⎦
,并化为典则形式。 用R (i )记录单位矩阵I 中元素1的位置。
(2)求{}0min
|0,1j
j a
j n s >≤≤
若s 不存在,则得到最优解;(i),1R i n x a += (i=1,2,...m ).其他j x =0,
停。否则,转到(3)。
(3)求,1
min{|0,1}i n it it
a a i m a λ+<≤≤。 若
λ不存在,则
LP-min 无下届,所以无最优解,停;否则,求
,1min (i)|,0,1(s)i n it it a R a i m R a λ+⎧⎫
=>≤≤⎨⎬
⎩⎭
,转到(4)。
(4)
sj
sj
st
a
a
a
⇐,(j=1,2....n+1)
ij ij sj it
a a a a
⇐-,(i=0,1,2...m;i≠s;j=1,2,....,n+1), (s)t
R⇐,转到(2).
三、程序代码
1、单纯形法。
% 求解标准型线性规划:max c*x; s.t. A*x=b;x>=0
%A1是标准系数矩阵及最后一列是资源向量,C是目标函数的系数向量
% N是(初始的)基变量的下标
%M=10000 人工变量系数
% 本函数中的A是单纯形表,包括:最后一行是初始的检验数,最后一列是资源向量b %c1是基变量系数
%输出变量sol是最优解
%输出变量val是最优值,k是迭代次数
%flag1的值代表有无最优解,0无界解,1无可行解,2无穷多解,3唯一最优解
function [sol,val,k,flag1]=ssimplex(A1,C,N)
M=10000;
[mA1,nA1]=size(A1);
C1=[C,0];
val=zeros(1,length(C));
for i=1:length(N)
c1(i)=C1(N(i));
end
for i=1:nA1
a(i)=C1(i)-c1*A1(:,i);%计算初始检验数
end
A=[A1;a]; %构造初始单纯形表
[mA,nA]=size(A);
k=0; % 迭代次数
flag=1;
while flag
for i=1:(nA-1)
if A(mA,i)<=0
flag=0;
else
flag=1;
break;
end
end
if flag==0 % 已找到最优解
val1=A(1:(mA-1),nA)';
for i=1:length(N)
if (val1(i)~=0&&abs(C(N(i)))==M)
disp('无可行解');
sol=inf;val=inf;
flag3=0;
flag1=1;
break;
else
flag3=1;
end
end
if flag3
if length(find(A(mA,1:(nA-1))==0))>length(N) disp('存在无穷多最优解');
flag1=2;
else
disp('存在最优解');
flag1=3;
end
sol=c1*val1';
end
elseif flag==1
for j=1:(mA-1)
if A(j,i)<=0
flag2=1;
else
flag2=0;break;
end
end
if flag==1&&flag2==1
disp('此线性规划问题存在无界解');
sol=inf;
val=inf;
flag1=0;
flag=0; %跳出while循环
break;
end
maxq=max(A(mA,1:(nA-1)));
[m,nb]=find(A(mA,:)==maxq); %确定入基变量的纵坐标