班级:数电四班姓名:刘文搏学号:
一、 实验目的。
运用matlab程序设计语言完成单纯性算法求解线性规划问题。
二、 实验内容。
编写一个matlab的函数文件:用于求解标准形的线性规划问题:
min f=c*x subject to :a*x=b ; x>=0;
1、 函数基本调用形式:[x,minf,optmatrx,flag]=linp(a,b,c)
2、 参数介绍:
a:线性规划问题的约束a*x=b且x>=0中变量的系数组成的矩阵,是一个m*n的矩阵。
c :线性规划问题的目标函数f=c*x中各变量的系数向量,是一个n维的行。
向量。b :线性规划问题的约束a*x=b且x>=0中的常数向量,是一个m维的列。
向量。x :输出线性规划问题的最优解,当线性规划问题没有可行解或有可行解无。
最优解时x=
minf :输出线性规划问题的最优值,当线性规划问题没有可行解时minf=当线性规划问题有可行解无最优解时minf=-inf。
flag :线性规划问题的求解结果标志值,当线性规划问题有最优解时flag=1,当线性规划问题有可行解无最优解时flag=0,当线性规划问题没有可行解时flag=-1.
cpt:输出最优解对应的单纯性表,当线性规划问题没有可行解或有可。
行解无最优解时cpt=
三、 linp函数。
此函数是使用两阶段算法求解线性规划问题。
function [x,minf,flag,cpt]=linp(a,b,c);
for i=1:p %判断b是否<=0;将b转换成大于0;
if b(i)<0
a(i,:)1*a(i,:)
b(i)=-1*b(i);
endend
返回值:x,第一张单纯形表,基,标志参数 a,c,b
***第一张单纯形表的初始化。
m,n]=size(a);%获得矩阵a的维数。
p,q]=size(b);
dcxb=zeros(m+2,m+n+1);%确定第一张单纯形表的大小。
dcxb(1,:)c,zeros(1,m+1)];给表的第一行赋值。
dcxb(2,:)zeros(1,n),-1*ones(1,m),0];%给表的第二行赋值。
dcxb([3:m+2],:a,eye(m,m),b];%添a和b到表中。
jxl=[n+1:n+m];
for i=3:m+2
dcxb(2,:)dcxb(2,:)dcxb(i,:)
for i=3:m+2
dxcb(2,:)dxcb1(2,:)dxcb1(i,:)
enddxcb;
辅助问题换基迭代。
dyl=find(dcxb(2,[1:m+n])>0);
while ~isempty(dyl)
firstnum=dyl(1);
dll=dcxb([3:m+2],firstnum);
youduanb=dcxb([3:m+2],m+n+1);
look=find(dll>0);
if isempty(look)
dcxb(2,firstnum)=0;
elsemin=inf;
for i=3:m+2
if dll(i-2)>0&youduanb(i-2)dll(i-2)min=youduanb(i-2)dll(i-2);
line1=i;
endend
dcxb(line1,:)dcxb(line1,:)dcxb(line1,firstnum);
for i=1:m+2
if i~=line1
dcxb(i,:)dcxb(i,:)1*dcxb(i,firstnum)*dcxb(line1,:)
endend
jxl(line1-2)=firstnum;
enddyl=find(dcxb(2,[1:m+n])>0);
dcxbend
if dcxb(2,m+n+1)>0
fprintf('g>0,此问题没有可行解');
x=minf=inf;
cpt=flag=-1;
return
endlook1=find(jxl>n);
if dcxb(2,m+n+1)==0 %等于0,判断基变量中是否有人工变量;
if ~isempty(look1)%存在时进行处理。
while ~isempty(look1)
line2=look1(1)+2;
chdy0=find(dcxb(line2,[1:n])~0);
if isempty(chdy0)%存在人工变量都为零的那一行,去掉该行。
dcxb(line2,:)
look1(1)=[
jxl(line2-2)=[
else%否则进行换基迭代。
secondnum=chdy0(1);
dcxb(line2,:)dcxb(line2,:)dcxb(line2,secondnum);
jxl(line2-2)=secondnum;
for i=1:m+2
if i~=line2
dcxb(i,:)dcxb(i,:)1*dcxb(i,secondnum)*dcxb(line2,:)
end;end
look1(1)=[
end;end
endend
去掉人工变量,得到单纯性的第一张表。
dcxb(2,:)
dcxb(:,n+1:n+m])=
有可行解,判断z
dcxb2=dcxb;
look2=find(dcxb2(1,[1:n])>0);
while ~isempty(look2)
thirdnum=look2(1);
duilie=dcxb2([2:m+1],thirdnum);
youduanb1=dcxb2([2:m+1],n+1);
look3=find(duilie>0);
if isempty(look3)
fprintf('此问题有可行解,但没有最优解');
x=zeros(n,1);
[mi,n1]=size(jxl);
for i=1:n1
x(jxl(i))=dcxb2(i+1,n+1);
endfprintf(' 可行解为');
xminf=-inf
cpt=flag=0
return
endmin1=inf;
for i=1:m
if duilie(i)>0&youduanb1(i)duilie(i)min1=youduanb1(i)duilie(i);
line=i+1;%记录行数。
endend
dcxb2(line,:)dcxb2(line,:)dcxb2(line,thirdnum);
for i=1:m+1
if i~=line
dcxb2(i,:)dcxb2(i,:)1*dcxb2(i,thirdnum)*dcxb2(line,:)
endend
jxl(line-1)=thirdnum;
dcxb2look2=find(dcxb2(1,[1:n])>0);
endminf=dcxb2(1,n+1);
x=zeros(n,1);
p,q]=size(jxl);
fprintf('\最优解已找到n');
for i=1:q
x(jxl(i))=dcxb2(i+1,n+1);
endfprintf('最优可行解为:')
xfprintf('最优值为:')
minfcpt=dcxb2;
fprintf('最优解对应的单纯形表为:')cpt
运筹学实验报告
山东工商学院。实验报告。课程名称运筹学。实验项目名称 excel规划求解 实验地点商学实验中心205室 实验 实训 日期周二下午 节 班级。姓名。学号。一 实验概述。一 实验目的。实验目的在于掌握应用计算机工具解决运筹学模型优化求解的方法步骤,熟悉运筹学优化软件excel 优化功能的使用,为今后在实...
运筹学实验报告
内容运输问题。班级。学生。学号。指导教师。2016 2017学年第二学期 一 p143页5.5某试验设备厂按合同规定在当年前四个月末分别提供同一型号的干燥箱 台给用户。该厂每个月的生产能力是65台,如果生产的产品当月不能交货,每台每月必须支付维护及存储费0.15万元,已知四个月内每台生产费分别是 9...
运筹学实验报告
西华大学实验报告。开课学院及实验室 交通与汽车学院计算机中心实验时间 年月日。1 实验目的。a 训练建模能力。b 应用excel建模及求解的方法应用 c 通过实验进一步掌握运筹学有关方法原理 求解过程,提高学生分析问题和解决问题能力。2 实验设备 仪器及材料。计算机 excel ilog软件。3 实...