资源简介
一个遗传算法的实例,用matlab写的,包含画图,求解一元函数的最大值。
代码片段和文件信息
%% 题目: 求f(x) = x+ 10sin(5x) +7cos(4x)的最大值 ,x是[010]
%% 初始化参数
clc ;
clear all;
NP=50; %种群数量
L=20 ; %基因位数
Pc=0.8;
Pm=0.1;
G = 100; % 迭代次数
Xs=10; %上限
Xx=0; %下限
f=randi([01]NPL); %随机获得初始种群矩阵
%% 遗传算法循环
for k =1 : G %迭代次数
%% 将二进制解码为定义域范围内十进制
for i=1:NP
U =f(i:);
m=0;
for j=1:L
m=U(j)*2^(j-1)+m;
%disp(m);
end
x(i)=Xx+m*(Xs-Xx)/(2^L-1); %为[010]内的实数
Fit(i) = func1(x(i)); %每个个体的适应度,即每个x对应的函数值
end
%% 最优和最劣质个体
maxFit = max(Fit); %求Fit矩阵中的最大值
minFit = min(Fit); %求Fit矩阵中的最小值
rr=find(Fit==maxFit); %找出Fit数组中==maxFit的那个值的下标,给rr
% disp(rr);
fBest = f(rr(11) :); %历代最优个体
% disp(rr(11));
xBest=x(rr(11)); %历代最优个体所对应的x值
Fit =(Fit-minFit) / (maxFit - minFit) ; %归一化适应度值,是一个权重,即:各个适应度值与最大适应度值得差距,用概率表现出来
%% 轮盘赌选择复制
sum_Fit = sum(Fit) ;
fitvalue = Fit ./sum_Fit ; %选择概率,将Fit的每个元素除以sum_Fit
fitvalue = cumsum(fitvalue) ; %累积概率
ms = sort (rand(NP1)) ; %产生NP个0~1之间的随机数,并且升序排序
fiti =1;
newi=1;
while newi<=NP %轮盘开始转,一共转NP次
if(ms(newi) nf(newi:) = f(fiti :) ; % 把个体给新的种群
newi = newi + 1;
else
fiti=fiti +1;
end
end
%% 交叉_均匀交叉
for i = 1:2:NP % 从1到NP ,每隔两个
p = rand ;
if p q=randi([01]1L);
for j =1:L
if q(j) == 1;
temp=nf(i+1j);
nf(i+1j) = nf(ij);
nf(ij) = temp;
end
end
end
end
%% 变异
i = 1;
while i<=round(NP*Pc) % 四舍五入
h=randi([1NP]11) ; %随机选取一个需要变异的染色体
for j = 1:round(L*Pc)
g = randi([120]11);%随机选取需要变异的基因数
%g=rand;
nf(hg) = ~ nf(hg);
end
i=i+1;
end
f = nf ; %把新的种群赋值给f ,以方便下一轮循环
f (1:) =fBest ; % 保留最优个体在新种群中
trace(k)=maxFit ;%历代最优适应度
end
xBest ;%最优个体
%% 画图
figure
plot(trace)
xlabel(‘迭代次数‘)
ylabel(‘目标函数值‘)
title(‘适应度进化曲线‘)
- 上一篇:A*算法航迹规划
- 下一篇:基本鱼群算法 MATLAB函数
评论
共有 条评论