实验二:MATLAB编程单纯形法求解

北京联合大学

实验报告

项目名称: 运筹学专题实验报告 学 院: 自动化 专 业: 物流工程 班 级: 1201B 学 号:20

姓 名: 管水城 成 绩:

2015 年 5 月 6 日

实验二:MATLAB编程单纯形法求解

一、实验目的:

(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C或VB)语言进行程序设计中一些常用方法。

(2)使学生对线性规划的单纯形法有更深的理解. 二、实验用仪器设备、器材或软件环境 计算机, Matlab R2006

三、算法步骤、计算框图、计算程序等

本实验主要编写如下线性规划问题的计算程序:

mincx?Ax?b s.t.??x?0,b?0其中初始可行基为松弛变量对应的列组成. 对于一般标准线性规划问题:

mincx?Ax?b s.t.??x?0,b?01.求解上述一般标准线性规划的单纯形算法(修正)步骤如下:

对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。设初始基为B,然后执行如下步骤: (1).解

BxB?b?1x?Bb,令xN?0,计算目标函数值f?cBxB B,求得

以bi(i?1,2,...,m)记B?1b的第i个分量

(2).计算单纯形乘子w,

wB?CB?1w?CBB,得到,对于非基变量,计算判别数

?1?i?zi?ci?cBB?1pi?ci,可直接计算??cBBA?c令 ?k?max{i?R?},R为非基变量集合

若判别数?k?0 ,则得到一个最优基本可行解,运算结束;否则,转到下一步 (3).解

Byk?pk?1y?Bpk;若yk?0,即yk的每个分量均非正数, k,得到

则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使

bryrk?min?t:ytk?0btytk,且ytk?0?xB为离基变量,r

;

xk为进基变量,用pk替换pBr,得到新的基矩阵B,还回步骤(1)2、计算框图为:

开始 初始可行基B x?B?1b,x?0,f?cx 令BNBB

计算单纯性乘子w?cBB?1,计算判别数?j?wpj?cj,j?R(非基变量)令?k?max{?j,j?R}

?k?0是 ? 否 得到最优

解方程Byk?pk,得到yk?B?1pk,

是 yk?0? 否 不存在有限

确定下标r,使得 ?b?br?min?i|yik?0? yrk?yik?

xBr为退基变量,xk进基变量,以pk代替pBr,得到新的基矩阵B

图1

3.计算程序(Matlab):

A=input('A=');

b=input('b=');

c=input('c=');

format rat %可以让结果用分数输出 [m,n]=size(A);

E=1:m;E=E'; F=n-m+1:n;F=F';

D=[E,F]; %创建一个一一映射,为了结果能够标准输出 X=zeros(1,n); %初始化X

if(n

flag=1;

B=A(:,n-m+1:n); %找基矩阵

cB=c(n-m+1:n); %基矩阵对应目标值的c while flag

w=cB/B; %计算单纯形乘子,cB/B=cB*inv(B),用cB/B的目的是,为了提高运行速度。。

panbieshu=w*A-c %计算判别数,后面没有加分号,就是为了计算后能够显示出来。。 [z,k]=max(panbieshu); % k作为进基变量下标 。。 fprintf('b''./(B\\\\A(:,%d))为',k); b'./(B\\A(:,k)) if(z<

flag=0; %所有判别数都小于0时达到最优解。。 fprintf(' 已找到最优解!\\n'); xB=(B\\b')'; f=cB*xB'; for i=1:n mark=0; for j=1:m

if (D(j,2)==i) mark=1;

X(i)=xB(D(j,1)); %利用D找出xB与X之间的关系。。 end end

if mark==0

X(i)=0; %如果D中没有X(i),则X(i)为非基变量,所以X(i)=0。。 end end

fprintf('基向量为:'); X

fprintf('目标函数值为:') ; f else

if(B\\A(:,k)<=0) % 如果B\\A(;,k)中的每一个分量都小于零。。 flag=0;

fprintf(' \\n 此问题不存在最优解!\\n'); %若B\\A(:,k)的第k列均不大于

0,则该问题不存在最优解。。 else

b1=B\\b'; temp=inf; for i=1:m

if ((A(i,k)>0) && (b1(i)/(A(i,k)+eps))

end end

fprintf('x(%d)进基,x(%d)退基\\n',k,D(r,2)); %显示进基变量和退基变量 B(:,r)=A(:,k);

cB(r)=c(k); %确定进基退基变量后,相应的基矩阵及新基对应的目标值的c也相应改变

D(r,2)=k; %改变D中的映射关系 end end end end

程序保存为 文件

四.数值实验及其结果:

打开matlab软件,点击运行,出现命令符要求输入相应矩阵命令。 1. 求解:

输入数据矩阵如下:

A=[9 4 1 0 0;4 5 0 1 0;3 10 0 0 1] b=[360 200 300] c=[-7 -12 0 0 0]

点击运行得如下图:

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4