多种群遗传算法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


多种群遗传算法

在这里插入图片描述

目标函数

function obj=ObjectFunction(XY)
col=size(XY,1);
for i=1:col
    obj(i,1)=21.5+XY(i,1)*sin(4*pi*XY(i,1))+XY(i,2)*sin(20*pi*XY(i,2));
end
end

main 主函数

%% 多种群遗传算法
clear;
clc
close all;
%% 参数设置
NIND=40;%个体数目
NVAR=2;%变量的维数
PRECI=20;%变量的二进制位数
GGAP=0.9;%代沟
MP=10;%种群数目
FieldD=[PRECI PRECI;[-3,4.1;12.1,5.8];1 1;0 0;1 1;1 1];%区域描述器,译码矩阵
for i=1:MP
    Chrom{i}=crtbp(NIND,PRECI*NVAR);%Chrom{1}表示一个种群中有40个个体
end
%在0.7-0.9区间内随机产生交叉概率
pc=0.7+(0.9-0.7).*rand(MP,1);
%在[0.001,0.05]区间内随机产生变异概率
pm=0.001+(0.05-0.001).*rand(MP,1);
%% 初始化种群
gen=0;%初始遗传代数
gen0=0;%初始保持代数
MAXGEN=10;%最优个体最少保持代数
maxY=0;%最优值
for i=1:MP
    XY=bs2rv(Chrom{i},FieldD);
    ObjV{i}=ObjectFunction(XY);%计算各初始种群个体的目标函数值
end
MaxObjV=zeros(MP,1);%记录精华种群
MaxChrom=zeros(MP,PRECI*NVAR);%记录精华种群的编码
%% 进化
while gen0<=MAXGEN
    gen=gen+1;
    for i=1:MP
        FitnV{i}=ranking(-ObjV{i});%各种群的适应度
        SelCh{i}=select('sus',Chrom{i},FitnV{i},GGAP);%选择操作
        SelCh{i}=recombin('xovsp',SelCh{i},pc(i));%交叉操作
        SelCh{i}=mut(SelCh{i},pm(i));%变异操作
        XY=bs2rv(SelCh{i},FieldD);%二进制转换为十进制
        ObjVSel=ObjectFunction(XY);%计算子代目标函数值
        [Chrom{i},ObjV{i}]=reins(Chrom{i},SelCh{i},1,1,ObjV{i},ObjVSel);%重插入操作
    end
    [Chrom,ObjV]=immigrant(Chrom,ObjV);%移民操作
    [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom);%人工选择精华种群
    YY(gen)=max(MaxObjV);%找出精华种群中最优的个体
    if YY(gen)>maxY
        maxY=YY(gen);
        gen0=0;
    else
        gen0=gen0+1;
    end
end
plot(1:gen,YY);
%将二进制编码转换为十进制
x=bs2rv(MaxChrom,FieldD);

fprintf(['最大值=',num2str(YY(end)),'\nx=',num2str(x(1,1)),'\ny=',num2str(x(1,2))]);

人工选择算子

function [MaxObjV,MaxChrom]=EliteInduvidual(Chrom,ObjV,MaxObjV,MaxChrom)
%% 人工选择算子
MP=1:length(Chrom);%种群数
for i=1:MP
    [MaxO,maxI]=max(ObjV{i});%各种群的最大目标函数值
    %如果找到的目标函数值大于MaxObjV{i}则获取其对应的编码
    if MaxO>MaxObjV(i)
        MaxObjV(i)=MaxO;
        MaxChrom(i,:)=Chrom{i}(maxI,:);
    end
end
end

移民算子

function [Chrom,ObjV]=immigrant(Chrom,ObjV)
%% 移民算子
MP=length(Chrom);%计算种群数目
for i=1:MP
    [MaxO,maxI]=max(ObjV{i});%找出第i种群中最优的个体
    next_i=i+1;%目标种群(移民操作中)
    if next_i>MP;
        next_i=mod(next_i,MP);
    end
    [MinO,minI]=min(ObjV{next_i});%找出目标种群中最劣的个体
    %% 目标种群最劣个体替换为源种群最优个体
    Chrom{next_i}(minI,:)=Chrom{i}(maxI,:);
    ObjV{next_i}(minI)=ObjV{i}(maxI);
end
end

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JiAngTxone

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

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

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

打赏作者

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

抵扣说明:

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

余额充值