找回密码
 注册
关于网站域名变更的通知
查看: 459|回复: 1
打印 上一主题 下一主题

基于matlab遗传算法求最短路径

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-3-12 18:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

6 w1 D- c6 [: Q. e7 p一、简介
9 B( j- R, D( I 4 ?# f7 |3 m, m! m4 J6 N* T
5 a! F  ^2 u; X2 g5 ?" ^# S
一、问题分析8 R* t: s9 X! I5 w9 J: y7 z8 i
2 ^' _/ y6 g- }% N. W/ e! u7 l
如图如示,将节点编号,依次为1.2.3.4.5.6.7.8.9.10.11,由图论知识,则可写出其带权邻接矩阵为:
- Y8 ^7 o1 m; O6 R
" l1 o* b' Z3 _+ q0 ~! X+ @
  • 0     2     8     1   500   500   500   500   500   500   500
  • 2     0     6   500     1   500   500   500   500   500   500
  • 8     6     0     7   500     1   500   500   500   500   500
  • 1   500     7     0   500   500     9   500   500   500   500
    6 p8 ^& M9 V) m0 r

4 K# u- e1 h2 M
! [) C7 a, |2 E' M9 R: b500 1 500 500 0 3 500 2 500 500 500
0 U0 ~5 \" T- l/ C$ T( u6 z2 U2 j8 _# L4 `0 T0 i3 h5 o0 K4 n! K
500 500 1 500 3 0 4 500 6 500 500
6 D  {: X/ W5 H6 S0 B
3 ?5 R# H% x/ m- p* n4 Y8 ?500 500 500 9 500 4 0 500 500 1 500; }5 ^. G8 j, q* Z

; t+ @7 c( E) c( D( i2 h500 500 500 500 2 500 500 0 7 500 9- l1 }0 W( {  d* R9 W8 ^! @4 D
9 @8 q, Z$ O! r% `2 `& J
500 500 500 500 500 6 500 7 0 1 2' o' o( x; g1 @; n0 r- u
+ D9 V& ]5 X. o0 q) a" O# M# C
500 500 500 500 500 500 1 500 1 0 49 ?, `( I) q% E4 h% R9 y
1 a* I, v/ F2 l4 x  |  e/ @$ g
500 500 500 500 500 500 500 9 2 4 0
( z. a- y7 S7 i5 N# ^4 G& w9 F# r4 ~* e- Q
注:为避免计算时无穷大数吃掉小数,此处为令inf=500。
# L6 c6 [" w* i& q
, l3 @$ k# ?2 U% J
/ _/ O: }  `0 U7 M+ g% W- U问题要求求出任意两点间的最短路径,Floyd算法采用的是在两点间尝试插入顶点,比较距离长短的方法。我思考后认为,用遗传算法很难找到一个可以统一表示最短路径的函数,但是可以对每一对点分别计算,然后加入for循环,可将相互之间的所有情况解出。观察本题可发现,所有节点都是可双向行走,则可只计算i到j的路径与距离,然后将矩阵按主对角线翻折即可得到全部数据。3 l0 f* z2 c8 {- g+ x" K4 m: f& c

4 t9 ~/ [- h: n( [5 d* q' Y3 p# r! V

  a# V* s! Q7 B/ Y7 ?二、实验原理与数学模型
: e0 D) q: u/ ~: M5 b& Y/ \& R6 z' {+ r  J- T
实现原理为遗传算法原理:
% b: Z5 y$ p  K  k8 l5 X8 F1 Z' r) p$ c
按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使得适应度高的个体被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足一定的条件。
% b( k5 O3 K$ V4 a0 x5 A- a2 c' T6 C. U, X  K
数学模型如下:
) @7 g" U7 T2 F4 N* x2 h; Z$ M+ g  I9 o  F7 N" `4 h8 V% ^
. V5 X$ _) ~6 X0 }
& M2 {$ K+ u4 J6 V, p9 e

3 t! A. \7 H4 T% `( |) `实验具体:6 R5 c* A- g9 p9 N/ @3 R# I% F

# e) R0 q* G; u: x  c9 z第一:编码与初始化0 r) m' M* [' g! Z0 h. @

6 P9 F6 \% A$ e. |因采用自然编码,且产生的编码不能重复,于是我采用了randperm函数产生不重复的随机自然数。因解题方法是使用的是计算每一对点,则我们编码时将第一个节点单独放入,合并成完整编码。
7 D# z; k9 f( t& o( _5 `/ ^5 M. ]8 z& p+ m) J# U! c
因为节点有11个,可采用一个1行11列的矩阵储存数据,同时,由于编号为数字,可直接使用数字编码表示路径的染色体。具体如下:
/ }3 V& }. y8 S5 A! n* S; X
$ n% i2 v2 K0 ?9 n  ]采用等长可变染色体的方式,例如由2到9的路径,染色体编码可能为(2,5,1,8,4,6,9,3,10,7,11),超过9之后的编码,用来进行算子的运算,不具备实际意义。
; M: }! q+ A- c* _3 Z, S4 Z' q' _
第二:计算适应度,因取最短路径值,即最小值,常用方法为C-F(x)或C/F(x)(C为一常数),此处采用前一种方式。于是,可进一步计算相对适应度。0 x! b* `3 R: s* B7 r. o

' \) s  Y6 Y* e0 E' v1 h第三:选择与复制# E/ P- w9 {7 P: }& W
( f" f1 `& Z, _  v. b4 |
采用轮盘赌算法,产生一个随机值,比较它与累计相对适应度的关系,从而选择出优良个体进入下一代。) e' E% d; p+ L' {/ u& l/ {

$ I- k7 |( {4 U" a$ d( j) P6 k第四:交叉。
5 A1 W/ e+ Y6 n( D1 x  C' D& W9 H: i2 _  ^' F: c! m) n6 d. Z2 T; R8 A4 c1 P
因编码是不重复的数字,所以采用传统的交叉方法,即上一行与下一行对位交叉,会产生无效路径,于是,采用了不同的交叉方法,具体如下:7 S. r5 }& ^9 E' L  ~
) ]/ x; n: m  r  l; O! h
(1)在表示路径的染色体Tx 和Ty中,随机选取两个基因座(不能为起点基因座)i和j, 即将i个基因座和第j个基因座之间的各个基因座定义为交叉域,并将交叉的内容分别记忆为temp1和temp2。1 Q* K* x6 Q6 ]# C
+ g) j: T6 t+ @/ Q! ^
(2)根据交叉区域中的映射关系,在个体Tx中找出所有与temp2相同的元素,在个体Ty中找出所有与temp1相同的元素,全部置为0。
) p: i; m' T+ E& A$ W& V/ ~5 N  g7 p" T, O. D% G# n; N
(3)将个体Tx、Ty进行循环左移,遇到0就删除,直到编码串中交叉区域的左端不再有0:然后将所有空位集中到交叉区域,而将交叉区域内原有的基因依次向后移动。因0元素可能较多,在程序实现时,我是将非零元素提出,后面再合成。
! D% z* E: k1 p: W+ s. W2 O4 e5 e* D6 z! U8 G
(4)将temp2插入到Tx的交叉区域,temp1插入到Ty的交叉区域。形成新的染色体。3 L4 B3 t! j" k# K" C& a  h9 R

