遗传算法求函数f=x+10*sin(5*x)+7*cos(4*x)的最大值(详细分析)

🌞欢迎来到智能优化算法的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破

📆首发时间:🌹2021年9月22日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


🍓训练部分




二、代码如下(示例):

1.f = randi([0,1],NP,L) % 随机获得初始种群

 50(NP)行20(L)列,每一行代表一个个体,每个个体有20个基因。

2.编码

%% 将二进制解码为定义域范围内十进制%%

    for i = 1:NP     //从第1个个体到第50个个体

        U = f(i,:);         //第i行全部元素,代表一个个体

        m = 0;

        for j=1:L             

            m = U(j)*2^(j-1)+m;     //二进制解码为定义域范围内十进制m,m代表一个个体

        end

        x(i)=Xx+m*(Xs-Xx)/(2^L-1);  //编码精度,第i个个体的x的值

        Fit(i) = func1(x(i));          //计算每i个体对应的适应度的值

    end

    maxFit = max(Fit);                             %最大值

    minFit = min(Fit);                             %最小值

    rr = find(Fit==maxFit);

    fBest = f(rr(1,1),:);                          % 历代最优个体fBest(1*20)代表最优个体

    xBest = x(rr(1,1));                            %最优个体对应x的值

    Fit = (Fit-minFit)/(maxFit-minFit);            % 归一化适应度(把适应度变成0~1之间的数)

Fit代表50个个体的适应度

 rr = find(Fit==maxFit);rr表示第几个个体是最优个体

 3.%% 基于轮盘赌的复制操作%%

%% 基于轮盘赌的复制操作%%

    sum_Fit = sum(Fit);          //50个个体归一化适应度的和

    fitvalue = Fit./sum_Fit;      //(1*50)代表50个个体被选择的概率

    fitvalue = cumsum(fitvalue)      % 累计    //(1*50)计算累加概率

    ms = sort(rand(NP,1));           % 排序     //产生(50*1)0~1之间的随机数

    fiti = 1;                                     

    newi = 1;

    while newi <= NP

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

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

            newi = newi+1;

        else

            fiti = fiti+1;

        end

    end

                                                                              //nf(n*20)n是被选择的个体

4. %% 基于概率的交叉操作%%

 %% 基于概率的交叉操作%%

    for i=1:2:NP

        p=rand;         //产生0~1之间的随机数p

        if p<Pc        

            q=randi([0,1],1,L);          //产生(1*20)0~1之间的随机数

            for j=1:L

                if q(j)==1;

                    temp=nf(i+1,j);

                    nf(i+1,j)=nf(i,j);

                    nf(i,j)=temp;          //相邻两个个体第j个基因的交换

                end

            end

        end

    end

5.%% 基于概率的变异操作%%

%% 基于概率的变异操作%%

    i=1;

    while i<=round(NP*Pm)         //取整50*0.1

        h=randi([1,NP],1,1);           //生成1x1的伪随机整数矩阵,范围为1~NP,选取个体

        for j=1:round(L*Pm)        //取整20*0.1

            g=randi([1,L],1,1);        //生成1x1的伪随机整数矩阵,范围为1~NP,选取基因

            nf(h,g)=~ nf(h,g);        //0~1,1~0

        end

        i=i+1;

    end

    f=nf;                  

    f(1,:)=fBest;       %保留最优个体在新种群中(第一行)

    trace(k)=maxFit;    %历代最优适应度

end
 

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

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) = 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)) <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=randi([0,1],1,L);

            for j=1:L

                if q(j)==1;

                    temp=nf(i+1,j);

                    nf(i+1,j)=nf(i,j);

                    nf(i,j)=temp;

                end

            end

        end

    end

   %% 基于概率的变异操作%%

    i=1;

    while i<=round(NP*Pm)

        h=randi([1,NP],1,1);

        for j=1:round(L*Pm)

            g=randi([1,L],1,1);

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

        end

        i=i+1;

    end

    f=nf;

    f(1,:)=fBest;       %保留最优个体在新种群中

    trace(k)=maxFit;    %历代最优适应度

end

xBest;  %最优个体

figure;

plot(trace);

xlabel('迭代次数');

ylabel('目标函数值');

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

 %% 适应度函数%%

function result=func1(x)

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

result=fit;

end





结果:

  • 12
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值