登山算法

登山算法
登山算法

登山算法

在A*算法中,估价函数f(x)=k*g(x)+w*h(x),即是由已付出的代价函数g(x)和启发函数(希望函数)h(x)两个方面组成,而登山算法在搜索过程中,估价函数f(x)则是只有启发函数(希望函数)h(x)组成,即登山算法的估价函数f(x)=h(x).

登山算法的搜索过程为:

1.保存并取出初始结点.

2.用生成器函数G(X),由该结点出发生成下一级子结点, 并检查是否出现目标状态Sg(终止结点),若出现,则转4;否则继续

3.

3.用估价函数f(X)=h(x)对生成的该层各结点进行估价, 根据需要选取估价值(希望值)最小(最大)的一个结点作为最有希望的结点保存起来,然后再取出该结点(将被优先扩展),转2.

4.搜索成功,打印搜索的结果.

登山算法的直接含义,就是在该结点的下一层结点中,找到一个希望值最小或最大的结点进行扩展,一直这样走下去,不回头.在搜索的过程中,每次保存的结点既是每层最有希望的结点,也是解路径上的结点.

正因为登山算法有单刀直入的特点,因此,在编程序中,使用登山算法必须注意,若问题本身是属于"单峰"情况的,则登山算法就可直接求得最优解; 若在"多峰"情况下,则使用登山算法,就可能得不到最优解,而得到的是次优解或更次优解.

请看如下的例子.

【马的周游问题】

如下给出一个8*8的棋盘.现有一个马在棋盘的初始位置是随机给出的, 设为(X0,Y0).

┎┰┰┰┰┰┰┰┒马由初始点按跳日字规则在棋盘上进行周游, 棋盘上的每个┠╂╂╂╂╂╂╂┨点只能跳一次,问马该如何跳,恰好使马能跳到棋盘上的每一┠╂╂╂╂╂╂╂┨个点.试编程序,输出马的一种遍历棋盘的方案.

┠╂╂╂╂╂╂╂┨思路: 马的周游问题是一道传统的题目. 由于马在棋盘┠╂╂╂╂╂╂╂┨上的任意一点最多可按八个方向跳出,所以,该题最简单的解┠╂╂╂╂╂╂╂┨决办法就是采用搜索策略, 即: 在某一点先沿某一个方向跳┠╂╂╂╂╂╂╂┨出,当跳到某一步,某点的八个方向都不能再跳时, 则退回到┠╂╂╂╂╂╂╂┨上一点,在该点再沿另一个可跳方向跳出, 重复此搜索过程, ┖┸┸┸┸┸┸┸┚直到找到一种遍历的方案为止.

用全搜索的策略来寻找马的一种遍历方案,会遇到一个很严重的问题,就是搜索量太大.在全搜索的策略下,其搜索量在最坏的情况下,要搜索8`+64!`.因此,马的周游问题用全搜索策略来进行解答,不是一种好的解决方法.我们可以采用带启发信息的搜索策略,如:A*算法来进行求解,这样不仅可减少搜索的信息量,还可较快地寻找出马的遍历方案.

在这里,我们采用另外一种算法,采用一种不可撤回的搜索算法━━登山算法, 来求解马的周游棋盘的方案.

登山算法的处理过程,就是在某一点(层)对所有可能的搜索方向选择估价值最小(最大)的方向进行搜索,这个过程不断重复,一直进行下去(不回溯),直到生成解路径为止.

用登山算法求马的遍历方案,其处理过程如下:

用数组dx[i]表示列的位移量,数组dy[i]表示行的位移量,如下所示:

┎─┰─┰─┰─┰─┒

┃┃8 ┃┃1 ┃┃

┠─╂─╂─╂─╂─┨┎───┰─┰─┰─┰─┰─┰─┰─┰─┒

┃7 ┃┃┃┃2 ┃┃方向i=┃1 ┃2 ┃3 ┃4 ┃5 ┃6 ┃7 ┃8 ┃

┠─╂─╂─╂─╂─┨┠───╂─╂─╂─╂─╂─╂─╂─╂─┨

┃┃┃马┃┃┃┃dx[i] ┃1 ┃2 ┃2 ┃1 ┃-1┃-2 ┃-2┃-1┃

