《2022年遗传算符MATLAB程序-入门必看.docx》由会员分享,可在线阅读,更多相关《2022年遗传算符MATLAB程序-入门必看.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - % 下面举例说明遗传算法 % % 求以下函数的最大值 % % fx=10*sin5x+7*cos4x x0,10 % % 将 x 的值用一个 10 位的二值形式表示为二值问题,一个 10 位的二值数供应的辨论率是每为10-0/210- 1 0.01 ; % % 将变量域0,10 离散化为二值域0,1023, x=0+10*b/1023, 其中b 是 0,1023 中的一个二值数;% M 文件函数定义语句:function 输出变量 =函数名称(输入变量1,输入变量2, )语句 ; %输入变量与输出变量的关系end; %非必需的例如:functi
2、on c=myadda,b c=a+b; 调用方式:c=myadd1,2 % 输出结果为c=a+b=1+2=3 % 2.1 初始化 编码 % initpop.m 函数的功能是实现群体的初始化 ,popsize 表示 群体的大小 ,chromlength 表示染色体的长度二值数的长度 ,% 长度大小取决于变量的二进制编码的长度在本例中取10 位;%遗传算法子程序%Name: initpop.m (实现群体的初始化)%初始化function pop=initpoppopsize,chromlength %定义 M 文件函数(实现种群初始化的函数)pop=roundrandpopsize,chrom
3、length; % rand()随机产生函数;rand 随机产生每个单元为 0,1 行数为 popsize,列数 为 chromlength 的矩阵, 此式子为输出变量 pop 与输入变量 popsize和 chromlength 的关系式 ;% round 对矩阵的每个单元进 行圆整, round 函数的作用是按 指定的位数 对数值进行四舍五入;这样产生的初始种群;% r% 2.2 运算目标函数值 % 2.2.1 将二进制数转化为十进制数 1 %遗传算法子程序 %Name: decodebinary.m %产生2n 2n-1 . 1 的行向量,然后求和,将二进制转化为十进制function
4、pop2=decodebinarypop % 定义 M 文件函数(将二进制数转化为十进制数的函数)px,py=sizepop; % 求 pop 的行数和列数;px 为种群数,染色体的长度为py for i=1:py pop1:,i=2.py-i.*pop:,i; %pop1:,i 表示 pop1 矩阵的第 i 列全部元素 end pop2=sumpop1,2; % 求 pop1 的每行之和 %matlab 中 sum函数的用法 %a=sumx; % 对 x 矩阵的列求和 a=sumx,2; % 对 x 矩阵的行求和 a=sumx:; %x 矩阵的全部元素求和 %A:,j 表示提取 A 矩阵的第
5、 j 列全部元素 Ai,: 表示提取 A 矩阵的第 i 行元素,Ai, j 表示提取 A 矩阵的第 i 行第 j 列的元素;名师归纳总结 % 2.2.2 将二进制编码转化为十进制数2 第 1 页,共 8 页- - - - - - -精选学习资料 - - - - - - - - - % decodechrom.m 函数的功能是 将染色体 或二进制编码 的特定位置转换为十进制,参数spoint 表示待解码的二进制串的起始位置% 对于多个变量而言,如有两个变量,采纳20 为表示,每个变量10 为,就第一个变量从1 开头,另一个变量从11 开头;本例为1,10);% 参数 1ength 表示所截取的长
6、度(本例为%遗传算法子程序%Name: decodechrom.m (将染色体二进制编码转换成十进制)function pop2=decodechrompop,spoint,length %参数 spoint 表示待解码的二进制串的起始位置pop1=pop:,spoint:spoint+length-1; %提取矩阵 pop 的第 spoint 到 spoint+length-1 列,形成一个新矩阵pop1;pop2=decodebinarypop1; % 解二进制码% 2.2.3 运算目标函数值% calobjvalue.m 函数的功能是 实现目标函数的运算,其公式采纳本文示例仿真,可依据不
7、同优化问题予以修改;%遗传算法子程序 %Name: calobjvalue.m %实现目标函数的运算 function objvalue=calobjvaluepop temp1=decodechrompop,1,10; % 将 pop 每行转化成十进制数,1 代表待解码的二进制串起始位置,10 代表截取的长度x=temp1*10/1023; % 将二值域中的数转化为变量域的数 objvalue=10*sin5*x+7*cos4*x; % 运算目标函数值% 2.3 运算个体的适应值 %遗传算法子程序 %Name:calfitvalue.m %运算个体的适应值 % A=3 4 2;1 5 3;4
8、 7 1 A = 3 4 2 1 5 3 4 7 1 A1=3 ;A2 =1 ;A3=4 ;A4=4 ; A5=5 %依据 2.2.3 运算出的目标函数值运算个体的适应值 function fitvalue=calfitvalueobjvalue % 定义函数 global Cmin; %global 表示全局 Cmin=0; px,py=sizeobjvalue; % objvalue 为列向量矩阵 for i=1:px if objvaluei+Cmin0 % objvaluei 表示矩阵 objvalue 的第 i 个元素(从上往下数)temp=Cmin+objvaluei; else
9、temp=0.0; end fitvaluei=temp; % 列向量矩阵 end fitvalue 为 px 个循环中 temp 的值构成的;名师归纳总结 fitvalue=fitvalue; % 运算符 表示向量的复共轭,最终的fitvalue 为行向量矩阵第 2 页,共 8 页- - - - - - -精选学习资料 - - - - - - - - - % 2.4 挑选复制其算法为:设置挑选算法执行次数 j=0 在区间 0, totalFitness内产生一随机数rands, totalFitness表示种群个体适应度之和i=0,sum=0;其中 i 表示第 i 个个体, sum 表示 0
10、 i 的个体的适应度值之和sum = sum +fitnessi ,假如 sumrands,转;否就转i+ ,转返回第 i 个个体 indivalsi j+ ,假如 j = 个体总数 totalIndavial ,挑选操作终止,否就转% 挑选或复制操作是打算哪些个体可以进入下一代;程序中采纳赌轮盘挑选法挑选,这种方法较易实现;% 依据方程 pi=fi/ fi=fi/fsum( fsum 表示总概率和,一般设为 1),挑选步骤:% 1)在第 t 代,由( 1)式运算 fsum 和 pi % 2)产生 0,1 的随机数 rand .,求 s=rand .*fsum % 3)求 fi s 中最小的
11、k,就第 k 个个体被选中% 4)进行 N 次 2)、3)操作,得到 N 个个体,成为第 t=t+1 代种群%遗传算法子程序%Name: selection.m %挑选复制% A=1 2 3;4 5 6 A = 1 2 3 4 5 6 cumsumA ans = 1 2 3 5 7 9 B=1 2 3; cumsumB ans = 1 3 6 % randm,n 表示产生 m*n 矩阵,randm,n,p 表示产生 p 个 m*n 矩阵,randm,n,p,q 表示产生 p*q 个 m*n 矩阵% function newpop=selectionpop,fitvalue %定义挑选函数, 有
12、没有都可;totalfit=sumfitvalue; % 求适应值之和fitvalue=fitvalue/totalfit; % 适应值 =单个个体被挑选的概率fitvalue=cumsumfitvalue;%fitvalue 为行向量矩阵,cumsumfitvalue 表示元素依次累加的新行矩阵;px,py=sizepop; % px 为种群数,染色体的长度为 py ms=sortrandpx,1; %sort 从小到大排列;randpx,1 是任意产生 px 个元素的行向量矩阵;i=1; j=1; while j=px ifmsjfitvaluei %ms 为产生的随机的行矩阵;fitva
13、lue 为元素依次累加的新的行矩阵;newpopj=popi; % newpop 为输出函数 ,pop 为初始种群 2.1 中;j=j+1; 名师归纳总结 - - - - - - -第 3 页,共 8 页精选学习资料 - - - - - - - - - else i=i+1; end end % 2.5 交叉 交叉算法步骤可描述为:设置交叉次数 j=0;在群体的范畴内随机产生两个整数,其值在区间 1,totalIndival 之间 产生一个随机数 randc, randc 0,1 如 rands pc,不执行交叉操作,直接转 随机产生在区间 0,indavalLength 内的整数 cross
14、Site作为交叉点,执行交叉操作 j+ ;假如 j countIndival/2 ,终止交叉操作,否就转 2 % 交叉 crossover,群体中的每个个体之间都以肯定的概率 符串的某一位置pc 交叉,即两个个体从各自字% (一般是随机确定)开头相互交换,这类似生物进化过程中的基因分裂与重组;例如,假设2 个父代个体x1,x2 为:% x1=0100110 % x2=1010001 % 从每个个体的第3 位开头交叉,交又后得到2 个新的子代个体y1, y2 分别为:% y1 0100001 % y2 1010110 % 这样 2 个子代个体就分别具有了2 个父代个体的某些特点;利用交又我们有可
15、能由父代个体在子代组合成具有更高适合度的个体;%事实上交又是遗传算法区分于其它传统优化方法的主要特点之一;%遗传算法子程序%Name: crossover.m %交叉%pc 交叉概率,交叉概率过大(0.75-1 ),高适应值的个体简单被破坏,交叉率过小 0-0.25 ,算法退化成随机搜寻,合适的范畴在 0.25-0.75 之间;function newpop=crossoverpop,pc px,py=sizepop; newpop=onessizepop; %newpop 为 px*py 阶元素都为 1 的矩阵,目的就是产生一个 px*py 阶矩阵for i=1:2:px-1 % 是 for
16、 循环, i 间隔一个数取值,为 1,3,5, , px-1,防止重复交叉;ifrandPm ,就不进行变异操作,直接转,否就转 随机产生一整数 mut 0,indivalLength ,将该位的数值翻转或进行替换操作 j+ ,假如 j countIndival (个体总数) ,就退出变异操作,否就转% 变异 mutation ,基因的突变普遍存在于生物的进化过程中;变异是指父代中的每个个体的每一位都以概 率 pm 翻转,即由 “ 1”变为 “ 0”,% 或由 “0”变为 “1”;遗传算法的变异特性可以使求解过程随机地搜寻到解可能存在的整个空间,因此可以在肯定程度上求得全局最优解;%遗传算法子
17、程序 %Name: mutation.m %变异% all 函数:检测矩阵中是否全为非零元素,假如是,就返回1,否就,返回0;any 函数:检测矩阵中是否有非零元素,假如有,就返回1,否就,返回0;用法和 all 一样function newpop=mutationpop,pm px,py=sizepop; newpop=onessizepop; for i=1:px ifrandpm %随机产生 0-1 的数值小于变异概率 pm,就执行变异操作;mpoint=roundrand*py; %mpoint 变异点, round 作用对数值进行 四舍五入 ;if mpointbestfit bes
18、tindividual=popi,:; bestfit=fitvaluei; end end % 2.8 主程序 %遗传算法主程序 %Name:genmain05.m clear clf popsize=20; %群体大小 chromlength=10; % 字符串长度(个体长度)pc=0.6; % 交叉概率 pm=0.001; % 变异概率 pop=initpoppopsize,chromlength; % 随机产生初始群体 for i=1:20 %为迭代次数 objvalue=calobjvaluepop; % 运算目标函数 fitvalue=calfitvalueobjvalue; %
19、运算群体中每个个体的适应度newpop=selectionpop,fitvalue; % 复制 newpop=crossoverpop,pc; % 交叉 newpop=mutationpop,pc; % 变异bestindividual,bestfit=bestpop,fitvalue; yi=maxbestfit; %求出群体中适应值最大的个体及其适应值% maxA :返回一个行向量,向量的第 i 个元素是矩阵 A 的第 i 列上的最大值;%Y ,U=maxA :返回行向量 Y 和 U,Y 向量记录 A 的每列的最大值,U 向量记录每列最大值的行号;ni=i; % 貌似没啥用pop5=bes
20、tindividual; xi=decodechrompop5,1,chromlength*10/1023;% pop=newpop; end 对矩阵 pop5 进行解码,变成十进制数fplot10*sin5*x+7*cos4*x,0 10 % fplotfun,limits在指定的范畴limits 内画出函数名为fun 的图像;hold on plotx,y,r* % 画出来的点有重合的,其实与循环次数是相同的;hold off z index=maxy; % 运算最大值及其位置x5=xindex% 运算最大值对应的 x 值 y=z 【问题】求fx=x 10*sin5x 7*cos4x的最大
21、值,其中0=x=9 20,交叉概率为0.95, 【分析】挑选二进制编码,种群中的个体数目为10,二进制编码长度为变异概率为0.08 【程序清单】%编写目标函数 functionsol,eval=fitnesssol,options x=sol1; 名师归纳总结 - - - - - - -第 6 页,共 8 页精选学习资料 - - - - - - - - - eval=x 10*sin5*x 7*cos4*x; %把上述函数储备为 fitness.m 文件并放在工作目录下 initPop=initializega10,0 9,fitness;% 生成初始种群,大小为 10 9,fitness,i
22、nitPop,1e-6 1 x endPop,bPop,trace=ga0 1,maxGenTerm,25,normGeomSelect,. 0.08,arithXover,2,nonUnifMutation,2 25 3 % 次遗传迭代 运算借过为: x = 7.8562 24.8553 当 x 为 7.8562 时, f(x)取最大值 24.8553 注:遗传算法一般用来取得近似最优解,而不是最优解;遗传算法实例 2 【问题】在 5=Xi=5,i=1,2 区间内,求解fx1,x2=-20*exp-0.2*sqrt0.5*x1.2 x2.2-exp0.5*cos2*pi*x1 cos2*pi
23、*x2 22.71282 的最小值;【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 【程序清单】源函数的 matlab 代码 function eval=fsol numv=sizesol,2; x=sol1:numv; eval=-20*exp-0.2*sqrtsumx.2/numv-expsumcos2*pi*x/numv 22.71282; %适应度函数的 matlab 代码 function sol,eval=fitnesssol,options numv=sizesol,2-1; x=sol1:numv; eval=fx; eval=-eval; %遗传算法的 m
24、atlab 代码 bounds=ones2,1*-5 5; p,endPop,bestSols,trace=gabounds,fitness 注:前两个文件储备为 m 文件并放在工作目录下,运行结果为 p = 0.0000 -0.0000 0.0055 大家可以直接绘出fx 的图形来大致看看f (x)的最值是多少,也可是使用优化函数来验证;matlab 命令行执行命令:fplotx 10*sin5*x 7*cos4*x,0,9 evalops 是传递给适应度函数的参数,opts 是二进制编码的精度,termops 是挑选 maxGenTerm 终止函数时传递个 maxGenTerm 的参数,即
25、遗传代数;xoverops 是传递给交叉函数的参数;mutops 是传递给变异函数的参数;【问题】求fx=x+10*sin5x+7*cos4x的最大值,其中0=x=9 20,交叉概率为0.95, 【分析】挑选二进制编码,种群中的个体数目为10,二进制编码长度为变异概率为0.08 【程序清单】%编写目标函数 functionsol,eval=fitnesssol,options x=sol1; eval=x+10*sin5*x+7*cos4*x; 名师归纳总结 %把上述函数储备为fitness.m 文件并放在工作目录下10 第 7 页,共 8 页initPop=initializega10,0
26、9,fitness;%生成初始种群,大小为- - - - - - -精选学习资料 - - - - - - - - - x endPop,bPop,trace=ga0 9,fitness,initPop,1e-6 1 1,maxGenTerm,25,normGeomSelect,. 0.08,arithXover,2,nonUnifMutation,2 25 3 % 次遗传迭代 运算借过为: x = 7.8562 24.8553 当 x 为 7.8562 时, f(x)取最大值 24.8553 注:遗传算法一般用来取得近似最优解,而不是最优解;遗传算法实例 2 【问题】在 5=Xi=5,i=1,
27、2 区间内,求解fx1,x2=-20*exp-0.2*sqrt0.5*x1.2+x2.2-exp0.5*cos2*pi*x1+cos2*pi*x2+22. 71282 的最小值;【分析】种群大小10,最大代数1000,变异率0.1,交叉率0.3 【程序清单】源函数的 matlab 代码 function eval=fsol numv=sizesol,2; x=sol1:numv; eval=-20*exp-0.2*sqrtsumx.2/numv-expsumcos2*pi*x/numv+22.71282; %适应度函数的 matlab 代码 function sol,eval=fitnesss
28、ol,options numv=sizesol,2-1; x=sol1:numv; eval=fx; eval=-eval; %遗传算法的 matlab 代码 bounds=ones2,1*-5 5; p,endPop,bestSols,trace=gabounds,fitness 注:前两个文件储备为 m 文件并放在工作目录下,运行结果为p = 0.0000 -0.0000 0.0055 大家可以直接绘出fx 的图形来大致看看f (x)的最值是多少,也可是使用优化函数来验证;matlab 命令行执行命令:fplotx+10*sin5*x+7*cos4*x,0,9 evalops 是传递给适应度函数的参数,opts 是二进制编码的精度,termops 是挑选 maxGenTerm 终止函数时传递个 maxGenTerm 的参数,即遗传代数;xoverops 传递给交叉函数的参数;mutops 是传递给变异函数的参数;名师归纳总结 - - - - - - -第 8 页,共 8 页