找回密码
 立即注册
查看: 267|回复: 0

优化算法_遗传算法

[复制链接]
发表于 2022-7-31 12:09 | 显示全部楼层 |阅读模式
遗传算法定义可以参考百度百科资料遗传算法_百度百科,具体步骤如图所示:


此案例主要是使用matlab进行遗传算法简单案例编写,其中选择操作使用“锦标赛选择法”,交叉操作使用“单点交叉法”,变异操作使用“单点变异法”。
源码下载路径:链接:https://pan.baidu.com/s/1ITu5imiXSLg2YJLc5-6fvA?pwd=1234 提取码:1234
具体代码如下:

计算适应度fun()函数:

function y=fun(x)
    y=sum(x);
end
锦标赛选择法selectPop()函数:

function p=selectPop(Parent)
   
    %锦标赛选择法
    n=numel(Parent);
    index=randperm(n);
    p1=Parent(index(1));
    p2=Parent(index(2));
    if p1.y<=p2.y
        p=p1;
    else
        p=p2;
    end
end
单点交叉法crossPop()函数:

function [y1,y2]=crossPop(x1,x2)

    %单点交叉
    n=numel(x1);
    s=randi([1,n-1]);   %交换点位置

    y1=[x1(1:s) x2(s+1:end)];
    y2=[x2(1:s) x1(s+1:end)];

end
单点变异法mutatePop()函数:

function p=mutatePop(x,mu)

    %单点变异
    if rand<=mu
        n=numel(x);
        s=randi([1,n]);   %变异点
        %将0变为1,将1变为0
        if x(s)==0
            x(s)=1;
        else
            x(s)=0;
        end
    end

    p=x;

end
运行文件main.m:

clc;clear

nVar=100;

%初始化种群
nPop=30;
maxIt=2000;  %最大迭代次数
nPc=0.8;    %交叉比例
nC=round(nPop*nPc/2)*2; %子代规模大小
nMu=0.01;    %变异概率


template.x=[];
template.y=[];

Parent=repmat(template,nPop,1);


for i=1:nPop

    Parent(i).x=randi([0,1],1,nVar);
    Parent(i).y=fun(Parent(i).x);   %计算适应度值y

end

for It=1:maxIt
    %定义子代数据存放模板
    Offspring=repmat(template,nC/2,2);
    %生成子代种群
    for j=1:nC/2
        p1=selectPop(Parent);
        p2=selectPop(Parent);

        [Offspring(j,1).x,Offspring(j,2).x]=crossPop(p1.x,p2.x);
    end
    Offspring=Offspring(:); %转置
   
    for k=1:nC

        Offspring(k).x=mutatePop(Offspring(k).x,nMu);
        Offspring(k).y=fun(Offspring(k).x);
    end

    %种群筛选
    newPop=[Parent;Offspring];
    [~,so]=sort([newPop.y],'ascend');
    newPop=newPop(so);
    Parent=newPop(1:nPop);

    disp(['迭代次数:',num2str(It),',最小值为:',num2str(Parent(1).y)]);

end

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 03:47 , Processed in 0.089052 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表