-
用两个测试用例,直观地阐述基本遗传算法的原理,具体原理参考:http://blog.csdn.net/begtostudy/article/details/4136492
-
对于上述课件(讲得很透彻,适合对遗传算法的入门)中提出的一个问题进行了实现,并通过MATLAB作图直接观察到算法搜索的过程。闲言少叙,Show me the Code!
% Date:2015年6月1日 14:01:35
% Author:heartsuit
% Function:基本遗传算法(Simple Genetic Algorithm, SGA)的实现
% 用于求解一元函数在某个区间内的最值,并作图反映寻优过程;
% Description:编写该程序的目的主要是了解SGA的基本原理以及整体流程
% 通过解决两个小问题,更直观深刻地理解SGA;
% Instruction:若需要添加新的问题,只需在评估函数:
% function evaluateValue = f(x)
% 添加目标函数表达式即可;
% GeneticAlgo(encodingBits, left, right)输入参数:
% encodingBits:编码位数;根据实际问题确定
% left:左区间端点
% right:右区间端点
% Note:
% numbleOfSample:样本个数;建议范围:20~100
% maxIteration:最大迭代次数;建议范围:100~500
% 对于测试的两个问题可以采用以下方式调用函数:
% Q1: GeneticAlgo(8, -2, 3)
% Q2: GeneticAlgo(22, -1, 2)
function GeneticAlgo(encodingBits, left, right)
% 设置默认值(可以改动)
numbleOfSample = 50; % 默认样本数为50
maxIteration = 100; % 默认最大迭代次数为100;
mutationProbability = 0.007; % 变异概率:建议范围:0.001~0.01
iteration = 1; % 迭代次数初始化
currentIndividual = -1;
bestIndividual = zeros(maxIteration, 1); % 用以保存每次找到的最佳样本值
% 二进制编码(表现型->基因型)
sample = randi(2, numbleOfSample, encodingBits) - 1; % 初始化种群
figure(1);
while (iteration < maxIteration) % 遗传迭代
% 计算评估值
[evaluateValue, evaluateX, evaluateIndividual] = evaluate(sample, left, right, encodingBits);
if (evaluateIndividual > currentIndividual)
currentX = evaluateX; % 更新最佳个体的横坐标
currentIndividual = evaluateIndividual; % 更新最佳个体
end;
bestIndividual(iteration) = currentIndividual; % 保存当前最佳个体
plot(bestIndividual(1:iteration)); grid on; pause(0.1);
sample = select(sample, evaluateValue); % 选择
sample = cross(sample, encodingBits); % 交叉
sample = mutate(sample, mutationProbability); % 变异
iteration = iteration + 1;
end;
% 输出
disp(currentIndividual); disp(iteration); disp(currentX);
% 变异(基本位变异)
function sampleGenetic = mutate(sample, mutationProbability)
[numbleOfSample, encodingBits] = size(sample);
sampleGenetic = sample;
for kn = 1:numbleOfSample,
for km = 1:encodingBits
r = rand(1);
if (r < mutationProbability)
sampleGenetic(kn, km) = double(~ sampleGenetic(kn, km));
end;
end;
end;
% 交叉(单点交叉)
function sampleGenetic = cross(sample, encodingBits)
numbleOfSample = size(sample, 1); sampleGenetic = sample;
M2 = floor(numbleOfSample/2);
for k = 1:M2
r1 = randi(numbleOfSample, 1);
r2 = randi(numbleOfSample, 1);
Y1 = sample(r1, 😃;
Y2 = sample(r2, 😃;
% 交叉概率建议范围:0.4~0.9
r = randi(encodingBits-1, 1); % 随机生成交叉位置
Y11 = [Y1(1:r), Y2((r+1):encodingBits)];
Y21 = [Y2(1:r), Y1((r+1):encodingBits)];
sampleGenetic(r1, 😃 = Y11; sampleGenetic(r2, 😃 = Y21;
end;
% 选择(轮盘赌)
function sampleGenetic = select(sample, evaluateValue)
numbleOfSample = size(sample, 1);
evaluateValue = cumsum(evaluateValue);
sampleGenetic = zeros(size(sample));
for k = 1:numbleOfSample
r = rand(1);
I = 1;
for kr = 2:numbleOfSample
if ((r<evaluateValue(kr)) && (r>=evaluateValue(kr-1)))
I = kr;
break;
end;
end;
sampleGenetic(k, 😃 = sample(I, 😃;
end;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/bfca828f99882a15cbfeb5461d106c08.jpeg)
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-DLcbvmUO-1713613846836)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!