┠─╂─╂─╂─╂─┨┠───╂─╂─╂─╂─╂─╂─╂─╂─┨

┃6 ┃┃┃┃3 ┃┃dy[i] ┃2 ┃1 ┃-1┃-2 ┃-2┃-1┃1 ┃2 ┃

┠─╂─╂─╂─╂─┨┖───┸─┸─┸─┸─┸─┸─┸─┸─┚

┃┃5 ┃┃4 ┃┃

┖─┸─┸─┸─┸─┚方向位移量

图8.15 马的可跳方向

数组x[n]和y[n]分别表示存放马已走过的列和行坐标位置.变量n表示马跳的步数. 数组v[j,i]表示棋盘上坐标为(i,j)(i表示列,j表示行)的点是否走过标记.v[j,i]:=0表示该点没走过;v[j,i]:=n表示该点是第n步走过.变量dir表示方向值, 变量d表示某点的可跳方向数,变量f表示最小方向数.

(1). 设初值: 随机产生初始点的坐标位置(c,r),c表示列,r表示行.设n:=1,并将初始位置存入堆栈x[n]和y[n]中,并使v[r,c]:=n;

(2). 若n<64不成立,则转(5)打印解路径.若成立,则n:=n+1,并设最小方向数f:=9, 同时取出(n-1)点的坐标值给变量r,c,并继续(3);

(3). 在(n-1)步的位置上去计算,若沿八个方向分别跳出第n步,则跳出第n步后的坐标位置是否在棋盘的位置内,若不在棋盘内,则选另一个方向跳第n步;若在棋盘内, 则先判断跳出后的点是否已经被访问过,若访问过,则再选另一个方向跳第n步;若没有被访问过, 则计算跳出后的点,在该点上还有多少个可跳点,其可跳点数为d.若d

(4). 在(n-1)步沿方向dir跳出第n步后,计算其坐标位置为(r1,c1), 并将坐标值存入堆栈x[n]和y[n]中,同时设标记: v[r1,c1]:=n.再转(2);

(5). 打印解路径.

根据如上过程,可编程序如下:

program LT8_14;

const dx: array[1..8] of shortint=(1,2,2,1,-1,-2,-2,-1);

dy: array[1..8] of shortint=(2,1,-1,-2,-2,-1,1,2);

var x,y:array[1..64] of integer;

v:array[1..8,1..8] of integer;

r,c,i,j,n,f,d,c1,r1,dir,Gd,Gm:integer;

s:string[2];

procedure min(y,x:integer;var m:integer); {计算某点的可跳方向数}

var i,j,x1,y1:integer;

begin

m:=0;

for i:=1 to 8 do

begin

x1:=x+dx[i];y1:=y+dy[i];

if (x1>0)and(x1<9)and(y1>0)and(y1<9) then

if v[y1,x1]=0 then m:=m+1;

end;

end;

begin

fillchar(v,sizeof(v),0);randomize;

n:=1;r:=1+random(8);c:=1+random(8); {随机产生一个坐标点(c,r)}

x[n]:=c;y[n]:=r;v[r,c]:=n; {初值进堆栈,并设标记}

while n<64 do {判断64个点是否都跳完}

begin

n:=n+1;f:=9; {预跳第n步}

c:=x[n-1];r:=y[n-1]; {取出第n-1步的坐标}

for i:=1 to 8 do {在第n-1步的坐标上计算八}

begin {个方向的可跳数}

c1:=c+dx[i];r1:=r+dy[i]; {沿第i方向跳出的坐标}

if (c1>0)and(c1<9)and(r1>0)and(r1<9) then {判断是否越界}

if v[r1,c1]=0 then {若没出界,则新坐标是否已跳过}

begin

min(r1,c1,d); {若没跳过,则计算该点的可跳数}

if d

end;

end;

c1:=c+dx[dir];r1:=r+dy[dir]; {沿可跳数最小的方向跳出}

x[n]:=c1;y[n]:=r1;v[r1,c1]:=n {记录跳出的坐标,并作标记}

end;

for i:=1 to 64 do

begin

