北京联合大学
实验报告
项目名称: 运筹学专题实验报告 学 院: 自动化 专 业: 物流工程 班 级: 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] 点击运行得如下图: