1、 function sol,val,k,flag1=danchunxingbiao(A1,C,N)M=10000;mA1,nA1=size(A1);C1=C,0;val=zeros(1,length(C);for i=1:length(N) c1(i)=C1(N(i);end nA1 a(i)=C1(i)-c1*A1(:,i);%计算初始检验数endA=A1;a; %构造初始单纯形表mA,nA=size(A);k=0; % 迭代次数flag=1;while flag for i=1:(nA-1) if A(mA,i)存在无穷多最优解 flag1=2;存在最优解 flag1=3; sol=c1*
2、val1 elseif flag=1 for j=1:(mA-1) if A(j,i) temp(s)=A(s,nA)/A(s,nb); temp(s)=10000; k=k+1; mino=min(temp); n,mb=find(temp=mino); %确定入基变量的横坐标 if length(mb)1 mb=mb(1); ab=A(mb,nb); A2=A;nA if i=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:(
3、mA-1),i);if sol=inflength(C) if i=N(j) val(i)=val1(j);End运行:clcA=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
4、,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,0Al=A,b;C=0.9 1.4 1.9 0.45 0.95 1.45 -0.05 0.45 0.95 0 0 0 0 0 0 0 0;N=10:17;sol,val,k,flag1=danchunxingbiao(Al,C,N)2. 求解结果运筹学上机实习 (第二次)2015.04.26MATLAB实现匈牙利算法%程序文件 xiongyali.mfunction z,ans=xi
5、ongyali(marix)%/ %输入效率矩阵 marix 为方阵; %若效率矩阵中有 M,则用一充分大的数代替; %输出z为最优解,ans为 最优分配矩阵;a=marix;b=a;%确定矩阵维数s=length(a);%确定矩阵行最小值,进行行减ml=min(as a(i,:)=a(i,:)-ml(i);%确定矩阵列最小值,进行列减mr=min(a);for j=1: a(:,j)=a(:,j)-mr(j);% start workingnum=0;while(num=s) %终止条件是“(0)”的个数与矩阵的维数相同 %index用以标记矩阵中的零元素,若a(i,j)=0,则index(
6、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); %一次循环划线全过程,终止条件是所有的零元素均被直线覆盖, %即在flag0位,index=0 while(sum(sum(index) %按行找出“(0)”所在位置,并对“(0)”所在列划线, %即设置fl
7、ag,同时修改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(su
8、m(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.01MATLAB实现目标规划的单纯形表 %只需将优先级量化成数量级,此时在使用单纯形表进行求解即可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=10 30 80C=0,0,p1,0,0,p1,p2,0;N=3,5,7;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1