str(i,s);r:=y[i]*30+12;c:=x[i]*30+8;

end;

end.

执行如上程序,则屏幕会以图形方式显示出一种马的遍历方案.如下给出了两种遍历的方案:

44 51 12 57 26 5 10 7 64 13 30 33 44 15 28 19

13 58 43 50 11 8 25 4 31 34 63 14 29 18 41 16

52 45 60 29 56 27 6 9 12 61 32 45 58 43 20 27

59 14 55 42 49 30 3 24 35 50 59 62 25 40 17 42

46 53 48 61 28 35 20 31 60 11 54 39 46 57 26 21

15 62 39 54 41 32 23 2 49 36 51 56 53 24 3 6

38 47 64 17 36 21 34 19 10 55 38 47 8 5 22 1

63 16 37 40 33 18 1 22 37 48 9 52 23 2 7 4

由以上例子可知,采用登山算法解题,由于在搜索过程中是不回溯的,因此,出结果的速度就非常快,生成的空间也小,这是登山算法的优点, 但登山算法毕竟是一种不完备的搜索算法,因此,使用时要特别注意.

遗 传 算 法 详 解 ( 含 M A T L A B 代 码 )

GATBX遗传算法工具箱函数及实例讲解 基本原理: 遗传算法是一种典型的启发式算法,属于非数值算法范畴。它是模拟达尔文的自然选择学说和自然界的生物进化过程的一种计算模型。它是采用简单的编码技术来表示各种复杂的结构,并通过对一组编码表示进行简单的遗传操作和优胜劣汰的自然选择来指导学习和确定搜索的方向。遗传算法的操作对象是一群二进制串(称为染色体、个体),即种群,每一个染色体都对应问题的一个解。从初始种群出发,采用基于适应度函数的选择策略在当前种群中选择个体,使用杂交和变异来产生下一代种群。如此模仿生命的进化进行不断演化,直到满足期望的终止条件。 运算流程: Step 1:对遗传算法的运行参数进行赋值。参数包括种群规模、变量个数、交叉概率、变异概 率以及遗传运算的终止进化代数。 Step 2:建立区域描述器。根据轨道交通与常规公交运营协调模型的求解变量的约束条件,设置变量的取值范围。 Step 3:在Step 2的变量取值范围内,随机产生初始群体,代入适应度函数计算其适应度值。 Step 4:执行比例选择算子进行选择操作。 Step 5:按交叉概率对交叉算子执行交叉操作。

Step 6:按变异概率执行离散变异操作。 Step 7:计算Step 6得到局部最优解中每个个体的适应值,并执行最优个体保存策略。 Step 8:判断是否满足遗传运算的终止进化代数,不满足则返回Step 4,满足则输出运算结果。 运用遗传算法工具箱: 运用基于Matlab的遗传算法工具箱非常方便,遗传算法工具箱里包括了我们需要的各种函数库。目前,基于Matlab的遗传算法工具箱也很多,比较流行的有英国设菲尔德大学开发的遗传算法工具箱GATBX、GAOT以及Math Works公司推出的GADS。实际上,GADS就是大家所看到的Matlab中自带的工具箱。我在网上看到有问为什么遗传算法函数不能调用的问题,其实,主要就是因为用的工具箱不同。因为,有些人用的是GATBX带有的函数,但MATLAB自带的遗传算法工具箱是GADS,GADS当然没有GATBX里的函数,因此运行程序时会报错,当你用MATLAB来编写遗传算法代码时,要根据你所安装的工具箱来编写代码。 以GATBX为例,运用GATBX时,要将GATBX解压到Matlab下的toolbox文件夹里,同时,set path将GATBX文件夹加入到路径当中。 这块内容主要包括两方面工作:1、将模型用程序写出来(.M文件),即目标函数,若目标函数非负,即可直接将目标函数作为适应度函数。2、设置遗传算法的运行参数。包括:种群规模、变量个数、区域描述器、交叉概率、变异概率以及遗传运算的终止进化代数等等。

遗传算法代码