( Q. y( j) M# Y. [第五:变异2 _5 C  u0 p4 \2 k8 N" W1 z

9 m' d, V  p$ C$ `5 A( Z2 l染色体编码为从1到11的无重复编码,所以不能采用一般的生成一个随机数替代的办法。此处采用交换变异法。即随机产生两个数,交换两个节点的顺序。
; i! o, a7 @) j) k7 m: Q* J% f$ ~/ c

" \+ Q; c( x& U4 v' N- X
) M; q7 g! P2 u) g) E7 g二、源代码
3 G( m0 w. h9 ~1 `$ v# Q5 i5 z1 Y
  • clc;clear;
  • %初始化参数
  • %注:popsize=200,MaxGeneration=100,约跑2分钟。若不要求太精确,可减少循环次数。
  • pointnumber=11;                            %节点个数
  • Popsize=200;                               %种群规模,只能取偶数(因67行的循环)
  • MaxGeneration=100;                         %最大代数
  • Pc=0.8;Pm=0.3;                             %交叉概率和变异概率
  • A=[0 2 8 1 50 50 50 50 50 50 50
  •     2 0 6 50 1 50 50 50 50 50 50
  •     8 6 0 7 50 1 50 50 50 50 50
  •     1 50 7 0 50 50 9 50 50 50 50
  •     50 1 50 50 0 3 50 2 50 50 50
  •     50 50 1 50 3 0 4 50 6 50 50
  •     50 50 50 9 50 4 0 50 50 1 50
  •     50 50 50 50 2 50 50 0 7 50 9
  •     50 50 50 50 50 6 50 7 0 1 2
  •     50 50 50 50 50 50 1 50 1 0 4
  •     50 50 50 50 50 50 50 9 2 4 0];         %带权邻接矩阵。
  • A(A==50)=500;                              %取值50过小而修正为500;
  • Bestindividual=zeros(MaxGeneration,1);
  • outdistance=zeros(11,11);
  • outpath=cell(11,11);                     %用于存放11个点相互之间的最短路径
  • %******  生成初始种群 ******
  • for a=1:pointnumber                       %起点的编号
  • %a=1;
  • tempvary=[1 2 3 4 5 6 7 8 9 10 11];
  • tempvary(a)=[];                              %暂时剔除起点
  • tempmatrix=a*ones(Popsize,1);                %将起点单独放一矩阵
  • path=zeros(Popsize,pointnumber-1);           %声明矩阵大小,避免减慢速度
  • for i=1:Popsize
  •     temprand=randperm(pointnumber-1);
  •     path(i,:)=tempvary(temprand(1:end));      %生成一系列剔除起点的随机路线
  • end
  • path=[tempmatrix path];                       %合成包括起点的完整路线
  • [row,col]=size(path);
  • for b=a:pointnumber                          %终点的编号
  • %b=10;
  • for k=1:1:MaxGeneration
  •     for i=1:row
  •         position2=find(path(i,:)==b);       %找出终点在路线中的位置
  •         pathlong(i)=0;
  •         for j=1:position2-1
  •             pathlong(i)=pathlong(i)+A(path(i,j),path(i,j+1));
  •         end
  •     end
  •     %计算适应度
  •     Fitness=length(A)*max(max(A))-pathlong;     %因要求最小值,采且常数减函数值构造适应度
  •     Fitness=Fitness./sum(Fitness);
  •     %****** Step 1 : 选择最优个体 ******
  •     Bestindividual(k)=min(pathlong);
  •     [OrdeRFi,Indexfi]=sort(Fitness);         %按照适应度大小排序
  •     Bestfi=Orderfi(Popsize);              %Oderfi中最后一个即是最大的适应度
  •     BestS=path(Indexfi(Popsize),:);         %记录每一代中最优个体的路线
  •     %****** Step 2 : 选择与复制操作******
  •     temppath=path;
  •     roulette=cumsum(Fitness);
  •     for i=1:Popsize
  •         tempP=rand(1);
  •         for j=1:length(roulette)
  •             if tempP<roulette(j)
  •                 break;
  •             end
  •         end
  •         path(i,:)=temppath(j,:);
  •     end
  •     %************ Step 3 : 交叉操作 ************
  •     temppath2=path;
  •     for i=1:2:row
  •         tempP2=rand(1);
  •         if(tempP2<rand(1))
  •             temPm2=fix((rand(1)+0.2)*10);            %因起点基因不能改变
  •             temPm3=fix((rand(1)+0.2)*10);            %随机取出两个位置为2到11基因座
  •             temPm4=min(temPm2,temPm3);
  •             temPm5=max(temPm2,temPm3);
  •             temp1=path(i,temPm4:temPm5);             %将两点之间的基因储存,方便交叉
  •             temp2=path(i+1,temPm4:temPm5);
  •             [c d]=find(ismember(path(i,:),temp2));
  •             path(i,d)=0;                             %找出i行在i+1行取出区域中的数,置为0
  •             [e f]=find(ismember(path(i+1,:),temp1));
  •             path(i+1,f)=0;                           %找出i+1行在i行取出区域中的数,置为0
  •             [g h]=find(path(i,:)~=0);
  •             v1=path(i,h);                            %取出i行的非零元素,成一向量
  •             [l m]=find(path(i+1,:)~=0);
  •             v2=path(i+1,m);                          %取出i+1行的非零元素,成一向量
  •             path(i,:)=[v1(1:temPm4-1) temp2 v1(temPm4-1+size(temp1):end)];
  •             path(i+1,:)=[v2(1:temPm4-1) temp1 v2(temPm4-1+size(temp2):end)];     %基因交叉
  •         end
  •     end
  •     path(Popsize,:)=BestS;
  •     %************ Step 4: 变异操作 **************
  •     for i=1:Popsize
  •         tempPm=rand(1);
  •         if(tempPm< Pm)
  •             temPm6=fix((rand(1)+0.2)*10);
  •             temPm7=fix((rand(1)+0.2)*10);         %产生两个用于交换的随机数
  •             tempvessel=path(i,temPm6);            %交换前用一临时容器存放数据
  •             path(i,temPm6)=path(i,temPm7);
  •             path(i,temPm7)=tempvessel;             %变异交换
  •         end
  •     end
  •     path(Popsize,:)=BestS;
  • end
  • [aa bb]=find(BestS==b);                          %找出终点
  • Bestpath=BestS(1:bb);                            %剔除后面无用的点,留下实际路线
  • outdistance(a,b)=Bestindividual(k);              %将最短距离写入矩阵
  • outpath{a,b}=Bestpath;                           %写入路径,因数据类型为矩阵,所以采用元胞数组储存
  • end
  • end
  • for i=1:pointnumber
  •     for j=1:i
  •         outdistance(i,j)=outdistance(j,i);       %实现距离的对称
  •         outpath{i,j}=fliplr(outpath{j,i});       %实现路径的对称与翻转
  •     end
  • end
  •     %*************** 结果输出 *****************
  • outdistance
  • celldisp(outpath)
  • %xlswrite('tempdata.xls', outpath)               %存入excel中进行操作+ T9 v' F+ I6 L0 `! R6 g
( N  N+ X7 n+ r2 \
" y! Q' ~1 L# g
三、运行结果
$ O  b+ W% b3 A! ?6 V( Q9 T' j+ M  v3 {5 o% g
距离矩阵:a(i,j) i表示起点,j表示终点。
, J" D; b4 T; e  Z$ u
8 Q0 b1 u* \3 K* poutdistance =
$ _7 }2 S0 }# X- Y) `$ j2 i* Z. @; f$ z8 x# L
  • 0     2     7     1     3     6    10     5    12    11    14
  • 2     0     5     3     1     4     8     3    10     9    12
  • 7     5     0     7     4     1     5     6     7     6     9
  • 1     3     7     0     4     8     9     6    11    10    13
  • 3     1     4     4     0     3     7     2     9     8    11
  • 6     4     1     8     3     0     4     5     6     5     8
  • 10     8     5     9     7     4     0     9     2     1     4
  • 5     3     6     6     2     5     9     0     7     8     9
  • 12    10     7    11     9     6     2     7     0     1     2
  • 11     9     6    10     8     5     1     8     1     0     32 j$ W% F+ M* K4 I( G
3 X8 |" x( w. _
5 Z% Z: ^# u& o+ o$ b
14 12 9 13 11 8 4 9 2 3 0
2 s% {; C8 B6 U! n( s
' R6 ?, n8 M+ I路径:b(i,j) i表示起点,j表示终点。
+ n" v+ p3 L  u4 O
  h4 Z: |; U3 P- X, {outpath:. ^7 C8 b) u3 U3 s

% f$ S7 \9 j  k% K
1 B. h# D' ]! J6 ~: H! R, j- Z+ E" a
6 f4 X: r3 b$ g) D. B7 g; [" P9 [& H: a0 l
: N+ r" V4 I( `+ ?  M/ r

该用户从未签到

2#
发表于 2021-3-12 18:28 | 只看该作者
基于matlab遗传算法求最短路径
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-5 03:05 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表