遗传算法(Genetic Algorithm)应用于函数优化--MATLAB源码详细解析-附GA思维导图
2020-07-11 11:35
531 查看
目录
- 1、主函数GAmain.m
- 2、计算适应度 fitnessfun.m
- 3、二进制转十进制 decode.m
- 4、选择算子(任选其一)
- 4.1 轮盘赌选择算子 selection.m
- 4.2排序选择算子 sortselection.m
一、理论
模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记—附MATLAB注释代码
二、遗传算法流程图
三、遗传算法思维导图
GA算法思维导图下载
四、代码解析
1、主函数GAmain.m
clear close clc %varnum 变量个数 %eps 精度 %lb ub 变量范围 %n 种群大小 %pc 交叉概率 %pm 变异概率 %M 动态线性变换 f = @(x) 11*sin(6*x) + 7*cos(5*x);%待求函数最大值优化问题的函数 %f = @(x) x*sin(10*pi*x)+2; ezplot(f) hold on h = plot(0,0,'*'); varnum = 1;%%变量个数 n = 200; %%种群大小 eps = 1e-2; pc = 0.9;%%交叉一般是0.4-0.9 pm = 0.01;%%变异概率 maxgen = 200;%%种群数量 q = 0.2;%%排序选择中的最好的个体选择概率 lb =-pi;%%函数自变量下限 ub =pi;%%函数自变量上限 %%初始化种群 for i = 1:varnum L(i) = ceil(log2(ub(i)-lb(i)) / eps +1);%%ceil函数:朝正无穷大方向取整,L是每个自变量的编码长度 end LS = sum(L);%%多个自变量时,是每个自变量的长度之和;LS是自变量组成的二进制编码总位长 pop = randi([0 1],n,LS);%%生成n行LS列的随机数,生成0或者1 spoint = cumsum([0 L]);%%cumsum计算数组各行的累加值 for iter = 1:maxgen %% 将二进制转化为十进制 for i = 1:n for j = 1:varnum startpoint = spoint(j) + 1; endpoint = spoint(j+1); real(i,j) = decode(pop(i,startpoint:endpoint),lb(j),ub(j)); end end %% 计算适应度值 fitvalue = fitnessfun(real); fval = objfun(real); h.XData = real; h.YData = fval; pause(0.051) %%轮盘赌选择 %%[dad,mom] = selection(pop,fitvalue); %%排序选择 %%选择 [dad,mom] = sortselection(pop,fitvalue,q); %%交叉 newpop = crossover(dad,mom,pc); %%变异 newpop = mutation(newpop,pm); pop = newpop; end for i = 1:n for j = 1:varnum startpoint = spoint(j) + 1; endpoint = spoint(j+1); real(i,j) = decode(pop(1,startpoint:endpoint),lb(j),ub(j));%%把最后的种群计算成十进制数 end end fitvalue = fitnessfun(real);%%计算适应度的值 [bestfitness,bestindex] = max(fitvalue)%%找到最好的适应度 bestindividual = real(bestindex,:) fval = objfun(bestindividual)%%计算最好的目标函数值 plot(bestindividual,fval,'*')%%绘制点
2、计算适应度 fitnessfun.m
function fitvalue = fitnessfun(x) Cmin = 0.01; [row,~] = size(x); for i = 1:row fval = objfun(x(i,:)); if fval + Cmin > 0 fitvalue(i) = fval + Cmin; else fitvalue(i) = 0; end end
3、二进制转十进制 decode.m
function real = decode(pop,lb,ub) %% pop种群 %% varnum 变量个数 [~,col] = size(pop); for j = col:-1:1 temp(j) = 2^(j-1)*pop(j);%%计算二进制数 end temp = sum(temp); real = lb + temp *(ub - lb)/(2^col-1); end
4、选择算子(任选其一)
4.1 轮盘赌选择算子 selection.m
function [dad,mom] = selection(pop,fitvalue) %%轮盘赌选择算法 %% 计算累加概率 PP = cumsum(fitvalue ./ sum(fitvalue) ); [row,~] = size(pop); %% 选择出row个个体,轮盘赌的方式 for i = 1:row for j = 1:row r = rand; if r <= PP(j) dad(i,:) = pop(j,:); break; end end mom(i,:) = pop(randi([1 row]),:); end
4.2排序选择算子 sortselection.m
function [dad,mom] = sortselection(pop,fitvalue,q) [row,~] = size(pop); [~,Sindex] = sort(fitvalue,'descend');%%按照适应度高低排序 pop = pop(Sindex,:); %%每个个体被选中的概率 P = q*(1-q).^((1:row)-1)/(1-(1-q)^row); %%种群被选中的累计概率 PP = cumsum(P); %%选择出row个个体 for i = 1:row for j = 1:row r = rand; if r <= PP(j) dad(i,:) = pop(j,:); break; end end mom(i,:) = pop(randi([1 row]),:); end
5、单点交叉 crossover.m
function newpop = crossover(dad,mom,pc) [row,col] = size(dad); for i = 1:row if rand < pc %%生成的随机数小于交叉概率 cpoint = randi([1 col-1]);%%交叉点 %%把交叉点之前的父代和交叉点之后的母代进行组合 newpop(i,:) = [dad(i,1:cpoint) mom(i,cpoint+1:end)]; else newpop(i,:) = dad(i,:); end end
6、基本位变异 mutation.m
function newpop = mutation(pop,pm) [row,col] = size(pop); newpop = zeros(row,col); for i = 1:row mpoint = randi([1 col]);%%变异的点 if rand < pm newpop(i,:) = ~pop(1,mpoint);%%变异的位置取反 else newpop(i,:) = pop(i,:);%%不发生变异 end end
7、目标函数 objfun.m
function fval = objfun(x) %目标函数 fval = 11*sin(6*x) + 7*cos(5*x); %fval = x*sin(10*pi*x)+2;
五、输出结果
两个算子的选择结果稍微有点不一样,根据图像显然可见,在横坐标1.3附近取得最大值,排序选择的结果比较好
1.轮盘赌选择算子结果:
2.排序选择算子结果
六、源码以及汇报PPT下载
相关文章推荐
- 遗传算法优化的BP神经网络 -- MATLAB源码详细注释
- 基于遗传算法的vc++函数优化问题源码的已发布
- DE(差分进化)优化算法MATLAB源码详细中文注解
- SA(模拟退火)优化算法MATLAB源码详细中文注解
- DE(差分进化)优化算法MATLAB源码详细中文注解
- GSA(引力搜索)优化算法MATLAB源码详细中文注解
- Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
- ImageLoader源码解析(五) 补充 针对ListView或者RecycleView的优化
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- 【转】Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例--不错
- 遗传算法优化BP神经网络拟合非线性函数
- 虚函数详细解析
- Java【集合系列】-03-ArrayList详细介绍(源码解析)和使用示例
- Lucene总结系列(三)--总述优化方案和呈现实时内存索引实现(结合RAMDirectory源码解析)
- 67.Scala并发编程匿名Actor、消息传递、偏函数实战解析及其在Spark源码中的应用解析
- OpenCV学习:Mat类详细解析+源码剖析(二)构造函数
- Matlab中plot函数参数解析
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
- 【人工智能】遗传算法(GA)入门—以求解一元函数最大值的优化问题为例