运筹学实验报告春季.docx
- 文档编号:2410285
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:11
- 大小:31.55KB
运筹学实验报告春季.docx
《运筹学实验报告春季.docx》由会员分享,可在线阅读,更多相关《运筹学实验报告春季.docx(11页珍藏版)》请在冰豆网上搜索。
运筹学实验报告春季
《运筹学》上机实习(第一次)
姓名:
王焕政学号:
120610306实习日期:
2015.04.10
实习题目:
MATLAB实现单纯形表
报告内容:
1.程序
%求解标准型线性规划:
maxc*x;s.t.A*x=b;x>=0
%A1是标准系数矩阵及最后一列是资源向量,C是目标函数的系数向量
%N是(初始的)基变量的下标
%M=10000人工变量系数
%本函数中的A是单纯形表,包括:
最后一行是初始的检验数,最后一列是资源向量b
%c1是基变量系数
%输出变量sol是最优解
%输出变量val是最优值,k是迭代次数
%flag1的值代表有无最优解,0无界解,1无可行解,2无穷多解,3唯一最优解
function[sol,val,k,flag1]=danchunxingbiao(A1,C,N)
M=10000;
[mA1,nA1]=size(A1);
C1=[C,0];
val=zeros(1,length(C));
fori=1:
length(N)
c1(i)=C1(N(i));
end
fori=1:
nA1
a(i)=C1(i)-c1*A1(:
i);%计算初始检验数
end
A=[A1;a];%构造初始单纯形表
[mA,nA]=size(A);
k=0;%迭代次数
flag=1;
whileflag
fori=1:
(nA-1)
ifA(mA,i)<=0
flag=0;
else
flag=1;
break;
end
end
ifflag==0%已找到最优解
val1=A(1:
(mA-1),nA)';
fori=1:
length(N)
if(val1(i)~=0&&abs(C(N(i)))==M)
disp('无可行解');
sol=inf;val=inf;
flag3=0;
flag1=1;
break;
else
flag3=1;
end
end
ifflag3
iflength(find(A(mA,1:
(nA-1))==0))>length(N)
disp('存在无穷多最优解');
flag1=2;
else
disp('存在最优解');
flag1=3;
end
sol=c1*val1';
end
elseifflag==1
forj=1:
(mA-1)
ifA(j,i)<=0
flag2=1;
else
flag2=0;break;
end
end
ifflag==1&&flag2==1
disp('此线性规划问题存在无界解');
sol=inf;
val=inf;
flag1=0;
flag=0;%跳出while循环
break;
end
maxq=max(A(mA,1:
(nA-1)));
[m,nb]=find(A(mA,:
)==maxq);%确定入基变量的纵坐标
fors=1:
(mA-1)
ifA(s,nb)>0
temp(s)=A(s,nA)/A(s,nb);
else
temp(s)=10000;
end
end
k=k+1;
mino=min(temp);
[n,mb]=find(temp==mino);%确定入基变量的横坐标
iflength(mb)>1
mb=mb
(1);
end
ab=A(mb,nb);
A2=A;
fori=1:
(mA-1)
forj=1:
nA
ifi==mb
A(mb,j)=A2(mb,j)/ab;
else
A(i,j)=A2(i,j)-A2(i,nb)*(A2(mb,j)/ab);
end
end
end
fori=1:
length(N)
ifi==mb
N(i)=nb;
end
end
fori=1:
length(N)
c1(i)=C(N(i));
end
fori=1:
nA
A(mA,i)=C1(i)-c1*A(1:
(mA-1),i);
end
end
end
ifsol~=inf
fori=1:
length(C)
forj=1:
length(N)
ifi==N(j)
val(i)=val1(j);
end
end
end
End
运行:
clc
A=[1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0;
0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0;
0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0;
-0.4,0.6,0.6,0,0,0,0,0,0,0,0,0,1,0,0,0,0;
-0.2,-0.2,0.8,0,0,0,0,0,0,0,0,0,0,1,0,0,0;
0,0,0,-0.7,0.3,0.3,0,0,0,0,0,0,0,0,1,0,0;
0,0,0,-0.5,0.5,-0.5,0,0,0,0,0,0,0,0,0,1,0;
0,0,0,0,0,0,-0.6,-0.6,0.4,0,0,0,0,0,0,0,1];
b=[2000,2500,1200,0,0,0,0,0]';
Al=[A,b];
C=[0.91.41.90.450.951.45-0.050.450.9500000000];
N=[10:
17];
[sol,val,k,flag1]=danchunxingbiao(Al,C,N)
2.求解结果
《运筹学》上机实习(第二次)
姓名:
王焕政学号:
120610306实习日期:
2015.04.26
实习题目:
MATLAB实现匈牙利算法
报告内容:
1.程序
%程序文件xiongyali.m
function[z,ans]=xiongyali(marix)
%//////////////////////////////////////////////////
%输入效率矩阵marix为方阵;
%若效率矩阵中有M,则用一充分大的数代替;
%输出z为最优解,ans为最优分配矩阵;
%//////////////////////////////////////////////////
a=marix;
b=a;
%确定矩阵维数
s=length(a);
%确定矩阵行最小值,进行行减
ml=min(a');
fori=1:
s
a(i,:
)=a(i,:
)-ml(i);
end
%确定矩阵列最小值,进行列减
mr=min(a);
forj=1:
s
a(:
j)=a(:
j)-mr(j);
end
%startworking
num=0;
while(num~=s)%终止条件是“(0)”的个数与矩阵的维数相同
%index用以标记矩阵中的零元素,若a(i,j)=0,则index(i,j)=1,否则index(i,j)=0
index=ones(s);
index=a&index;
index=~index;
%flag用以标记划线位,flag=0表示未被划线,
%flag=1表示有划线过,flag=2表示为两直线交点
%ans用以记录a中“(0)”的位置
%循环后重新初始化flag,ans
flag=zeros(s);
ans=zeros(s);
%一次循环划线全过程,终止条件是所有的零元素均被直线覆盖,
%即在flag>0位,index=0
while(sum(sum(index)))
%按行找出“(0)”所在位置,并对“(0)”所在列划线,
%即设置flag,同时修改index,将结果填入ans
fori=1:
s
t=0;
l=0;
forj=1:
s
if(flag(i,j)==0&&index(i,j)==1)
l=l+1;
t=j;
end
end
if(l==1)
flag(:
t)=flag(:
t)+1;
index(:
t)=0;
ans(i,t)=1;
end
end
%按列找出“(0)”所在位置,并对“(0)”所在行划线,
%即设置flag,同时修改index,将结果填入ans
forj=1:
s
t=0;
r=0;
fori=1:
s
if(flag(i,j)==0&&index(i,j)==1)
r=r+1;
t=i;
end
end
if(r==1)
flag(t,:
)=flag(t,:
)+1;
index(t,:
)=0;
ans(t,j)=1;
end
end
end%对while(sum(sum(index)))
%处理过程
%计数器:
计算ans中1的个数,用num表示
num=sum(sum(ans));
%判断是否可以终止,若可以则跳出循环
if(s==num)
break;
end
%否则,进行下一步处理
%确定未被划线的最小元素,用m表示
m=max(max(a));
fori=1:
s
forj=1:
s
if(flag(i,j)==0)
if(a(i,j) m=a(i,j); end end end end %未被划线,即flag=0处减去m;线交点,即flag=2处加上m fori=1: s forj=1: s if(flag(i,j)==0) a(i,j)=a(i,j)-m; end if(flag(i,j)==2) a(i,j)=a(i,j)+m; end end end end%对while(num~=s) %计算最优(min)值 zm=ans.*b; z=0; z=sum(sum(zm)); 运行: a=[2,10,9,7;15,4,14,8;13,14,16,11;4,15,13,9]; [z,ans]=xiongyali(a) 2.求解结果 《运筹学》上机实习(第三次) 姓名: 王焕政学号: 120610306实习日期: 2014.06.01 实习题目: MATLAB实现目标规划的单纯形表 报告内容: 1.程序 %只需将优先级量化成数量级,此时在使用单纯形表进行求解即可 p1=-1000; p2=-10; clc A=[1,0,1,-1,0,0,0,0; 2,1,0,0,1,-1,0,0; 3,2,0,0,0,0,1,-1]; b=[103080]'; Al=[A,b]; C=[0,0,p1,0,0,p1,p2,0]; N=[3,5,7]; [sol,val,k,flag1]=danchunxingbiao(Al,C,N) 2.求解结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运筹学 实验 报告 春季