%求下列函数的最大值% %f(x)=10*sin(5x)+7*cos(4x)x∈[0,10]% %将x的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01。% %将变量域[0,10]离散化为二值域[0,1023],x=0+10*b/1023,其中b是[0,1023]中的一个二值数。 %2.1初始化(编码) %initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), %长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name:initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength));%rand随机产生每个单元为{0,1}行数为popsize,列数为chromlength的矩阵, %roud对矩阵的每个单元进行圆整。这样产生的初始种群。 %2.2计算目标函数值 %2.2.1将二进制数转化为十进制数(1) %遗传算法子程序 %Name:decodebinary.m %产生[2^n2^(n-1)...1]的行向量,然后求和,将二进制转化为十进制function pop2=decodebinary(pop) [px,py]=size(pop);%求pop行和列数 for i=1:py pop1(:,i)=2.^(py-i).*pop(:,i); end pop2=sum(pop1,2);%求pop1的每行之和 %2.2.2将二进制编码转化为十进制数(2) %decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置 %(对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1), %参数1ength表示所截取的长度(本例为10)。 %遗传算法子程序 %Name:decodechrom.m

遗传算法简介及代码详解

遗传算法简述及代码详解 声明:本文内容整理自网络,认为原作者同意转载,如有冒犯请联系我。 遗传算法基本内容 遗传算法为群体优化算法,也就是从多个初始解开始进行优化,每个解称为一个染色体,各染色体之间通过竞争、合作、单独变异,不断进化。 遗传学与遗传算法中的基础术语比较 染色体:又可以叫做基因型个体(individuals) 群体/种群(population):一定数量的个体组成,及一定数量的染色体组成,群体中个体的数 量叫做群体大小。 初始群体:若干染色体的集合,即解的规模,如30,50等,认为是随机选取的数据集合。适应度(fitness):各个个体对环境的适应程度 优化时先要将实际问题转换到遗传空间,就是把实际问题的解用染色体表示,称为编码,反过程为解码/译码,因为优化后要进行评价(此时得到的解是否较之前解优越),所以要返回问题空间,故要进行解码。SGA采用二进制编码,染色体就是二进制位串,每一位可称为一个基因;如果直接生成二进制初始种群,则不必有编码过程,但要求解码时将染色体解码到问题可行域内。 遗传算法的准备工作: 1) 数据转换操作,包括表现型到基因型的转换和基因型到表现型的转换。前者是把求解空间中的参数转化成遗传空间中的染色体或者个体(encoding),后者是它的逆操作(decoding) 2) 确定适应度计算函数,可以将个体值经过该函数转换为该个体的适应度,该适应度的高低要能充分反映该个体对于解得优秀程度。非常重要的过程。 遗传算法基本过程为: 1) 编码,创建初始群体 2) 群体中个体适应度计算 3) 评估适应度 4) 根据适应度选择个体 5) 被选择个体进行交叉繁殖 6) 在繁殖的过程中引入变异机制 7) 繁殖出新的群体,回到第二步

遗传算法综述

随着经济社会的迅猛发展, 人类科学研究与生产活动的广度与深度都大大拓展了,其中涌现出的大量具有各种非线性、不确定、不能精确解析以及建模机理复杂的新课题对信息与控制科学提出了前所未有的挑战。正是在这种背景下, 各种智能信息处理算法如雨后春笋般涌现出来。作为智能信息处理算法中的重要一员, 遗传算法近年来以其独特而卓越的性能引起了人们的广泛关注。 对于以往难以解决的函数优化问题,复杂的多目标规划问题,工农业生产中的配管、配线问题,以及机器学习,图象识别,人工神经网络的权系数调整,模糊规则的优化和网络构造等诸多问题,GA遗传算法以其出色的表现,已成为人们最常用也最有效的方法之一。虽然GA在许多优化问题中都有成功的应用,但其本身也存在一些不足,主要有:局部搜索能力弱、存在早熟成熟现象、收敛于局部最优解、随机漫游或振荡等现象,从而影响算法的收敛性能,降低了遗传算法的可信度。如何改善遗传算法的搜索能力和提高算法的收敛速度,使其更好地解决实际问题,是各国学者一直努力探索的一个主要课题。纵观成百上千的对遗传算法进行改进研究文献,其主要改进措施多集中在以下几个方面: 1.对遗传算法本身缺点的改进 1.1对遗传算法本身单一缺点的改进 种群人们主要关心的是种群中个体分布的多样性,这决定着运行遗传算法的效率,与种群相关的因素有种群个数,种群大小及初始种群三方面。

