遗传算法的一个基本例子(含演变动画)

遗传算法的matlab实现(更新了种群演变动画)
注:智能算法的难点在于如何将方法与具体问题结合

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                   Genetic   Algorithms                               %
%         Author:Ji Jungang     Time:2020/08/23                        %
%   对于多变量问题,交叉和变异以及fitness需要修改,若采用实值编码交叉     %
%和变异也需修改                                                         %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 主函数
function GA_JJG()
clear;clc;
%种群大小
popsize=300;
%二进制编码长度
chromlength=10;
%交叉概率
pc=0.7;
%变异概率
pm=0.001;
%初始种群
pop=initpop(popsize,chromlength);
%制作种群演化动图
c=zeros(200,300);
d=zeros(200,300);
for i=1:200
    %计算适应度
    objvalue=cal_objvalue(pop);
    fitvalue=15+objvalue;%有时目标函数需要转变
    %选择操作
    newpop=selection(pop,fitvalue);
    %交叉操作
    newpop=crossover(newpop,pc);
    %变异操作
    newpop=mutation(newpop,pm);
    %寻找最优解
    [bestindividual,bestfit]=best(pop,fitvalue);
    x2=binary2decimal(bestindividual);
    x1=binary2decimal(newpop);
    y1=cal_objvalue(newpop);
    y2=bestfit-15;
    c(i,:)=x1;
    d(i,:)=y1;
    if(mod(i,20)==0) % 绘图
        figure
        fplot(@(x)10*sin(5*x)+7*cos(4*x),[0 10])
        hold on
        plot(x1,y1,'*')
        plot(x2,y2,'go')
        title(['迭代次数n=' num2str(i)]);
    end
    pop=newpop;
end
%制作种群演化动图
for k=1:200
    fplot(@(x)10*sin(5*x)+7*cos(4*x),[0 10])
    hold on
    plot(c(k,:),d(k,:),'*')
    hold off
    pause(1)
    drawnow;
end 
end
%% 种群生成函数
function pop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));
end
% round四舍五入,rand矩阵
%%  解码(二进制变十进制,独立函数对于多变量情况直接调用)
function pop2=binary2decimal(pop)
[~,py]=size(pop);
for i=1:py
    pop1(:,i)=2.^(py-i).*pop(:,i);
end
temp=sum(pop1,2);
pop2=temp*10/1023+0;
end
%% 计算适应度值(包含解码和目标函数)
function [objvalue]=cal_objvalue(pop)
x=binary2decimal(pop);
objvalue=10*sin(5*x)+7*cos(4*x);
end
%% 选择新个体(轮盘赌选择复制新个体)
function [newpop]=selection(pop,fitvalue)
[px,~]=size(pop);
totalfit=sum(fitvalue);
p_fitvalue=fitvalue/totalfit;
p_fitvalue=cumsum(p_fitvalue);%概率求和和排序
ms=sort(rand(px,1));%产生随机数并从小到大排列
fitin=1;
newin=1;
while newin<=px
    if(ms(newin))<p_fitvalue(fitin)
        newpop(newin,:)=pop(fitin,:);
        newin=newin+1;
    else
        fitin=fitin+1;
    end
end
end
%% 交叉(随机产生交叉节点,相邻两个交叉)
function newpop=crossover(pop,pc)
[px,py]=size(pop);
pop2=pop;
for i=1:2:px-1
    if(rand<pc)
        cpoint=randi([1 py-1]);
        pop1(i,:)=[pop2(i,1:cpoint) pop2(i+1,cpoint+1:py)];
        pop1(i+1,:)=[pop2(i+1,1:cpoint) pop2(i,cpoint+1:py)];
    else
        pop1(i,:)=pop2(i,:);
        pop1(i+1,:)=pop2(i+1,:);
    end
end
newpop=pop1;
end
%% 变异(随机产生变异节点)
    function [newpop]=mutation(pop,pm)
        [px,py]=size(pop);
        pop2=pop;
        for i=1:px
            if(rand<pm)
                mpoint=randi([1 py-1]);
                pop1(i,:)=[pop2(i,1:mpoint) ~pop2(i,mpoint+1:py)];
            else
                pop1(i,:)=pop2(i,:);
            end
        end
        newpop=pop1;
    end
 %% 寻找最优
 function [bestindividual,bestfit]=best(pop,fitvalue)
 [bestfit,index]=max(fitvalue);%index索引指出最大值所在行
 bestindividual=pop(index,:);%提出所对应的行
 end
 上述代码是利用二进制编码实现寻找函数最大值的例子,是最基本的遗传算法。下列的图展示的是不同迭代次数下种群中所有个体的分布情况:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然!下面是一个MATLAB中使用遗传算法解决旅行商问题(TSP)的具体例子: ```matlab % 定义距离矩阵 distances = [...]; % 输入你的距离矩阵 % 定义适应度函数 fitnessFunction = @(path) -sum(distances(sub2ind(size(distances), path(1:end-1), path(2:end)))); % 设置遗传算法参数 populationSize = 100; % 种群大小 numGenerations = 1000; % 迭代次数 crossoverProbability = 0.8; % 交叉概率 mutationProbability = 0.02; % 变异概率 % 创建遗传算法参数对象 gaOptions = gaoptimset('PopulationSize', populationSize, 'Generations', numGenerations, 'CrossoverFraction', crossoverProbability, 'MutationFcn', {@mutationuniform, mutationProbability}); % 执行遗传算法 [optimalPath, optimalDistance] = ga(fitnessFunction, numel(distances), gaOptions); % 输出最优路径和最优距离 disp('最优路径:'); disp(optimalPath); disp('最优距离:'); disp(-optimalDistance); ``` 在这个例子中,我们首先定义了一个距离矩阵 `distances`,用于表示城市之间的距离。然后,我们定义了适应度函数 `fitnessFunction`,其计算方式是路径上所有边的距离之和的负值,目标是最小化总距离。 接下来,我们设置了遗传算法的参数,包括种群大小、迭代次数、交叉概率和变异概率。 然后,我们使用 `gaoptimset` 创建了一个遗传算法参数对象 `gaOptions`,其中指定了之前设置的参数。 最后,我们使用 `ga` 函数执行遗传算法,并得到最优路径 `optimalPath` 和最优距离 `optimalDistance`。 注意:在上述代码中,我们使用了默认的变异函数 `mutationuniform`,它是一种均匀变异方式。如果你希望尝试其他变异函数,请查阅MATLAB文档以了解更多信息。此外,你需要根据自己的需求调整参数和适应度函数来适应不同的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值