线性规划的求解算法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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); %确定入基变量的纵坐标

相关文档
最新文档