实验二:MATLAB编程单纯形法求解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京联合大学
实验报告
项目名称:运筹学专题实验报告
学院:自动化专业:物流工程
班级: 1201B 学号:************* 姓名:管水城成绩:
2015 年 5 月 6 日
实验二:MATLAB 编程单纯形法求解
一、实验目的:
(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C 或VB)语言进行程序设计中一些常用方法。
(2)使学生对线性规划的单纯形法有更深的理解. 二、实验用仪器设备、器材或软件环境 计算机, Matlab R2006
三、算法步骤、计算框图、计算程序等
本实验主要编写如下线性规划问题的计算程序:
⎩⎨
⎧≥≥≤0
,0..min b x b Ax t s cx 其中初始可行基为松弛变量对应的列组成. 对于一般标准线性规划问题:
⎩⎨
⎧≥≥=0
,0..min b x b Ax t s cx 1.求解上述一般标准线性规划的单纯形算法(修正)步骤如下:
对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。设初始基为B,然后执行如下步骤: (1).解
B Bx b
=,求得
1
B x B b -=,0,N B B x f c x ==令计算目标函数值 1(1,2,...,)i m B b i -=i 以b 记的第个分量
(2).计算单纯形乘子w,
B
wB C =,得到1
B w
C B -=,对于非基变量,计算判别
数1i i i B i i z c c B p c σ-=-=-,可直接计算σ
=1
B A c c B --令
max{
}k i R
σσ
∈=,R 为非基变量集合
若判别数0k σ≤ ,则得到一个最优基本可行解,运算结束;否则,转到下一步 (3).解
k k
By p =,得到
1
k k y B p -=;若0k y ≤,即k y 的每个分量均非正数, 则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使
{
}:0
min ,0
t r
rk
tk
tk b b tk y y t y y >=>且r
B x 为离基变量,
,r k B x p k 为进基变量,用p 替换得到新的基矩阵B,还回步骤(1)
;
2、计算框图为:
图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 fprintf('不符合要求需引入松弛变量') flag=0; else 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<0.000000001) 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)) r=i; 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 程序保存为danchunxin.m文件 四.数值实验及其结果: 打开matlab软件,点击运行danchunxin.m,出现命令符要求输入相应矩阵命令。 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] 点击运行得如下图: