ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:53.89KB ,
资源ID:6493906      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6493906.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数学建模程序必用.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数学建模程序必用.docx

1、数学建模程序必用图论算法及其MATLAB 程序代码求赋权图 G = (V, E , F )中任意两点间的最短路的Warshall-Floyd 算法:设 A = (aij )nn 为赋权图G = (V, E , F )的矩阵, 当vivjE 时aij = F (vivj), 否则取aii =0, aij= +(ij ), dij 表示从vi 到vj 点的距离, rij 表示从vi 到vj 点的最短路中一个点的编号. 赋初值. 对所有i, j, dij = aij, rij = j. k = 1. 转向 更新 dij, rij . 对所有i, j, 若dik + dk jdij, 则令dij =

2、dik + dk j, rij = k, 转向. 终止判断. 若dii0, 则存在一条含有顶点vi 的负回路, 终止; 或者k = n 终止; 否则令k = k + 1, 转向.最短路线可由 rij 得到.例 1 求图 6-4 中任意两点间的最短路. 解:用Warshall-Floyd 算法, MATLAB 程序代码如下:n=8;A=0 2 8 1 Inf Inf Inf Inf2 0 6 Inf 1 Inf Inf Inf8 6 0 7 5 1 2 Inf1 Inf 7 0 Inf Inf 9 InfInf 1 5 Inf 0 3 Inf 8Inf Inf 1 Inf 3 0 4 6Inf