种群个数采用多个子种群并行搜索思想,有效避免了欺骗问题,提高了算法成功的概率。典型应用就是小生境技术,种群由M个子种群组成,每个子种群独立进化,种群间通过种群迁移∕移民等机制完成个体信息的交换。借鉴子种群并行的思想,发展出了思维进化计算,文献【】和量子衍生遗传算法或量子衍生进化计算,文献【】【】。 种群大小大致有固定种群和动态种群两种。 初始种群对于初始种群的生成主要是改变了以往单靠随机生成的缺点,引进了解空间格点化法或数论中均匀设计法,使产生的点集能均匀地分布于解空间。当然采用随机与均匀混合生成的初始种群,可以包含更丰富的解空间模式。文献【】,给出了用点的低序列差均匀生成初始种群的方法。(当然这些方法 编码经典的标准遗传算法( SGA )中,Holland运用模式定理分析编码机制时,建议采用二进制编码,其优点是简易稳定,但二进制编码具有不能直接反映问题的固有结构,解码复杂,精度不高,个体长度太长,占用计算机内存多和空间效率不高的缺点。它早已不能适应人们处理问题多样化的事实。 针对上述缺陷, 人们采用Gray编码和动态编码等方法成功地减少了编码的尺寸和复杂度,提高了局部搜索性能和速度。文献【】,给出了采用了性别编码,检测仿真表明其性能优于二进制和格雷码;采用染色体隐式解码算法,使得解码速度提高了6~50倍[9];采用实数或浮点数的矩阵形式或复数形式的编码方法,实现了无需解码可直

遗传算法

遗传算法的基本理论 一、起源: 早在20世纪50年代和60年代,就有少数人几个计算机科学家独立地进行了所谓的“人工进化系统”研究,其出发点是进化的思想可以发展成为许多工程问题的优化工具。早期的研究形成了遗传算法的雏形,如大多数系统都遵循“适者生存”的仿自然法则,有些系统采用了基于群体(population)的设计方案,并且加入了自然选择与变异操作,还有一些系统对生物染色体编码进行了抽象处理,应用二进制编码。由于缺乏一种通用的编码方案,人们只能依赖变异而非交叉来产生新的基因结构,早期的算法收敛甚微。20世纪60年代中期,美国Michigan大学的John Holland在A.S.Fraser和H.J.Bremermann等人工作的基础上提出了位串编码技术。这种编码既适用于变异操作,又适用于交叉(即杂交)操作。并且强调将交叉作为主要的遗传操作。随后,Holland将该算法用于自然和人工系统的自适应行为的研究中,并于1975年出版了其开创性著作“Adaption in Natural and Artificial System”。以后,Holland等人将该算法加以推广,应用到优化及机器学习等问题中,并正式定名为遗传算法。遗传算法的通用编码技术和简单有效的遗传操作作为其广泛、成功地应用奠定了基础。Holland早期有关遗传算法的许多概念一直沿用至今,可见Holland对遗传算法的贡献之大。他认为遗传算法本质上是适应算法,应用最多的是系统最优化的研究。 二、发展: 年份贡献者内容 1962Holland程序漫游元胞计算机自适应系统框架 1968Holland模式定理的建立 1971Hollstein具有交配和选择规则的二维函数优化 1972Bosworth、Foo、Zeigler提出具有复杂变异、类似于遗传算法的基因操作1972Frantz位置非线性和倒位操作研究 1973Holland遗传算法中试验的最优配置和双臂强盗问题 1973Martin类似遗传真法的概率算法理论 1975De Jong用于5个测试函数的研究基本遗传算法基准参数 1975Holland 出版了开创性著作《Adaptation in Natural and Artificial System》 1981Bethke应用Walsh函数分析模式 1981Brindle研究遗传算法中的选择和支配问题 1983Pettit、Swigger遗传算法应用于非稳定问题的粗略研究1983Wetzel用遗传算法解决旅行商问题(TSP) 1984Mauldin基本遗传算法小用启发知识维持遗传多样性1985Baker试验基于排序的选择方法 1985Booker建议采用部分匹配计分、分享操作和交配限制法1985Goldberg、Lingle TSP问题个采用部分匹配交叉 1985Grefenstette、Fitzpattrick对含噪声的函数进行测试 1985Schaffer多种群遗传算法解决多目标优化问题1986Goldberg最优种群大小估计 1986Grefenstette元级遗传算法控制的遗传算法 1987Baker选择中随机误差的减少方法 1987Goldberg复制和交叉时最小欺骗问题(MDP) 1987Goldberg、Richardson借助分享函数的小生境和物种归纳法

遗传算法代码

% 求下列函数的最大值% % f(x)=10*sin(5x)+7*cos(4x) x∈[0,10] % % 将x 的值用一个10位的二值形式表示为二值问题,一个10位的二值数提供的分辨率是每为(10-0)/(2^10-1)≈0.01 。% % 将变量域[0,10] 离散化为二值域[0,1023], x=0+10*b/1023, 其中b 是[0,1023] 中的一个二值数。 % 2.1初始化(编码) % initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度), % 长度大小取决于变量的二进制编码的长度(在本例中取10位)。 %遗传算法子程序 %Name: initpop.m %初始化 function pop=initpop(popsize,chromlength) pop=round(rand(popsize,chromlength)); % rand随机产生每个单元为{0,1} 行数为popsize,列数为chromlength的矩阵, % roud对矩阵的每个单元进行圆整。这样产生的初始种群。 % 2.2 计算目标函数值 % 2.2.1 将二进制数转化为十进制数(1) %遗传算法子程序 %Name: decodebinary.m %产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制function pop2=decodebinary(pop) [px,py]=size(pop); %求pop行和列数 for i=1:py pop1(:,i)=2.^(py-i).*pop(:,i); end pop2=sum(pop1,2); %求pop1的每行之和 % 2.2.2 将二进制编码转化为十进制数(2) % decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置 % (对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。本例为1), % 参数1ength表示所截取的长度(本例为10)。 %遗传算法子程序 %Name: decodechrom.m

