基本遗传算法(SGA)的MATLAB实现

  • 用两个测试用例,直观地阐述基本遗传算法的原理,具体原理参考: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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?

既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?

架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。

如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。

中高级开发必知必会:

[外链图片转存中…(img-DLcbvmUO-1713613846836)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 25
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值