3、Inf 2 9 Inf 4 0 3Inf Inf Inf Inf 8 6 3 0; % MATLAB 中, Inf 表示D=A; %赋初值for(i=1:n)for(j=1:n)R(i,j)=j;end;end %赋路径初值for(k=1:n)for(i=1:n)for(j=1:n)if(D(i,k)+D(k,j)D(i,j)D(i,j)=D(i,k)+D(k,j); %更新dijR(i,j)=k;end;end;end %更新rijk %显示迭代步数D %显示每步迭代后的路长R %显示每步迭代后的路径pd=0;for i=1:n %含有负权时if(D(i,i)0)x(k)=A(i,j); %

4、数组x 记录A中不同的正数kk=1; %临时变量for(s=1:k-1)if(x(k)=x(s)kk=0;break;end;end %排除相同的正数k=k+kk;end;end;endk=k-1 %显示A中所有不同正数的个数for(i=1:k-1)for(j=i+1:k) %将x 中不同的正数从小到大排序if(x(j)0)kk=kk+1;zz=z;end;end %寻找TT 中的树枝if(kk=1)TT(y,zz)=0;TT(zz,y)=0;pd=0;end;end %砍掉TT 中的树枝if(pd)break;end;end %已砍掉了TT 中所有的树枝pd=0; %判断TT 中是否有圈fo

5、r(y=1:n-1)for(z=y+1:n)if(TT(y,z)0)pd=1;break;end;end;endif(pd)T(i,j)=0;T(j,i)=0; %假如TT 中有圈else q=q+1;end;end;end;end;endT %显示近似最小生成树T, 程序结束求二部图G 的最大匹配的算法(匈牙利算法), 其基本思想是:从G 的任意匹配M 开始,对X 中所有M 的非饱和点, 寻找M -增广路. 若不存在M -增广路, 则M 为最大匹配; 若存在M -增广路P, 则将P 中M 与非M 的边互换得到比M 多一边的匹配M1 , 再对M1 重复上述过程.设 G = ( X, Y, E

6、)为二部图, 其中X = x1, x2, , xn , Y = y1, y2, , yn. 任取G 的一初始匹配M (如任取eE, 则M = e是一个匹配). 令 S = f , T = f , 转向. 若 M 饱和X S 的所有点, 则M 是二部图G 的最大匹配. 否则, 任取M 的非饱和点uX S , 令S = S u , 转向. 记 N (S ) = v | uS, uvE . 若N (S ) = T, 转向. 否则取yN (S ) T. 若y 是M的饱和点, 转向, 否则转向. 设 x yM, 则令S = S x , T = T y , 转向. u - y 路是M-增广路, 设为P,

7、并令M = MP, 转向. 这里MP = MP MP, 是对称差.由于计算 M-增广路P 比较麻烦, 因此将迭代步骤改为: 将 X 中M 的所有非饱和点(不是M 中某条边的端点)都给以标号0 和标记*, 转向. 若 X 中所有有标号的点都已去掉了标记*, 则M 是G 的最大匹配. 否则任取X 中一个既有标号又有标记*的点xi , 去掉xi 的标记*, 转向. 找出在 G 中所有与xi 邻接的点yj (即xi yjE ), 若所有这样的yj 都已有标号, 则转向, 否则转向. 对与 xi 邻接且尚未给标号的yj 都给定标号i. 若所有的yj 都是M的饱和点, 则转向,否则逆向返回. 即由其中M的

8、任一个非饱和点yj的标号i 找到xi, 再由xi的标号k 找到yk , ,最后由 yt 的标号s 找到标号为0 的xs 时结束, 获得M -增广路xs yt xi yj, 记P = xs yt, ,xi yj , 重新记M 为MP, 转向. 将 yj在M 中与之邻接的点xk (即xk yjM), 给以标号j 和标记*, 转向.例1 求图 6-9 中所示的二部图G 的最大匹配. 匈牙利算法的 MATLAB 程序代码如下:m=5;n=5;A=0 1 1 0 01 1 0 1 10 1 1 0 00 1 1 0 00 0 0 1 1;M(m,n)=0;for(i=1:m)for(j=1:n)if(A

9、(i,j)M(i,j)=1;break;end;end %求初始匹配Mif(M(i,j)break;end;end %获得仅含一条边的初始匹配Mwhile(1)for(i=1:m)x(i)=0;end %将记录X中点的标号和标记*for(i=1:n)y(i)=0;end %将记录Y中点的标号和标记*for(i=1:m)pd=1; %寻找X中M的所有非饱和点for(j=1:n)if(M(i,j)pd=0;end;endif(pd)x(i)=-n-1;end;end %将X中M的所有非饱和点都给以标号0 和标记*, 程序中用n+1 表示0 标号, 标号为负数时表示标记*pd=0;while(1)x

10、i=0;for(i=1:m)if(x(i)1)k=k-1;for(j=1:k)pdd=1;for(i=1:m)if(M(i,yy(j)x(i)=-yy(j);pdd=0;break;end;end %将yj 在M中与之邻接的点xk (即xkyjM), 给以标号j 和标记*if(pdd)break;end;endif(pdd)k=1;j=yy(j); %yj 不是M的饱和点while(1)P(k,2)=j;P(k,1)=y(j);j=abs(x(y(j); %任取M的一个非饱和点yj, 逆向返回if(j=n+1)break;end %找到X中标号为0 的点时结束, 获得M-增广路Pk=k+1;e

11、ndfor(i=1:k)if(M(P(i,1),P(i,2)M(P(i,1),P(i,2)=0; %将匹配M 在增广路P 中出现的边去掉else M(P(i,1),P(i,2)=1;end;end %将增广路P 中没有在匹配M中出现的边加入到匹配M中break;end;end;endif(pd)break;end;end %假如X中所有有标号的点都已去掉了标记*, 算法终止M %显示最大匹配M, 程序结束图 6-9利用可行点标记求最佳匹配的算法步骤如下:设 G = ( X, Y, E , F )为完备的二部赋权图, L 是其一个初始可行点标记, 通常取.,( ) 0,( ) max ( ) |

12、 ,y Yx XL yL x F xy y Y = M 是GL 的一个匹配. 若X 的每个点都是M 的饱和点, 则M 是最佳匹配. 否则取 M 的非饱和点uX, 令S= u , T = f , 转向. 记NL (S ) = v | uS, uvEL . 若NL ( S ) = T , 则GL没有完美匹配, 转向. 否则转向. 调整可行点标记, 计算aL = min L ( x ) + L ( y ) - F (x y) | xS, yY T .由此得新的可行顶点标记H (v ) = ,( ),( ) ,( ) ,v Tv SL vL v aL v aLL+-令 L = H, GL= GH ,

13、重新给出GL 的一个匹配M, 转向. 取 yNL ( S ) T , 若y 是M 的饱和点, 转向. 否则, 转向. 设 x yM, 则令S = S x , T =T y , 转向. 在 GL 中的u - y 路是M -增广路, 记为P, 并令M = MP, 转向.利用可行点标记求最佳匹配算法的 MATLAB 程序代码如下:n=4;A=4 5 5 12 2 4 64 2 3 35 0 2 1;for(i=1:n)L(i,1)=0;L(i,2)=0;endfor(i=1:n)for(j=1:n)if(L(i,1)L(S(i),1)+L(j,2)-A(S(i),j)al=L(S(i),1)+L(j

14、,2)-A(S(i),j);end;end;endfor(i=1:jss)L(S(i),1)=L(S(i),1)-al;end %调整可行点标记for(j=1:jst)L(T(j),2)=L(T(j),2)+al;end %调整可行点标记for(i=1:n)for(j=1:n) %生成子图GLif(L(i,1)+L(j,2)=A(i,j)Gl(i,j)=1;else Gl(i,j)=0;endM(i,j)=0;k=0;end;endii=0;jj=0;for(i=1:n)for(j=1:n)if(Gl(i,j)ii=i;jj=j;break;end;endif(ii)break;end;end

15、 %获得仅含Gl 的一条边的初始匹配MM(ii,jj)=1;breakelse %NL(S)Tfor(j=1:jsn)pd=1; %取yNL(S)Tfor(k=1:jst)if(T(k)=NlS(j)pd=0;break;end;endif(pd)jj=j;break;end;endpd=0; %判断y 是否为M的饱和点for(i=1:n)if(M(i,NlS(jj)pd=1;ii=i;break;end;endif(pd)jss=jss+1;S(jss)=ii;jst=jst+1;T(jst)=NlS(jj); %S=Sx, T=Tyelse %获得Gl 的一条M-增广路, 调整匹配Mfor

16、(k=1:jst)M(S(k),T(k)=1;M(S(k+1),T(k)=0;endif(jst=0)k=0;endM(S(k+1),NlS(jj)=1;break;end;end;end;endMaxZjpp=0;for(i=1:n)for(j=1:n)if(M(i,j)MaxZjpp=MaxZjpp+A(i,j);end;end;endM %显示最佳匹配MMaxZjpp %显示最佳匹配M的权, 程序结束从一个可行流f 开始, 求最大流的Ford-Fulkerson 标号算法的基本步骤: 标号过程 给发点 vs 以标号(+, +) , d s = +. 选择一个已标号的点 x, 对于x 的所

17、有未给标号的邻接点y, 按下列规则处理:当 yxE, 且f yx 0 时, 令d y = min f yx , d x , 并给y 以标号 ( x - , d y ).当 xyE, 且f xyC xy 时, 令d y = min C xy - f xy , d x , 并给y 以标号 ( x + , d y ). 重复直到收点vt 被标号或不再有点可标号时为止. 若vt 得到标号, 说明存在一条可增广链, 转调整过程; 若vt 未得到标号, 标号过程已无法进行时, 说明f 已经是最大流. 调整过程 决定调整量d =d vt , 令u = vt . 若 u 点标号为( v +, d u ), 则

18、以f vu + d 代替 f vu ; 若u 点标号为( v -, d u ), 则以f vu - d代替 f vu. 若 v = vs, 则去掉所有标号转重新标号; 否则令u = v, 转.算法终止后, 令已有标号的点集为S, 则割集(S, S c )为最小割, 从而Wf = C (S, S c ).例 1 求图 6-19 所示网络的最大流. 利用 Ford-Fulkerson 标号法求最大流算法的MATLAB 程序代码如下:n=8;C=0 5 4 3 0 0 0 00 0 0 0 5 3 0 00 0 0 0 0 3 2 00 0 0 0 0 0 2 00 0 0 0 0 0 0 40 0

19、 0 0 0 0 0 30 0 0 0 0 0 0 50 0 0 0 0 0 0 0; %弧容量for(i=1:n)for(j=1:n)f(i,j)=0;end;end %取初始可行流f 为零流for(i=1:n)No(i)=0;d(i)=0;end %No,d 记录标号图 6-19while(1)No(1)=n+1;d(1)=Inf; %给发点vs 标号while(1)pd=1; %标号过程for(i=1:n)if(No(i) %选择一个已标号的点vifor(j=1:n)if(No(j)=0&f(i,j)d(i)d(j)=d(i);endelseif(No(j)=0&f(j,i)0) %对于

20、未给标号的点vj, 当vjvi 为非零流弧时No(j)=-i;d(j)=f(j,i);pd=0;if(d(j)d(i)d(j)=d(i);end;end;end;end;endif(No(n)|pd)break;end;end%若收点vt 得到标号或者无法标号, 终止标号过程if(pd)break;end %vt 未得到标号, f 已是最大流, 算法终止dvt=d(n);t=n; %进入调整过程, dvt 表示调整量while(1)if(No(t)0)f(No(t),t)=f(No(t),t)+dvt; %前向弧调整elseif(No(t)0)f(No(t),t)=f(No(t),t)-dvt

21、;end %后向弧调整if(No(t)=1)for(i=1:n)No(i)=0;d(i)=0; end;break;end %当t 的标号为vs 时, 终止调整过程t=No(t);end;end; %继续调整前一段弧上的流fwf=0;for(j=1:n)wf=wf+f(1,j);end %计算最大流量f %显示最大流wf %显示最大流量No %显示标号, 由此可得最小割, 程序结束设网络G = ( V, E, C ), 取初始可行流f 为零流, 求解最小费用流问题的迭代步骤: 构造有向赋权图 Gf = ( V, Ef , F ), 对于任意的vivjE , Ef , F 的定义如下:当 f i

22、j = 0 时, vivjEf , F ( vivj ) = bij ;当 f ij = Cij 时, vj viEf , F ( vjvi ) = -bij ;当 0 f ij Cij 时, vivjEf , F ( vivj ) = bij , vj viEf , F ( vj vi ) = -bij .转向. 求出有向赋权图 Gf = (V, Ef , F )中发点vs 到收点vt 的最短路m , 若最短路m 存在转向; 否则f 是所求的最小费用最大流, 停止. 增流. 同求最大流的方法一样, 重述如下:令.,-+ -=mmdi ji jijij ijij v vv vfC fd = m

23、in d ij | vivjm, 重新定义流f = f ij为f ij = ,-+-+mmddi ji jijijijv vv vfff如果 Wf 大于或等于预定的流量值, 则适当减少d 值, 使Wf 等于预定的流量值, 那么f 是所求的最小费用流, 停止; 否则转向.求解含有负权的有向赋权图 G = ( V, E, F )中某一点到其它各点最短路的Ford 算法.当 vivjE 时记wij = F (vivj), 否则取wii =0, wij = +(ij ). v1 到vi 的最短路长记为p ( i ),v1 到vi 的最短路中vi 的前一个点记为q ( i ). Ford 算法的迭代步骤: 赋初值p (1) = 0, p ( i ) = +, q ( i ) = i, i = 2, 3, , n . 更新p ( i ), q ( i ). 对于i = 2, 3, , n 和j = 1, 2, , n, 如果p ( i )p ( j ) + wji, 则令p ( i ) = p ( j ) , q ( i ) = j. 终止判断:若所有的p ( i )都无变化, 停止; 否则转向.在算法的每一步中, p ( i )都是从v1 到vi 的最短路长度的上界. 若不存在负长回路, 则从v1 到vi 的最短路长度是p ( i )的下界, 经过n -1 次迭代后p (

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1