目录
一、理论
- 一、理论
- 二、遗传算法流程图
- 三、遗传算法思维导图
- GA算法思维导图下载
- 四、代码解析
- 1、主函数GAmain.m
- 2、计算适应度 fitnessfun.m
- 3、二进制转十进制 decode.m
- 4、选择算子(任选其一)
- 4.1 轮盘赌选择算子 selection.m
- 4.2排序选择算子 sortselection.m
- 5、单点交叉 crossover.m
- 6、基本位变异 mutation.m
- 7、目标函数 objfun.m
- 五、输出结果
- 六、源码以及汇报PPT下载
模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记—附MATLAB注释代码
二、遗传算法流程图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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?