遗传算法实验报告

人工智能实验报告

遗传算法实验报告 一、问题描述 对遗传算法的选择操作,设种群规模为4,个体用二进制编码,适应度函数,x的取值区间为[0,30]。 若遗传操作规定如下: (1)选择概率为100%,选择算法为轮盘赌算法; (2)交叉概率为1,交叉算法为单点交叉,交叉顺序按个体在种群中的顺序; (3)变异几率为0 请编写程序,求取函数在区间[0,30]的最大值。 二、方法原理 遗传算法:遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。与传统的优化算法相比,遗传算法具有如下优点:不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。遗传操作包括三个算子:选择、交叉和变异。选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。选择算子的作用效果是提高了群体的平均适应值。由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。变异是对个体的某一个或某一些基因值按某一较小概率进行改变。从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。交叉和变异相配合,共同完成对搜索空间的全局和局部搜索。 三、实现过程 (1)编码:使用二进制编码,随机产生一个初始种群。L 表示编码长度,通常由对问题的求解精度决定,编码长度L 越长,可期望的最优解的精度也就越高,过大的L 会增大运算量。 (2)生成初始群体:种群规模表示每一代种群中所含个体数目。随机产生N个初始串结构数据,每个串结构数据成为一个个体,N个个体组成一个初始群体,N表示种群规模的大小。当N取值较小时,可提高遗传算法的运算速度,但却降低种群的多样性,容易引起遗传算法早熟,出现假收敛;而N当取值较大时,又会使得遗传算法效率降低。一般建议的取值范围是20—100。遗传算法以该群体作为初始迭代点; (3)适应度检测:根据实际标准计算个体的适应度,评判个体的优劣,即该个体所代表的可行解的优劣。本例中适应度即为所求的目标函数; (4)选择:从当前群体中选择优良(适应度高的)个体,使它们有机会被选中进入下一次迭代过程,舍弃适应度低的个体。本例中采用轮盘赌的选择方法,即个体被选择的几率与其适应度值大小成正比; (5)交叉:遗传操作,根据设置的交叉概率对交配池中个体进行基因交叉操作,形成新一代的种群,新一代中间个体的信息来自父辈个体,体现了信息交换的原则。交叉概率控制着交叉操作的频率,由于交叉操作是遗传算法中产生新个体的主要方法,所以交叉概率通常

