用标准遗传算法求函数最大值

题:用标准遗传算法求函数f(x)=x+10sin(5x)+7cos(4x)的最大值,其中x的取值范围为[0,10].只是一个有多个局部极值的函数

用标准遗传算法求函数最大值_第1张图片

仿真过程:

(1)初始化种群数目NP=50,染色体二进制编码长度L=20,最大进化代数G=100,交叉概率Pc=0.8,变异概率Pm=0.1

(2)产生初始种群,将二进制编码转化成十进制,计算个体适应度值,并进行归一化:采用基于【轮盘赌】的选择操作、基于概率的交叉和变异操作,产生新的种群,并把历代的最优个体保留在新的种群中,进行下一步遗传操作。

(3)判断是否满足终止条件:若满足,则结束搜索过程,输出优化值,若不满足,则继续进迭代优化。

优化结束后,其适应度进化曲线如图所示,优化结果x=7.8564,函数f(x)的最大值为24.8553

用标准遗传算法求函数最大值_第2张图片

%%用标准遗传算法求函数最大值

clear all; 
close all;
clc;

%% 绘制函数图像
x=0:0.01:10;
y=x+10*sin(5*x)+7*cos(4*x);
plot(x,y)
xlabel('x')
ylabel('f(x)')
title('f(x)=x+10sin(5x)+7cos(4x)')

%% 初始化参数
NP = 50;     % 种群数量
L = 20;      % 二进制位串长度
Pc = 0.8;    % 交叉率
Pm = 0.1;    % 变异率
G = 100;     % 最大遗传代数
Xs = 10;     % 上限
Xx = 0;      % 下限
f = randi([0,1],NP,L);  % 随机获得初始种群

%% 遗传算法循环
for k = 1:G
    %% 将二进制解码为定义域范围内十进制
    for i = 1:NP
        U = f(i,:);
        m = 0;
        for j=1:L
            m = U(j)*2^(j-1)+m;
        end
        x(i)=Xx+m*(Xs-Xx)/(2^L-1);
        Fit(i) = GA_func1(x(i));
    end
    maxFit = max(Fit);
    minFit = min(Fit);
    rr = find(Fit==maxFit);
    fBest = f(rr(1,1),:);                          % 历代最优个体
    xBest = x(rr(1,1));
    Fit = (Fit-minFit)/(maxFit-minFit);            % 归一化适应度
    
    %% 基于轮盘赌的复制操作
    sum_Fit = sum(Fit);
    fitvalue = Fit./sum_Fit;
    fitvalue = cumsum(fitvalue);      % 累计
    ms = sort(rand(NP,1));           % 排序
    fiti = 1;
    newi = 1;
    while newi <= NP
        if(ms(newi)) 
%% 适应度函数
function y = GA_func1(x)
y=x+10*sin(5*x)+7*cos(4*x);

选择策略:轮盘赌

假设我们有4个个体:A、B、C、D,其适应度、选择概率、累计概率如下表所示 :

个体 适应度 选择概率 累积概率
A 10 0.1 0.1
B 20 0.2 0.3
C 30 0.3 0.6
D 40 0.4 1.0

随机旋转轮盘,落入0.0~0.1区域选A,落入0.1~0.3区域选B,落入0.3~0.6区域就选C,落入0.6~1.0区域就选D。

一共旋转轮盘种群规模NP次,选出NP个个体组成新的种群。

sum_Fit = sum(Fit) ;
fitvalue = Fit ./sum_Fit ;      % 选择概率,将Fit的每个元素除以sum_Fit
fitvalue = cumsum(fitvalue) ;   % 累积概率
ms = sort (rand(NP,1)) ;        % 产生NP个0~1之间的随机数,并且升序排序
fiti =1;
newi=1;
while newi<=NP                  % 轮盘开始旋转,一共转NP次
       if(ms(newi)

你可能感兴趣的:(数学建模-算法,算法,机器学习)