Matlab优化设计及其应用
上QQ阅读APP看书,第一时间看更新

2.3 单纯形法的Matlab程序及实例

应用单纯形法手工求解线性规划问题不但计算量大,且易出错,不适于较多变量的求解,应用计算机进行求解则方便快捷。Matlab提供了求解线性规划问题的函数linprog(),下面根据单纯形法的计算步骤,给出适于学习用的单纯形法程序。

程序清单如下:

function[x,fmax]=linear_pro_max(cf,cb,A,b,indexb1)

n=length(cf);

max_sigma=1;

m=length(cb);

indexb=indexb1;

theta=zeros(size(m,1));

while max_sigma>0

forj=1:n

sigma(j)=cf(j)-sum(cb(:).*A(:,j));

end

max_sigma=max(sigma);

if(max_sigma>0)

pvj=find(sigma==max_sigma);

theta=b./A(:,pvj);

min_theta=min(theta);

max_sigma

min_theta

pvi=find(theta==min_theta);

cb(pvi)=cf(pvj);

indexb(pvi)=pvj;

pvi

pvj

cb

cf

for i=1:m

if(i~=pvi)

forj=1:n

AA(i,j)=A(i,j)-A(i,pvj)*A(pvi,j)/A(pvi,pvj);

end

bb(i)=b(i)-A(i,pvj)*b(pvi)/A(pvi,pvj);

else

AA(i,:)=A(i,:)/A(pvi,pvj);

bb(i)=b(i)/A(pvi,pvj);

end

end

end

A=AA;b=bb';

end

s=1:n;

x=zeros(n,1);

for i=1:m

k=find(s==indexb(i));

if(k~=0)

x(k)=b(i);

end

end

fmax=cf*x;

【例2-3】 用单纯形法Matlab程序求解【例1-1】。

:为方便起见,重新列出所给问题线性规划的标准形:

maxf(x)=220x1+250x2+0x3+0x4+0x5+0x6

s.t.x1+x2+x3=1200

2x1+x2+x4=1800

x1+x5=800

x2+x6=1000

xj≥0,j=1,2,…,6

编写用户程序。cf为目标函数中变量系数行向量;cb为初选基变量行向量;indexb1为初始基变量下标索引;A为等式约束方程系数矩阵;b为等式约束方程右端项。应户程序为:

function linear_pro_max_test1

clc

clear all;

cf=[220 250 0 0 0 0];

cb=[cf(3),cf(4),cf(5),cf(6)];

indexb1=[3456];

A=[1 1 1 0 0 0

 2 1 0 1 0 0

 1 0 0 0 1 0

 0 1 0 0 0 1];

b=[1200;1800;800;1000];

[x,fmax]=linear_pro_max(cf,cb,A,b,indexb1)

计算结果为:

x=[200 1000]。

习题

1.某工厂需要A、B、C三种规格的钢板,现有两种尺寸不同的钢板原材,每张钢板可同时截得三种规格的小钢板的块数如下表所示:

现需要A、B、C三种规格的成品分别为15、18、27块,问最多需要两种钢板各多少张可得所需三种规格的成品?

2.求解线性规划问题。

minz=6x1+4x2

s.t.2x1+x2≥1

3x1+4x2≥1.5

x1,x2≥0

3.用Matlab程序求解下列线性规划问题。

minz=2x1+3x2+x3

s.t.x1+4x2+2x3≥8

3x1+2x2≥6

x1,x2,x3≥0