九大智能优化算法复习(2):遗传算法

发布时间:2024-11-17 11:25

智能家居系统可通过AI算法优化能源使用效率 #生活知识# #家居生活# #智能家居系统#

一、了解遗传算法:

遗传算法借鉴了达尔文和孟德尔的遗传学说。它的运行本质也就是模拟了物种在繁衍过程中,染色体通过一系列的步骤,将优质的遗传基因保存下来,而将大部分的劣质因子淘汰掉的过程。总得来说,遗传算法核心一般有:编码、选择、交叉、变异。当然对于具体问题,可能还有特殊的算子和参数设定。

二、理解遗传算法:

染色体:它代表了一个个体的几乎所有的性状表现,因此可以用染色体来代表一个个体,或者说问题的一个解。

基因:基因是组成染色体的基本单位,它构成了一个个染色体。于是我们将问题的解的因变量,作为其一个基因或基因组。

种群:种群由许多的个体组成,它能够更准确的反映出一个物种的优胜劣汰过程。若将时间定义的足够长,那么物种的基因的优势就趋近于最优,我们将物种的这种优势,定义为环境的适应度。就像字面意思,它表示了物种的个体,能够适应当前环境的程度,越大则生存能力越强,越趋近于最优解。

适应度:根据所需的因变量与自变量之间的关系,得到的一个函数值。也可以认为是函数fitness(x)=f(x),其一个个体x对于的函数值。

选择:从物种中筛选出较优的个体作为下一次遗传的种群。常用轮盘赌模型来选择。

交叉:通过等位基因的交叉互换能够,可能产生出新的更优个体与劣势个体。这里目的就是为了产生更优的个体。比如上面就是发生交叉的一种情形。

变异:就是某一基因发生突变,由原来的性状变成了其他的性状。例如,采用二进制的编码,某一段基因序列为:”101011”,经过基因突变,变成了序列:”100001”。

各种各样的物种稳定且互相兼容的共同生活,才有了我们日益精彩的世界。而追溯其本质,其实就是基因与自然界的“智能”筛选所导致的。

补充轮盘赌:在选择优质的染色体时,常常采用轮盘赌的模式。这里就是一个积累概率模式,以下面例子来说明:

假如上面就是一个轮盘,现在将一个筛子扔到轮盘中5次,结果:

2次扔到D区、2次扔到B区、1次扔到C区。

以区域占比作为扔中概率,则4个区域概率如图所示,那么怎么将四个区域在一个维度上来表示呢?

于是就想到了积累概率来达到这一个目的:

这样,点落在上面线段的4个部分的概率就是轮盘中各个区域的概率了。

分别为:在下列区间,

(0.03, 0.395)扔中2次

(0.395, 0.599)扔中1次

(0.599, 1)扔中2次

三、运用遗传算法:

接下来,谈谈为什么和怎么运用这种生命之美。首先,我们得知道遗传算法的特点,通俗点理解:

编码,使问题有一个通用性的解决办法。不管求解的是一个数字,还是一组数字,还是其他的形式。都可以运用这种模板化的解题思路。直接使用目标函数,不像我们一般求解最优,需要求导并讨论,找到极点的最值。多点搜索,相对比从一个点出发的搜索,有一种并行的优势。

运用遗传算法理论,求一个函数在其定义域内的最大值。例子:f(x) = x + 10sin(5x) + 7cos(4x) 定义域:[0, 10]

matlab实现: 

clear all;

clc;

x=0:0.01:10

y=x+10*sin(5*x)+7*cos(4x)

plot(x,y)

xlabel('x')

ylabel('y')

title('f(x)=x+10sin(5x)+7cos(4x)')

%% 以上为作图象 %%

clear all;

close all;

clc;

NP = 50;%种群中个体数量

L = 20;%染色体基因个数

Pc = 0.8;%交叉率

Pm = 0.1;%变异率

G = 100;%最大遗传代数

Xs = 10;%自变量x上界

Xx = 0;%自变量x下界

f = randint(NP, L);%产生NP个长度为L的01序列,以此作为种群的个体

for k = 1:G:

%遗传G次

for i = 1:NP

U = f(i,:)%第i个个体的基因序列

m = 0;%将个体01序列转换为十进制数

for j = 1:L

m = U(j)*2^(j-1)+m;

end

x(i) = Xx+m*(Xs-Xx)/(2^L-1);%将个体序列的十进制数,规格化成定义域内的点

Fit(i) = func(x(i))%对应此点(个体)的适应度值

end

maxFit = max(Fit);%最大适应度值

minFit = min(Fit);%最小适应度值

rr = find(Fit == maxFit) %最大适应度值对应的个体在种群中的位置

fBest = f(rr(1,1),:);%最优个体,因为后面将每一代的最优个体都放在第1个位置

xBest = x(rr(1,1),:);%最优适应度

%接下来是轮盘赌复制染色体:

sum_Fit = sum(Fit);

fitvalue = Fit./sum_Fit;%因为要选择适应度尽可能大的个体

%那么将适应度值占种群总适应度的比例,就能表示这个个体被选择的概率

%概率与适应度值成正比

fitvalue = cumsum(fitvalue);%对fitvalue求积累概率,为后面轮盘选择做铺垫

ms = sort(rand(NP,1));%用随机概率来决定是否选择此个体

fiti = 1;%表示第fiti个个体

newi = 1;%表示第newi个概率

%轮盘赌确定是否选择此个体

while newi <= Np

if (ms(newi)) < fitvalue(fiti)

nf(newi, ;) = f(fiti,:);

newi = newi + 1;

else

fiti = fiti + 1;

end

end

for i = 1:2:NP%交叉是两相邻染色体的动作

p = rand();%产生随机数,决定是否发生交叉

if p < pc

q = randint(1,L);%随机决定一对等位基因发生交叉

for j = 1:L

if q(j) == 1;

temp = nf(i+1, j);

nf(i+1, j) = temp;

nd(i, j) = temp;

end

end

end

end

%接下来是变异操作

i = l

while i <= round(NP*Pm)%计算发生变异的个体数量

h = randint(1,1,[1,NP]);%随机选取一个需要变异的染色体

for j = 1:randint(L*Pm) %计算发生变异的基因数量

g = randin(1,1,[1,L]);%随机选取一个需要变异的基因

nf(h,g) = ~nf(h,g);

end

i = i+1

end

f = nf;%将新的种群准备开始下一次遗传

f(1,:) = fBest; %将当前最优个体加入此种群,保留局部最优解,fBest就是最终的解

trace(k) = maxFit;%保留当前最优适应度,最后一代最优结果就是trace(G)

end

xBest;

figure;标出最优点

plot(trace)

xlabel('迭代次数')

ylabel('目标函数值')

title('适应度进化曲线')

%%适应度函数%%

function result = func(x)

fit = x+10*sin(5*x) + 7*cos(4*x);

result = fit;

网址:九大智能优化算法复习(2):遗传算法 https://www.yuejiaxmz.com/news/view/102475

相关内容

APS智能排产+运筹优化算法=?
强化学习中的策略迭代算法优化研究
算法人生(15):从“智能任务调度算法”到“15
算法在身边——学习算法从妈妈的菜谱开始
【深度学习】深度学习语音识别算法的详细解析
揭秘AutoML:智能推荐算法如何改变你的生活?
离散化算法
干货!学霸们总结分享的九大学习方法,早看早进步
一文看懂机器学习「3 种学习方法 + 7 个实操步骤 + 15 种常见算法」
揭秘生活小窍门:这些常用算法,让你生活更智能!

随便看看