ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

遗传算法1(观看B站视频笔记,含示例代码)

2021-07-12 14:34:08  阅读:254  来源: 互联网

标签:示例 笔记 sj 算子 遗传算法 100 c1 群体


对于最优化问题,目标函数和约束条件种类繁多,主要求最优解的方法有三种:枚举法、启发式算法、搜索算法。

遗传算法就是全局搜索算法。

遗传算法中最优解的搜索过程是模仿生物的进化过程,使用所谓的遗传算子(Genetic operators)作用于群体P(t)中,进行下述遗传操作,从而得到新一代群体P(t+1)。

生物是以集团的方式去进化的,那这个集团就称之为群体。群体的单元就称之为个体。

表1 生物遗传概念在遗传算法中的对应关系

生物遗传概念遗传算法中的作用
适者生存 算法停止时,最优目标值的可行解有最大的可能被留住 
个体可行解
染色体可行解的编码
基因可行解中每一分量的特征
适应性适应度函数值
种群根据适应度函数值选取的一组可行解
交配通过交配原则产生一组新可行解的过程
变异编码的某一分量发生变化的过程

三个遗传算子主要是选择算子——交叉算子——变异算子。

(1)选择(Selection)算子的作用其实是复制。

根据各个个体的适应度,按照一定的规则或方法,从第t代群体P(t)中选择出一些优良的个体遗传到下一代群体P(t+1)中。

(2)交叉(Crossover)算子

将群体P(t)内的各个个体随机搭配成对,对每一对个体,以某种概率(交叉概率)交换它们之间的部分染色体。

(3)变异(Mutation)算子

对群体P(t)中的每一个个体,以某一概率(变异概率)改变某一个或某一些基因座上的基因值为其他的等位基因。

 示例一:遗传算法的手工模拟计算示例

 这里因为是手工计算,所以群体规模的大小取为4,代码里可以取500。

选择算子:①到⑧

        ⑤适应度

        ⑥适用度概率

        ⑦根据⑥的大小,选择最大概率的4两次,最小的3不选,其他的选一次,这样选择次数的数量和原始初始群体的数量一致。

交叉算子:⑨到11

        ⑩2号交叉点进行交叉,4号交叉点进行交叉(这里应该是从交叉点开始后面全部交叉,索引从1开始)

变异算子:11到13

         12.变异点变异

 然后重复,直至满足迭代次数的时候。

示例二: 一个旅行商问题(Matlab)

已知100个目标的经纬度,我方派一架飞机从基地出发,侦察完所有目标,再返回原来的基地。在每一目标点的侦察时间不计,求该架飞机所花费的时间。

clc,clear, close all
sj0=load('data12_1.txt');
x=sj0(:,1:2:8); x=x(:);
y=sj0(:,2:2:8); y=y(:);
sj=[x y]; d1=[70,40]; 
xy=[d1;sj;d1]; sj=xy*pi/180;  %单位化成弧度
d=zeros(102); %距离矩阵d的初始值
for i=1:101
  for j=i+1:102
      d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*...
          cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)));
  end
end
d=d+d'; w=50; g=100; %w为种群的个数,g为进化的代数
for k=1:w  %通过改良圈算法选取初始种群
    c=randperm(100); %产生1,...,100的一个全排列  
    c1=[1,c+1,102]; %生成初始解
    for t=1:102 %该层循环是修改圈 
        flag=0; %修改圈退出标志
    for m=1:100
      for n=m+2:101
        if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))<...
                d(c1(m),c1(m+1))+d(c1(n),c1(n+1))
           c1(m+1:n)=c1(n:-1:m+1);  flag=1; %修改圈
        end
      end
    end
   if flag==0
      J(k,c1)=1:102; break %记录下较好的解并退出当前层循环
   end
   end
end
J(:,1)=0; J=J/102; %把整数序列转换成[0,1]区间上的实数,即转换成染色体编码
for k=1:g  %该层循环进行遗传算法的操作 
    A=J; %交配产生子代A的初始染色体
    c=randperm(w); %产生下面交叉操作的染色体对 
    for i=1:2:w  
        F=2+floor(100*rand(1)); %产生交叉操作的地址
        temp=A(c(i),[F:102]); %中间变量的保存值
        A(c(i),[F:102])=A(c(i+1),[F:102]); %交叉操作
        A(c(i+1),F:102)=temp;  
    end
    by=[];  %为了防止下面产生空地址,这里先初始化
while ~length(by)
    by=find(rand(1,w)<0.1); %产生变异操作的地址
end
B=A(by,:); %产生变异操作的初始染色体
for j=1:length(by)
   bw=sort(2+floor(100*rand(1,3)));  %产生变异操作的3个地址
   B(j,:)=B(j,[1:bw(1)-1,bw(2)+1:bw(3),bw(1):bw(2),bw(3)+1:102]); %交换位置
end
   G=[J;A;B]; %父代和子代种群合在一起
   [SG,ind1]=sort(G,2); %把染色体翻译成1,...,102的序列ind1
   num=size(G,1); long=zeros(1,num); %路径长度的初始值
   for j=1:num
       for i=1:101
           long(j)=long(j)+d(ind1(j,i),ind1(j,i+1)); %计算每条路径长度
       end
   end
     [slong,ind2]=sort(long); %对路径长度按照从小到大排序
     J=G(ind2(1:w),:); %精选前w个较短的路径对应的染色体
end
path=ind1(ind2(1),:), flong=slong(1)  %解的路径及路径长度
xx=xy(path,1);yy=xy(path,2);
plot(xx,yy,'-o') %画出路径

B站视频链接:https://www.bilibili.com/video/BV1zp4y1U7Ti

标签:示例,笔记,sj,算子,遗传算法,100,c1,群体
来源: https://blog.csdn.net/Han_torch/article/details/118673006

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有