遗传算法整理

2023-11-15

1、基本概念
使用群体搜索技术,将种群代表一组问题解,通过对当前种群施加选择、交叉和变异等一系列遗传操作来产生新一代种群,并逐步使种群进化到包含近似最优解的状态。

2、遗传算法流程
在这里插入图片描述

3、标准遗传算法
标准遗传算法又称为经典遗传算法,它的优化变量由二进制编码来描述,多个优化变量的二进制编码串接在一起组成染色体,这种编码既适用于变异操作,又适用于交叉操作。在创建初始群体时,代表个体的二进制串是在一定字长的限制下随机产生的。

例 2.1 用标准遗传算法求函数 f(x) = x + 10sin(5x) + 7cos(4x) 的最大值,其中 x 的取值范围为[0,10]。

1)创建初始群体

NP = 50; %群体规模 一般取10~200
L = 20; %二进制位串长度
Pc = 0.8; %交叉概率 0.25~1.00
Pm = 0.1; %变异概率 0.001~0.1
G = 100; %最大遗传代数 100~1000
Xs = 10; % x取值上界
Xx = 0; % x取值下界
f = round(rand(50,20)); %随机生成50x20的矩阵,每个元素均为0/1,每一行表示一个个体

2)计算适应度值
常见的适应度函数构造方法主要有:目标函数映射成适应度函数、基于序的适应度函数等。
将每一个二进制个体转化为十进制,并将数值调整到定义域内,带入目标函数计算适应度值

%适应度函数
function result = func1(x)
fit = x+10*sin(5*x)+7*cos(4*x);
result = fit;
end
 for i = 1:NP %二进制换十进制
        U = f(i,:);
        m = 0;
        for j = 1:L
            m = U(j)*2^(j-1)+m;
        end
        x(i) = Xx+m*(Xs-Xx)/(2^L-1);
        Fit(i) = func1(x(i)); 
    end
    maxFit = max(Fit);
    minFit = min(Fit);
    rr = find(Fit==maxFit); %适应度最大元素的下标
    fBest = f(rr(1,1),:);%二进制初始群体中适应度最大个体
    xBest = x(rr(1,1));%缩小至0-10中该个体所对应的十进制
    %因为适度最大可能对应多个个体,但是只选其中一个作为最优,所以r(11)
    Fit = (Fit - minFit)/(maxFit-minFit);%归一化适应度值
    %选择时用“轮盘赌”方法,需要与0-1的指针的进行对比,所以将适应度值进行归一,缩小至0-1

3)选择操作
“轮盘赌”选择法
原理参考:https://blog.csdn.net/qq_33649817/article/details/86582420

sum_Fit = sum(Fit);
    fitvalue = Fit./sum_Fit;
    fitvalue = cumsum(fitvalue); %累积和  1x50
    ms = sort(rand(NP,1));%按升序对元素进行排序 50x1
    fiti = 1;
    newi = 1;%选择指针
    while newi <= NP
        if (ms(newi))<fitvalue(fiti)
            nf(newi,:) = f(fiti,:);
            newi = newi+1;
        else
            fiti = fiti+1;
        end
    end

整理的过程中考虑了一下会不会存在fitvalue先遍历完的情况,感觉是不会存在,因为最后一个fitvalue为1,rand随机生成的值是小于1的。

4)交叉操作
交叉算子作用在按交叉概率选中的两个染色体上,随机选中交叉位置,将两个染色体上对应于这些位置上的二进制数值交换,生成两个新的个体。

 % 基于概率的交叉操作
    for i = 1:2:NP %相邻两个为一对交叉染色体组
        p = rand;
        if p<Pc % Pc 交叉率0.8 选择要进行交叉操作的两个染色体
            q = round(rand(1,L)); %1x20 元素均为0/1 选择进行交叉操作的基因位置,等于1的位置进行二进制数值交换
            for j = 1:L 
                if q(j) == 1
                    temp = nf(i+1,j) ;
                    nf(i+1,j) = nf(i,j);
                    nf(i,j) = temp;
                end
            end
        end
    end

在这里插入图片描述
5)变异操作
变异算子作用在按变异概率随机选中的个体上,一般是随机选定变异位,将该位的二进制值取反,生成一个新的个体。

 %基于概率的变异操作
    i = 1;
    while i<= round(NP*Pm) %染色体变异的个数
        h = randi(NP); %随机选取一个需要变异的染色体
        for j = 1:round(L*Pm) % 基因变异的个数
            g = randi(L); %随机选取一个需要变异的基因
            nf(h,g) = ~nf(h,g); % ~非,取反
        end
        i = i+1;
    end

4、君主方案
对群体根据适应度值高低进行排序的基础上,用最优个体与其他偶数位的所有个体进行交叉,每次交叉产生两个新的个体,用于选择和交叉操作。

% 采用君主方案进行选择交叉操作
    Emper = Sortf(:,1);%问题求最小值,按照升序排列适应度值,第一个为最优个体
    NoPoint = round(D*Pc); %每次交叉点的个数
    PoPoint = randi(D,NoPoint,NP/2); %交叉基因的位置 NoPointxNP/2
    nf = Sortf;
    for i = 1:NP/2
        nf(:,2*i-1) = Emper; %将奇数列均变为Emper
       % nf(:,2*i) = Sortf(:,2*i);
        for k = 1:NoPoint
            nf(PoPoint(k,i),2*i-1) = nf(PoPoint(k,i),2*i);%相邻两列进行交叉变换产生两个新个体
            nf(PoPoint(k,i),2*i) = Emper(PoPoint(k,i));
        end
    end

假设NoPoint=8,NP/2=10,得到每一组染色体应该交叉的基因位置
PoPoint
在这里插入图片描述
交叉变异之后,计算子群体的适应度值,然后将子群体与父群体合并,并且根据适应度值进行排序,取前NP个个体为新群体,进行下一次遗传操作。

%子种群按适应度升序排列
    for np = 1:NP
        NMSLL(np) = func2(nf(:,np));
    end
    [NSortMSLL,Index] = sort(NMSLL);
    NSortf = nf(:,Index);
% 产生新种群 将两个种群合并,并排序,选取前NP个
    f1 = [Sortf,NSortf];
    MSLL1 = [SortMSLL,NSortMSLL];
    [SortMSLL1,Index] = sort(MSLL1);
    Sortf1 = f1(:,Index);
    SortMSLL = SortMSLL1(1:NP);
    Sortf = Sortf1(:,1:NP);
    trace(gen) = SortMSLL(1); %历代最优适应度值
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遗传算法整理 的相关文章

随机推荐

  • 基于教学优化算法(TLBO)求解TSP问题 (Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 目录 1 概述 2 运行结果
  • [ 靶场环境篇 ] XSS-labs 靶场环境搭建(特别详细)

    博主介绍 博主介绍 大家好 我是 PowerShell 很高兴认识大家 主攻领域 渗透领域 数据通信 通讯安全 web安全 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 文末有彩蛋 作者水平有限 欢
  • vscode中文注释显示成乱码

    在Ubuntu中用vscode打开代码后发现中文部分出现乱码 搜索了一下方才找到简洁的解决办法 具体如下 1 打开vscode 打开带有中文注释的代码 可以看到中文注释部分为乱码 2 按住ctrl p键 在查找选项框中输入下列的命令 则有下
  • MySQL日志设置及查看

    MySQL有以下几种日志 错误日志 log err 查询日志 log 慢查询日志 log slow queries 更新日志 log update 二进制日志 log bin 默认情况下 所有日志创建于mysqld数据目录中 通过刷新日志
  • 【POJ 2406】 Strings

    Strings Time Limit 3000MS Memory Limit 65536K Total Submissions 35168 Accepted 14543 Description Given two strings a and
  • hosts文件为空白或删除情况修复

    直接输入修改即可 ip baiTab 空格 域名 回车 即可 du如果不放心 复制以下内容zhi修复hosts文件 再修dao改hosts文件 Copyright 1993 1999 Microsoft Corp This is a sam
  • 嵌入式面试题及答案

    我们在找嵌入式方面的工作时 最让我们头疼的恐怕就是技术类的面试题了 因为我们摸不到企业的命题规律 也不知道该怎样去准备 今天华清远见的高级嵌入式讲师将各大企业的面试题进行汇总 分享给大家 希望可以帮到各位小伙伴 下方附有答案哦 一 选择题
  • 深度学习基础模型算法原理及编程实现--10.优化方法:从梯度下降到NAdam

    文章列表 1 深度学习基础模型算法原理及编程实现 01 感知机 2 深度学习基础模型算法原理及编程实现 02 线性单元 3 深度学习基础模型算法原理及编程实现 03 全链接 4 深度学习基础模型算法原理及编程实现 04 改进神经网络的方法
  • C/C++趣味编程经典100例详解

    更新记录 2019 08 27 28题 重写 C C 语言经典 实用 趣味程序设计编程百例精解 1 绘制余弦曲线 在屏幕上用 显示0 360度的余弦函数cos x 曲线 问题分析与算法设计 如果在程序中使用数组的话 这个问题十分简单 但若规
  • 阿辉闯Java(Java基本语法)

    hallo 大家好 接下来和阿辉一起了解一下Java的基本语法吧 1 Java程序的基本格式 Java程序代码必须放在一个类中 初学者可以简单地把一个类理解为一个Java程序 类使用class关键字定义 在class前面可以有类的修饰符 类
  • 二十、转置矩阵

    1 定义 假设 交换A的所有行和列后 形成的新矩阵 即为矩阵A的转置矩阵 对一个矩阵进行转置的转置 结果是原矩阵 2 下面为转置矩阵的性质 分析矩阵时 我们主要从加法 乘法 零空间 列空间 秩 行列式等角度进行分析 矩阵又分为原始矩阵 逆矩
  • Uncaught ReferenceError: xxx is not defined 解决办法

    VM11371 1 Uncaught ReferenceError inputSize is not defined at
  • JSP&EL表达式&MVC&三层结构综合案例

    文章目录 JSP 1 JSP 概述 2 JSP 快速入门 2 1 搭建环境 2 2 导入 JSP 依赖 2 3 创建 jsp 页面 2 4 编写代码 2 5 测试 3 JSP 原理 4 JSP 脚本 4 1 JSP 脚本分类 4 2 案例
  • YOLOv7原文翻译

    前言 这个本来是我的毕业论文文献翻译 但是老师给打回来了 原因是网上的重合率太高 所以我又重新找了一篇 大家 文献翻译千万不要找大热门 太痛苦了 但是翻都翻完了所以就扔上来 除了一些名词不知道怎么翻译之外也还好 按理这些名词应该不翻译直接用
  • CentOS7下解决ifconfig command not found的办法

    注 本办法仅限于可联网的机器 即在安装时设置了IP地址和DNS可正常上网 解决办法如下 1 输入ip addr 确认IP地址是否设置正常 设置好如下所示 如果没有获取到IP地址则设置一个即可 2 确认sbin目录是否存在 cd sbin 3
  • Makefile学习(二)

    Makefile 1 ifeq DEBUG true 2 CC gcc g 生成debug版本 才可以生成调试信息 对程序进行调试 3 else 4 CC gcc 5 endif 6 all hello 7 hello lcd o play
  • 使用 Docker Desktop 安装 Centos 系统

    一 前言 由于 Docker 是一个容器 它支持在一个服务器进行多服务部署 并且还能保持服务的独立性 那么 在Docker 上的运用时 我们也是可以 独立部署多个系统来做不同是其他 这样环境独立的情况下 也就不会造成一下不必要的问题 二 使
  • 后端开发通用

    1 前后端开发 项目基于前后端分离的架构进行开发 前后端分离架构总体上包括前端和服务端 通常是多人协作开发 对于后端java工程师 把精力放在设计模式 spring springmvc linux mysql事务隔离与锁机制 mongodb
  • WB_BF项目问题说明以及探究

    我就现在WB BF项目群里面提到的 根据测试脚本运行日志来看 bf运行了约31小时后又开始出现了api调用返回nginx的错误信息 之后 bf客户端也无法打开 问题做一下说明 今天早上我在机器上复现了这一问题 针对于api调用会返回ngin
  • 遗传算法整理

    1 基本概念 使用群体搜索技术 将种群代表一组问题解 通过对当前种群施加选择 交叉和变异等一系列遗传操作来产生新一代种群 并逐步使种群进化到包含近似最优解的状态 2 遗传算法流程 3 标准遗传算法 标准遗传算法又称为经典遗传算法 它的优化变