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

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

点击运行得如下图:

相关文档
最新文档