Q:测试算法在搜索10D,30D和50D搜索空间下,寻找Ackely函数最优值时算法的平均收敛曲线
本题是计算智能课程的一次作业,由于本人水平一般,就借助博客边写边学…其实主要是记录一下给自己回顾用的。欢迎大佬指导建议,也欢迎和me一样刚刚入门(连matlab都用不明白)的小白一起加油学习鸭~
由于是新人小白,为了让自己更好的理解每行代码,就几乎对每一行代码都加了个人理解标注,所以看起来比较繁琐,请前来一起学习的小白鸭沉下心来慢慢看~
文章最后也附有一个没有过多注解的版本,大家也可以直接拿去~
% 遗传算法参数设置
maxgen = 500; % 迭代次数
sizepop = 100; % 种群大小
pc = 0.7; % 交叉概率
pm = 0.01; % 变异概率
D = [10, 30, 50]; % 搜索空间维度
% 迭代求解Ackley函数的最小值
for k = 1:length(D)%1.2.3循环
d = D(k);%利用索引获取维度,例如第一轮k=1,d就等于10
% 初始化种群
pop = -32 + 64*rand(sizepop,d);%rand用于生成100(种群大小)行,10(维度)列矩阵,该矩阵内元素均为0-1之间,再*64-32后即可得到元素均为-32~32之间的100行10列矩阵
fit = ackley(pop);%将矩阵输入测试函数(矩阵每一行代表一个个体,每一列代表一个维度/变量
)
bestfit = min(fit);%由于求最小值,所以最小值就是最佳适应度,记录初代最佳适应度
best = pop(find(fit==bestfit, 1 ),:);%找到最佳适应度与个体适应度相同的行,将该行赋值保留作为最佳个体
% 初始化记录
fit_rec = zeros(maxgen,1);%创建一个500(迭代次数)行的列向量(数组)
fit_rec(1) = bestfit;%将初代最佳适应度储存在第一行
best_rec = zeros(maxgen,d);%创建一个500(迭代次数)行10(维度)列的数组
best_rec(1,:) = best;%将初代最佳个体保留在第一行
% 迭代
for i = 2:maxgen%开始迭代
% 选择操作
idx = roulette(fit, sizepop);%轮盘赌得到索引列向量,下面代码有分析
n