人工智能.docx
- 文档编号:30379084
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:12
- 大小:26.53KB
人工智能.docx
《人工智能.docx》由会员分享,可在线阅读,更多相关《人工智能.docx(12页珍藏版)》请在冰豆网上搜索。
人工智能
课题:
遗传算法
专业:
软件工程
学号:
姓名:
遗传算法
遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。
进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。
遗传算法通常实现方式为一种计算机模拟。
对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化。
传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。
进化从完全随机个体的种群开始,之后一代一代发生。
在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。
进入90年代,遗传算法迎来了兴盛发展时期,无论是理论研究还是应用研究都成了十分热门的课题。
尤其是遗传算法的应用研究显得格外活跃,不但它的应用领域扩大,而且利用遗传算法进行优化和规则学习的能力也显著提高,同时产业应用方面的研究也在摸索之中。
此外一些新的理论和方法在应用研究中亦得到了迅速的发展,这些无疑均给遗传算法增添了新的活力。
遗传算法的应用研究已从初期的组合优化求解扩展到了许多更新、更工程化的应用方面。
随着应用领域的扩展,遗传算法的研究出现了几个引人注目的新动向:
一是基于遗传算法的机器学习,这一新的研究课题把遗传算法从历来离散的搜索空间的优化搜索算法扩展到具有独特的规则生成功能的崭新的机器学习算法。
这一新的学习机制对于解决人工智能中知识获取和知识优化精炼的瓶颈难题带来了希望。
二是遗传算法正日益和神经网络、模糊推理以及混沌理论等其它智能计算方法相互渗透和结合,这对开拓21世纪中新的智能计算技术将具有重要的意义。
三是并行处理的遗传算法的研究十分活跃。
这一研究不仅对遗传算法本身的发展,而且对于新一代智能计算机体系结构的研究都是十分重要的。
四是遗传算法和另一个称为人工生命的崭新研究领域正不断渗透。
所谓人工生命即是用计算机模拟自然界丰富多彩的生命现象,其中生物的自适应、进化和免疫等现象是人工生命的重要研究对象,而遗传算法在这方面将会发挥一定的作用,五是遗传算法和进化规划(EvolutionProgramming,EP)以及进化策略(EvolutionStrategy,ES)等进化计算理论日益结合。
EP和ES几乎是和遗传算法同时独立发展起来的,同遗传算法一样,它们也是模拟自然界生物进化机制的智能计算方法,即同遗传算法具有相同之处,也有各自的特点。
目前,这三者之间的比较研究和彼此结合的探讨正形成热点。
1991年D.Whitey在他的论文中提出了基于领域交叉的交叉算子(Adjacencybasedcrossover),这个算子是特别针对用序号表示基因的个体的交叉,并将其应用到了TSP问题中,通过实验对其进行了验证。
D.H.Ackley等提出了随机迭代遗传爬山法(StochasticIteratedGeneticHill-climbing,SIGH)采用了一种复杂的概率选举机制,此机制中由m个“投票者”来共同决定新个体的值(m表示群体的大小)。
实验结果表明,SIGH与单点交叉、均匀交叉的神经遗传算法相比,所测试的六个函数中有四个表现出更好的性能,而且总体来讲,SIGH比现存的许多算法在求解速度方面更有竞争力。
H.Bersini和G.Seront将遗传算法与单一方法(simplexmethod)结合起来,形成了一种叫单一操作的多亲交叉算子(simplexcrossover),该算子在根据两个母体以及一个额外的个体产生新个体,事实上他的交叉结果与对三个个体用选举交叉产生的结果一致。
同时,文献还将三者交叉算子与点交叉、均匀交叉做了比较,结果表明,三者交叉算子比其余两个有更好的性能。
国内也有不少的专家和学者对遗传算法的交叉算子进行改进。
2002年,戴晓明等应用多种群遗传并行进化的思想,对不同种群基于不同的遗传策略,如变异概率,不同的变异算子等来搜索变量空间,并利用种群间迁移算子来进行遗传信息交流,以解决经典遗传算法的收敛到局部最优值问题
2004年,赵宏立等针对简单遗传算法在较大规模组合优化问题上搜索效率不高的现象,提出了一种用基因块编码的并行遗传算法(Building-blockCodedParallelGA,BCPGA)。
该方法以粗粒度并行遗传算法为基本框架,在染色体群体中识别出可能的基因块,然后用基因块作为新的基因单位对染色体重新编码,产生长度较短的染色体,在用重新编码的染色体群体作为下一轮以相同方式演化的初始群体。
2005年,江雷等针对并行遗传算法求解TSP问题,探讨了使用弹性策略来维持群体的多样性,使得算法跨过局部收敛的障碍,向全局最优解方向进化。
遗传算法应用实例
%求下列函数的最大值%
%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
%初始化
functionpop=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]的行向量,然后求和,将二进制转化为十进制
functionpop2=decodebinary(pop)
[px,py]=size(pop);%求pop行和列数
fori=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
%将二进制编码转换成十进制
functionpop2=decodechrom(pop,spoint,length)
pop1=pop(:
spoint:
spoint+length-1);
pop2=decodebinary(pop1);
%2.2.3计算目标函数值
%calobjvalue.m函数的功能是实现目标函数的计算,其公式采用本文示例仿真,可根据不同优化问题予以修改。
%遗传算法子程序
%Name:
calobjvalue.m
%实现目标函数的计算
function[objvalue]=calobjvalue(pop)
temp1=decodechrom(pop,1,10);%将pop每行转化成十进制数
x=temp1*10/1023;%将二值域中的数转化为变量域的数
objvalue=10*sin(5*x)+7*cos(4*x);%计算目标函数值
%2.3计算个体的适应值
%遗传算法子程序
%Name:
calfitvalue.m
%计算个体的适应值
functionfitvalue=calfitvalue(objvalue)
globalCmin;
Cmin=0;
[px,py]=size(objvalue);
fori=1:
px
ifobjvalue(i)+Cmin>0
temp=Cmin+objvalue(i);
else
temp=0.0;
end
fitvalue(i)=temp;
end
fitvalue=fitvalue';
%2.4选择复制
%选择或复制操作是决定哪些个体可以进入下一代。
程序中采用赌轮盘选择法选择,这种方法较易实现。
%根据方程pi=fi/∑fi=fi/fsum,选择步骤:
%1)在第t代,由
(1)式计算fsum和pi
%2)产生{0,1}的随机数rand(.),求s=rand(.)*fsum
%3)求∑fi≥s中最小的k,则第k个个体被选中
%4)进行N次2)、3)操作,得到N个个体,成为第t=t+1代种群
%遗传算法子程序
%Name:
selection.m
%选择复制
function[newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue);%求适应值之和
fitvalue=fitvalue/totalfit;%单个个体被选择的概率
fitvalue=cumsum(fitvalue);%如fitvalue=[1234],则cumsum(fitvalue)=[13610]
[px,py]=size(pop);
ms=sort(rand(px,1));%从小到大排列
fitin=1;
newin=1;
whilenewin<=px
if(ms(newin)) newpop(newin)=pop(fitin); newin=newin+1; else fitin=fitin+1; end end %2.5交叉 %交叉(crossover),群体中的每个个体之间都以一定的概率pc交叉,即两个个体从各自字符串的某一位置 %(一般是随机确定)开始互相交换,这类似生物进化过程中的基因分裂与重组。 例如,假设2个父代个体x1,x2为: %x1=0100110 %x2=1010001 %从每个个体的第3位开始交叉,交又后得到2个新的子代个体y1,y2分别为: %y1=0100001 %y2=1010110 %这样2个子代个体就分别具有了2个父代个体的某些特征。 利用交又我们有可能由父代个体在子代组合成具有更高适合度的个体。 %事实上交又是遗传算法区别于其它传统优化方法的主要特点之一。 %遗传算法子程序 %Name: crossover.m %交叉 function[newpop]=crossover(pop,pc) [px,py]=size(pop); newpop=ones(size(pop)); fori=1: 2: px-1 if(rand cpoint=round(rand*py); newpop(i,: )=[pop(i,1: cpoint),pop(i+1,cpoint+1: py)]; newpop(i+1,: )=[pop(i+1,1: cpoint),pop(i,cpoint+1: py)]; else newpop(i,: )=pop(i); newpop(i+1,: )=pop(i+1); end end %2.6变异 %变异(mutation),基因的突变普遍存在于生物的进化过程中。 变异是指父代中的每个个体的每一位都以概率pm翻转,即由“1”变为“0”, %或由“0”变为“1”。 遗传算法的变异特性可以使求解过程随机地搜索到解可能存在的整个空间,因此可以在一定程度上求得全局最优解。 %遗传算法子程序 %Name: mutation.m %变异 function[newpop]=mutation(pop,pm) [px,py]=size(pop); newpop=ones(size(pop)); fori=1: px if(rand mpoint=round(rand*py); ifmpoint<=0 mpoint=1; end newpop(i)=pop(i); ifany(newpop(i,mpoint))==0 newpop(i,mpoint)=1; else newpop(i,mpoint)=0; end else newpop(i)=pop(i); end end %2.7求出群体中最大得适应值及其个体 %遗传算法子程序 %Name: best.m %求出群体中适应值最大的值 function[bestindividual,bestfit]=best(pop,fitvalue) [px,py]=size(pop); bestindividual=pop(1,: ); bestfit=fitvalue (1); fori=2: px iffitvalue(i)>bestfit bestindividual=pop(i,: ); bestfit=fitvalue(i); end end %2.8主程序 %遗传算法主程序 %Name: genmain05.m clear clf popsize=20;%群体大小 chromlength=10;%字符串长度(个体长度) pc=0.6;%交叉概率 pm=0.001;%变异概率 pop=initpop(popsize,chromlength);%随机产生初始群体 fori=1: 20%20为迭代次数 [objvalue]=calobjvalue(pop);%计算目标函数 fitvalue=calfitvalue(objvalue);%计算群体中每个个体的适应度 [newpop]=selection(pop,fitvalue);%复制 [newpop]=crossover(pop,pc);%交叉 [newpop]=mutation(pop,pc);%变异 [bestindividual,bestfit]=best(pop,fitvalue);%求出群体中适应值最大的个体及其适应值 y(i)=max(bestfit); n(i)=i; pop5=bestindividual; x(i)=decodechrom(pop5,1,chromlength)*10/1023; pop=newpop; end fplot('10*sin(5*x)+7*cos(4*x)',[010]) holdon plot(x,y,'r*') holdoff [zindex]=max(y);%计算最大值及其位置 x5=x(index)%计算最大值对应的x值 y=z 【问题】求f(x)=x10*sin(5x)7*cos(4x)的最大值,其中0<=x<=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08 【程序清单】 %编写目标函数 function[sol,eval]=fitness(sol,options) x=sol (1); eval=x10*sin(5*x)7*cos(4*x); %把上述函数存储为fitness.m文件并放在工作目录下 initPop=initializega(10,[09],'fitness');%生成初始种群,大小为10 [xendPop,bPop,trace]=ga([09],'fitness',[],initPop,[1e-611],'maxGenTerm',25,'normGeomSelect',... [0.08],['arithXover'],[2],'nonUnifMutation',[2253])%25次遗传迭代 运算借过为: x= 7.856224.8553(当x为7.8562时,f(x)取最大值24.8553) 注: 遗传算法一般用来取得近似最优解,而不是最优解。 遗传算法实例2 【问题】在-5<=Xi<=5,i=1,2区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2x2.^2)))-exp(0.5*(cos(2*pi*x1)cos(2*pi*x2)))22.71282的最小值。 【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 【程序清单】 %源函数的matlab代码 function[eval]=f(sol) numv=size(sol,2); x=sol(1: numv); eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)22.71282; %适应度函数的matlab代码 function[sol,eval]=fitness(sol,options) numv=size(sol,2)-1; x=sol(1: numv); eval=f(x); eval=-eval; %遗传算法的matlab代码 bounds=ones(2,1)*[-55]; [p,endPop,bestSols,trace]=ga(bounds,'fitness') 注: 前两个文件存储为m文件并放在工作目录下,运行结果为 p= 0.0000-0.00000.0055 大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。 matlab命令行执行命令: fplot('x10*sin(5*x)7*cos(4*x)',[0,9]) evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。 xoverops是传递给交叉函数的参数。 mutops是传递给变异函数的参数。 【问题】求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9 【分析】选择二进制编码,种群中的个体数目为10,二进制编码长度为20,交叉概率为0.95,变异概率为0.08 【程序清单】 %编写目标函数 function[sol,eval]=fitness(sol,options) x=sol (1); eval=x+10*sin(5*x)+7*cos(4*x); %把上述函数存储为fitness.m文件并放在工作目录下 initPop=initializega(10,[09],'fitness');%生成初始种群,大小为10 [xendPop,bPop,trace]=ga([09],'fitness',[],initPop,[1e-611],'maxGenTerm',25,'normGeomSelect',... [0.08],['arithXover'],[2],'nonUnifMutation',[2253])%25次遗传迭代 运算借过为: x= 7.856224.8553(当x为7.8562时,f(x)取最大值24.8553) 注: 遗传算法一般用来取得近似最优解,而不是最优解。 遗传算法实例2 【问题】在-5<=Xi<=5,i=1,2区间内,求解 f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282的最小值。 【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 【程序清单】 %源函数的matlab代码 function[eval]=f(sol) numv=size(sol,2); x=sol(1: numv); eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282; %适应度函数的matlab代码 function[sol,eval]=fitness(sol,options) numv=size(sol,2)-1; x=sol(1: numv); eval=f(x); eval=-eval; %遗传算法的matlab代码 bounds=ones(2,1)*[-55]; [p,endPop,bestSols,trace]=ga(bounds,'fitness') 注: 前两个文件存储为m文件并放在工作目录下,运行结果为 p= 0.0000-0.00000.0055 大家可以直接绘出f(x)的图形来大概看看f(x)的最值是多少,也可是使用优化函数来验证。 matlab命令行执行命令: fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9]) evalops是传递给适应度函数的参数,opts是二进制编码的精度,termops是选择maxGenTerm结束函数时传递个maxGenTerm的参数,即遗传代数。 xoverops是传递给交叉函数的参数。 mutops是传递给变异函数的参数 参考文献: 遗传算法在图像处理中的应用作者: 田莹,苑玮琦中国图像图形学报2007-3-15 遗传算法的一些改进及其应用作者: 崔珊珊中国科学技术大学中国知网2010-5-10 实数遗传算法的改进及性能研究作者: 任子武,伞治电子学报期刊2007-2-28
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 人工智能