多种群遗传算法的函数优化算法

多种群遗传算法的函数优化算法 1、案例背景 针对遗传算法所存在的问题,一种多种群遗传算法结构模型(Multiple Population GA,简称MPGA)可以用来取代常规的标准计算模型(SGA)。 MPGA在SGA的基础上主要引入了以下几个概念: (1)突破SGA仅靠单个群体进行遗传进化的框架,引入多个种群同时进行优化搜索;不同的种群赋以不同的控制参数,实现不同的搜索目的。 (2)各个种群之间通过移民算子进行联系,实现多种群的协同进化;最优解的获取是多个种群协同进化的综合结果。 (3)通过人工选择算子保存各种群每个进化代中的最优个体,并作为判断算法收敛的依据。 图 7-1 MPGA的算法结构示意图 复杂二元函数求最值:

图 7-2 二元函数图像 2、案例目录: 第7章多种群遗传算法的函数优化算法7.1 理论基础 7.1.1遗传算法早熟问题 7.1.2多种群遗传算法概述 7.2案例背景 7.2.1问题描述 7.2.2解决思路及步骤 7.3 MATLAB程序实现 7.3.1移民算子 7.3.2人工选择算子 7.3.3目标函数 7.3.4标准遗传算法主函数 7.3.5多种群遗传算法主函数 7.3.6结果分析 7.4延伸阅读 7.5 参考文献 3、主程序: %% 多种群遗传算法 clear; clc close all NIND=40; %个体数目

NVAR=2; %变量的维数 PRECI=20; %变量的二进制位数 GGAP=0.9; %代沟 MP=10; %种群数目 FieldD=[rep(PRECI,[1,NVAR]);[-3,4.1;12.1,5.8];rep([1;0;1;1],[1,NVAR])]; %译码矩阵 for i=1:MP Chrom{i}=crtbp(NIND, NVAR*PRECI); %创建初始种群 end pc=0.7+(0.9-0.7)*rand(MP,1); %在【0.7,0.9】范围i内随机产生交叉概率 pm=0.001+(0.05-0.001)*rand(MP,1); %在【0.001,0.05】范围内随机产生变异概率 gen=0; %初始遗传代数 gen0=0; %初始保持代数 MAXGEN=10; %最优个体最少保持代数 maxY=0; %最优值 for i=1:MP ObjV{i}=ObjectFunction(bs2rv(Chrom{i}, FieldD));%计算各初始种群个体的目标函数值 end MaxObjV=zeros(MP,1); %记录精华种群 MaxChrom=zeros(MP,PRECI*NVAR); %记录精华种群的编码 while gen0<=MAXGEN gen=gen+1; %遗传代数加1 for i=1:MP FitnV{i}=ranking(-ObjV{i}); % 各种群的适应度 SelCh{i}=select('sus', Chrom{i}, FitnV{i},GGAP); % 选择操作 SelCh{i}=recombin('xovsp',SelCh{i}, pc(i)); % 交叉操作 SelCh{i}=mut(SelCh{i},pm(i)); % 变异操作 ObjVSel=ObjectFunction(bs2rv(SelCh{i}, FieldD)); % 计算子代目标函数值 [Chrom{i},ObjV{i}]=reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel); %重插入操作 end [Chrom,ObjV]=immigrant(Chrom,ObjV); % 移民操作 [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom); % 人工选择精华种群YY(gen)=max(MaxObjV); %找出精华种群中最优的个体 if YY(gen)>maxY %判断当前优化值是否与前一次优化值相同 maxY=YY(gen); %更新最优值 gen0=0; else gen0=gen0+1; %最优值保持次数加1 end end %% 进化过程图 plot(1:gen,YY) xlabel('进化代数') ylabel('最优解变化') title('进化过程')

相关文档
最新文档