利用遗传算法求解函数极值

本文深入探讨遗传算法的基本原理,包括变量说明、操作流程、适应度评估和遗传算子。通过一个具体的函数优化问题,展示了遗传算法的代码实现,包括种群初始化、轮盘赌选择、交叉和变异等步骤,帮助读者理解并掌握遗传算法的应用。
摘要由CSDN通过智能技术生成

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

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

🌟本文由卿云阁原创!

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

📆首发时间:🌹2021年12月11日🌹

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

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


目录

0️⃣变量说明

         1️⃣基本流程 

2️⃣函数     

3️⃣基本原理

4️⃣代码部分

  



0️⃣✨✨✨变量说明✨✨✨

f 个体适应度

[Umin,Umax]  某变量的取值范围

δ 编码精度


1️⃣✨✨✨基本流程✨✨✨ 

Step1:参数设置及种群初始化;

Step2:适应度评价;

Step3:轮盘赌选择;

Step4:交叉;

Step5:变异;

Step6:适应度评价;

Step7:终止条件判断,若未达到终止条件,则转到Step3;

Step8:输出结果。


2️⃣✨✨✨函数✨✨✨       

1.例程GA.m为主函数,是对函数f(x,y)=x2+y2(-1<x<1,-1<y<1)求解最小值。

2.decod.m 为子函数,实现二进制编码到十进制数的转换功能,需要同学们自行完成。decod(v,l)的输入参数v表示待转换的二进制编码,l表示二进制编码的长度。v为N×l的矩阵,其中N表示种群中的个体数,即decod.m应当可以将N个长度为l的二进制编码的个体转换为N个十进制数。


3️⃣✨✨✨基本原理✨✨✨  

1.遗传算法概要

遗传算法是具有“生成+检测”的迭代过程的搜索算法。它的基本处理流程如图所示。由此流程图可见,遗传算法是一种群体型操作,该操作以群体中的所有个体为对象。选择(selection)、交叉(crossover)和变异(mutation)是遗传算法的3个主要操作算子,它们构成了所谓的遗传操作(genetic operation),使遗传算法具有了其它传统方法所没有的特性。遗传算子包含如下6个基本因素:

  1. 参数编码:由于遗传算法不能直接处理解空间的解数据,因此必须通过编码将它们表示成遗传空间的基因型串结构数据。
  2. 生成初始群体:由于遗传算法的群体型操作需要,所以必须为遗传操作准备一个由若干初始解组成的初始群体。初始群体的每个个体都是通过随机方法产生。
  3. 适应度评估检测:遗传算法在搜索进化过程中一般不需要其他外部信息,仅用适应度(fitness)值来评估个体或解的优劣,并作为以后遗传操作的依据。
  4. 选择(selection):选择或复制操作是为了从当前群体中选出优良的个体,   使它们有机会作为父代为下一代繁殖子孙。个体适应度越高,其被选择的机会就越多。此处采用与适用度成比例的概率方法进行选择。具体地说,就是首先计算群体中所有个体适应度的总和,再计算每个个体的适应度所占的比例,并以此作为相应的选择概率。
  5. 交叉操作:交叉操作是遗传算法中最主要的遗传操作。简单的交叉(即一点交叉)可分两步进行:首先对种群中个体进行随机配对;其次,在配对个体中随机设定交叉处,配对个体彼此交换部分信息。

(6)  变异:变异操作是按位(bit)进行的,即把某一位的内容进行变异。变异操作同样也是随机进行的。一般而言,变异概率都取得较小。变异操作是十分微妙的遗传操作,它需要和交叉操作配合使用,目的是挖掘群体中个体的多样性,克服有可能限于局部解的弊病。

2.二进制编码及解码方法

二进制编码是遗传算法中最主要的一种编码方法,它使用的编码符号集是由二进制符号0和1所组成的二进制符号集{0,1},它所构成的个体基因型是一个二进制编码符号串。

二进制编码符号串的长度与问题所要求的求解精度有关。假设某一参数的取值范围是[Umin,Umax],我们用长度为L的二进制编码符号串来表示该参数,则它总共能够产生种不同的编码,若使参数编码时的对应关系如下:

00000000…00000000=0      →    Umin

  00000000…00000001=1      →    Umin+δ

       …                …    …

