运筹学实验报告春季Word文档下载推荐.docx
《运筹学实验报告春季Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《运筹学实验报告春季Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
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
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)'
;
if(val1(i)~=0&
&
abs(C(N(i)))==M)
disp('
无可行解'
);
sol=inf;
val=inf;
flag3=0;
flag1=1;
flag3=1;
ifflag3
iflength(find(A(mA,1:
(nA-1))==0))>
存在无穷多最优解'
flag1=2;
存在最优解'
flag1=3;
sol=c1*val1'
elseifflag==1
forj=1:
(mA-1)
ifA(j,i)<
flag2=1;
flag2=0;
break;
ifflag==1&
flag2==1
此线性规划问题存在无界解'
val=inf;
flag1=0;
%跳出while循环
maxq=max(A(mA,1:
(nA-1)));
[m,nb]=find(A(mA,:
)==maxq);
%确定入基变量的纵坐标
fors=1:
ifA(s,nb)>
temp(s)=A(s,nA)/A(s,nb);
temp(s)=10000;
k=k+1;
mino=min(temp);
[n,mb]=find(temp==mino);
%确定入基变量的横坐标
iflength(mb)>
1
mb=mb
(1);
ab=A(mb,nb);
A2=A;
nA
ifi==mb
A(mb,j)=A2(mb,j)/ab;
A(i,j)=A2(i,j)-A2(i,nb)*(A2(mb,j)/ab);
N(i)=nb;
c1(i)=C(N(i));
A(mA,i)=C1(i)-c1*A(1:
(mA-1),i);
ifsol~=inf
length(C)
ifi==N(j)
val(i)=val1(j);
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.求解结果
《运筹学》上机实习(第二次)
2015.04.26
MATLAB实现匈牙利算法
%程序文件xiongyali.m
function[z,ans]=xiongyali(marix)
%//////////////////////////////////////////////////
%输入效率矩阵marix为方阵;
%若效率矩阵中有M,则用一充分大的数代替;
%输出z为最优解,ans为最优分配矩阵;
a=marix;
b=a;
%确定矩阵维数
s=length(a);
%确定矩阵行最小值,进行行减
ml=min(a'
s
a(i,:
)=a(i,:
)-ml(i);
%确定矩阵列最小值,进行列减
mr=min(a);
forj=1:
a(:
j)=a(:
j)-mr(j);
%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
t=0;
l=0;
if(flag(i,j)==0&
index(i,j)==1)
l=l+1;
t=j;
if(l==1)
flag(:
t)=flag(:
t)+1;
index(:
t)=0;
ans(i,t)=1;
%按列找出“(0)”所在位置,并对“(0)”所在行划线,
r=0;
r=r+1;
t=i;
if(r==1)
flag(t,:
)=flag(t,:
)+1;
index(t,:
)=0;
ans(t,j)=1;
end%对while(sum(sum(index)))
%处理过程
%计数器:
计算ans中1的个数,用num表示
num=sum(sum(ans));
%判断是否可以终止,若可以则跳出循环
if(s==num)
%否则,进行下一步处理
%确定未被划线的最小元素,用m表示
m=max(max(a));
if(flag(i,j)==0)
if(a(i,j)<
m)
m=a(i,j);
%未被划线,即flag=0处减去m;
线交点,即flag=2处加上m
a(i,j)=a(i,j)-m;
if(flag(i,j)==2)
a(i,j)=a(i,j)+m;
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)
《运筹学》上机实习(第三次)
2014.06.01
MATLAB实现目标规划的单纯形表
%只需将优先级量化成数量级,此时在使用单纯形表进行求解即可
p1=-1000;
p2=-10;
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]'
C=[0,0,p1,0,0,p1,p2,0];
N=[3,5,7];