111111111…11111111=2L﹣1  →    Umax


4️⃣✨✨✨代码部分✨✨✨

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

1.要新建一个文件夹

 2.打开该文件夹,在新建脚本或函数。

  

GA.m

%基于遗传算法的函数优化 GA.m

clc;

clear;close all;

p = rand(50,22);

v = 2*rand(50,22)-1;

v=hardlim(v);

[N,L] = size(v); ger = 200; pc = 0.5; pm = 0.01; updatef=0;c=0;

disp(sprintf('Number of generations: %d',ger));

disp(sprintf('Population size: %d',N));

disp(sprintf('Crossover probability: %.3f',pc));

disp(sprintf('Mutation probability: %.3f',pm));

f='-1*(x.^2+y.^2)';

% General parameters & Initial operations

sol1=1; vmfit = []; it = 1; vx = []; C = [];updatef=-10;

 x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f);

% Generations

t0 = clock;

while it <= ger

% Selection 轮盘赌

for i=1:N

    sp(i)=(fit(i)+3)/sum(fit+3);%

end

for i=2:N

   sp(i)=sp(i-1)+sp(i);

end

for i=1:N

   p=rand(1); sindex=1;

   while p > sp(sindex)

      sindex=sindex+1; %寻找要选择个体的位置

   end

   newv(i,:)=v(sindex,:);

end

for i=1:N

   v(i,:)=newv(i,:);%用选择出的个体构成的种群替代旧的种群

end

% Crossver

for i=1:N

   cindex(i)=i;

end

for i=1:N %产生要配对的父代的序号;经过N次顺序调换,将原有顺序打乱,使相邻两个个体作为交叉的父代

   point=unidrnd(N-i+1);

   temp=cindex(i);

   cindex(i)=cindex(i+point-1);

   cindex(i+point-1)=temp;

end

for i=1:2:N

   p=rand(1);

   if(p<pc)

      point=unidrnd(L-1)+1;%1<point<L 产生交叉点

      for j=point:(L-1) %交叉

         ch=v(cindex(i),j);

         v(cindex(i),j)=v(cindex(i+1),j); %cindex中相邻的两个为两个父代的序号

         v(cindex(i+1),j)=ch;

      end

   end

end

% Mutation

M=rand(N,L)<=pm;%产生(N,L)维的01矩阵,为1的位置进行变异

v=v-2.*(v.*M)+M;

% Evaluatefitness & Evolution

x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f);

[sol1,indb1] = max(fit);

if updatef>=sol1

   sol1=updatef;

   v(indb1,:)=updatec;

end

updatef=sol1;

updatec=v(indb1,:);

[sol2,indb2] = min(fit);

v(indb2,:) = v(indb1,:);

x = decod(v(:,1:11),11); y = decod(v(:,12:end),11); fit = eval(f);

media = mean(fit);

vx = [vx sol1]; vmfit = [vmfit media];

    if rem(it,1) == 0 | it == 10,

       if c~=1

          disp(sprintf('Gen.: %d  x: %2.5f  y: %2.5f  Av: %2.2f  f(x,y): %2.40f',it,x(indb1),y(indb1),media,sol1));

      else

          disp(sprintf('Gen.: %d   Av: %2.2f  f(x,y): %2.5f',it,media,sol1));

      end

    end;

    it = it + 1;

end;

T = etime(clock,t0); %F = flops - f0;

X=x;Y=y;

x = x(indb1); y = y(indb1); fx = sol1; P = v;

disp(sprintf('the total time is %2.4f',T));

 disp(sprintf('Maximum found [f(x,y)]: [%.2f]',fx));

%       xx=vx;yy=vmfit;

      figure(2); plot(vx,'k');

      title('f(x,y) x Mean'); xlabel('Generations'); ylabel('f(x,y)');

      hold on; plot(vmfit,'k:'); legend('best','mean',0);hold off;

decod.m

function x = decod(v,l)%解码子函数

%********************************

[length ,width]=size(v);

x=zeros(1,length);

for i=1:length

    sum=0;

    for j=1:l

        sum=sum+v(i,j)*2^(1-j);

    end

    x(i)=-1+sum+2/(2^l-1);

end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卿云阁

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

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

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

打赏作者

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

抵扣说明:

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

余额充值