遗传算法总结(迭代版本2:附带MATLAB例题代码)

目录

基本概念:

具体例子

1.我们先对图像进行抽象化:

2.我们将得到的六串数字进行扁平化处理:

3.解释即后续操作​编辑

基本步骤:

总结

例题1:

例题2:


基本概念:

  1. 染色体(Chromosome):染色体是遗传算法中表示解决方案的数据结构。它是由一系列基因组成的,每个基因对应着解决方案的一个组成部分

  2. 基因(Gene):基因染色体中的一个元素,它对应着解决方案的一个特定部分。基因可以是二进制、整数或实数等不同的类型(这里的基因【解决方案的一小部分】取决于想将染色体【即解决方案】划分成由多少个相同小部分的组成),具体取决于问题的性质

  3. 种群(Population):种群是由多个个体组成的集合,每个个体都表示解决方案的一个可能性。种群中的个体通过进化操作进行交叉变异,以产生新的个体。

  4. 适应度函数(Fitness Function):适应度函数用于衡量个体的优劣程度(即我们给出的函数的适应程度好不好)。它将染色体映射到一个适应度值,该值指示了染色体对问题的解决程度。适应度函数的设计取决于具体的问题优化目标

  5. 选择操作(Selection):选择操作用于选择优良个体作为下一代的父代。选择操作通常根据个体的适应度值进行选择,使适应度较高的个体有更高的概率被选中(即在进行交叉突变之后得到的种群,选择适应程度高的个体)。

  6. 交叉操作(Crossover):交叉操作是通过交换两个染色体部分基因(即解决方案的一部分),产生新的个体。通过交叉操作,可以将两个个体的优良特征进行组合,产生更好的解决方案

  7. 突变操作(Mutation):突变操作是在染色体中引入随机变化,以增加种群的多样性。突变操作有助于避免算法陷入局部最优解,并探索搜索空间中的新解。

  8. 进化(Evolution):进化是指种群中的个体通过选择、交叉和突变等操作逐代演化的过程。通过不断迭代优化,种群中的个体逐渐适应环境,并产生更好的解决方案

  9. 最优解(Optimal Solution):在遗传算法中,最优解是指具有最佳适应度值个体或染色体,它代表了问题的最优解决方案


具体例子

为了进一步的理解这里给出具体的例子:

先举一个实际例子采用b站【数之道14】六分钟时间,带你走近遗传算法_哔哩哔哩_bilibili视频所给出的例子:

 

就比如说我们现在要找出最适应的解决方案,能够成功展示上面的图像。

1.我们先对图像进行抽象化:

将整个图形化成相同的6*6大小的小方格,其中对于白色格子我们用0表示,黑色格子我们用1来表示,那么我们就可以把问题最终的图形抽象为六串数字:

第一行:0 0 0 0 0 0 

第二行:0 1 0 0 1 0

第三行:0 0 0 0 0 0

第四行:1 0 0 0 0 1

第五行:0 1 1 1 1 0

第六行:0 0 0 0 0 0
我们将该六串数字再重新表示一下并与原图进行比较,我们可以发现两者表示含义一样:

2.我们将得到的六串数字进行扁平化处理:

得到:0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 0 0

我们就将该得到的一串数字称为染色体,而基因则是对于其中的一个数字进行描述。

扁平化处理过程样例如下:

3.解释即后续操作

我们将扁平化后的一串数字称为原图染色体 。

基本步骤:

1.随机生成一个包含10个染色体的祖先群落:

2.随机选择两个染色体进行交叉操作,即截取染色体的一部分基因与另一个染色体进行交换,互换后得到两个新染色体(由两个原来的染色体,经过互换完成后形成的两个新染色体)

3.随机选取一个染色体进行突变操作,即在随机位置进行基因变异操作(例如让0变1,或者1变0),突变后得到一个新染色体。

4.将所有的染色体分别和原图染色体求基因差值的平方和(求得的即适合度值),对于适合值进行排序(现在有13个染色体),取最小的10个染色体作为新的群落。

重复上面的步骤,当我们每进行一次上面得到步骤,将得到的最小的染色体的逆扁平化,然后绘制成图片的时候,就可以得到染色体逐步进化的过程了。

总结

遗传算法是一个通过不断试错、交叉和突变的过程来更新种群并寻找最优解决方案的优化方法。我们可以观察到它是一个不断试错的过程。

交叉操作通过交换染色体的部分基因,促使优良特征种群中传递和组合,从而产生更优的解决方案。这种信息交流可以帮助种群逐渐趋向最优解。

突变操作引入随机性,使得染色体产生变化。它有助于避免算法陷入局部最优解,通过引入新的个体,扩大搜索空间,有机会发现更好的解决方案

虽然交叉和突变操作对于遗传算法的成功至关重要,但它们不是万能的。在某些情况下,交叉和突变可能无法有效地改进解决方案。在这种情况下,可能需要考虑其他策略,如改变选择操作、调整适应度函数或引入其他启发式方法。

例题1:

假设我们要使用遗传算法求解以下的多元多峰函数问题:

目标函数:f(x1, x2) = sin(x1) + cos(x2),其中 -10 ≤ x1 ≤ 10,-10 ≤ x2 ≤ 10。

我们可以使用遗传算法来寻找使目标函数取得最大值的解。

% 目标函数:f(x1, x2) = sin(x1) + cos(x2),其中 -10 ≤ x1 ≤ 10,-10 ≤ x2 ≤ 10。

% 遗传算法参数设置
populationSize = 50; % 种群大小
chromosomeLength = 2; % 染色体长度
generationCount = 100; % 迭代次数
mutationRate = 0.01; % 变异率

% 初始化种群
% 生成一个大小为 populationSize 行 chromosomeLength 列的随机矩阵
% 矩阵中的元素是从0到1之间均匀分布的随机小数。然后乘以 20
% 将随机数的范围扩大到0到20之间。最后减去 10,将随机数的范围调整到-10到10之间
population = rand(populationSize, chromosomeLength) * 20 - 10;

% 迭代优化过程
for generation = 1:generationCount
    % 计算适应度
    fitness = calculateFitness(population);
    
    % 选择操作
    selectedPopulation = selection(population, fitness);
    
    % 交叉操作
    offspringPopulation = crossover(selectedPopulation);
    
    % 变异操作
    mutatedPopulation = mutation(offspringPopulation, mutationRate);
    
    % 更新种群
    population = mutatedPopulation;
end

% 最优解
% 从种群中选择出第一个个体的所有基因
% 将这些基因赋值给 bestIndividual
% 即得到了种群中适应度最好的个体的染色体表示。
bestIndividual = population(1,:);
bestFitness = calculateFitness(bestIndividual);

% 打印结果
disp(['最优解: ', num2str(bestIndividual)]);
disp(['最优适应度: ', num2str(bestFitness)]);

% 计算适应度函数
function fitness = calculateFitness(population)
    % 计算每个个体的适应度值
    % 这里根据目标函数进行计算
    % fitness = sin(x1) + cos(x2);
    fitness = sin(population(:,1)) + cos(population(:,2));
end

% 选择操作(使用轮盘赌选择)
function selectedPopulation = selection(population, fitness)
    % 根据适应度值进行选择操作
    % 这里使用轮盘赌选择方法

    % 计算适应度值的总和 fitnessSum,用于后续计算选中概率。
    fitnessSum = sum(fitness);
    % 计算每个个体被选中的概率 probabilities,即每个个体适应度值除以适应度值总和。
    probabilities = fitness / fitnessSum;
    % 计算累积概率 cumulativeProbabilities,通过对选中概率进行累加得到的向量。
    cumulativeProbabilities = cumsum(probabilities);

    % 创建一个与种群大小相同的空矩阵 selectedPopulation,用于存储选择后的个体。
    selectedPopulation = zeros(size(population));
    for i = 1:size(population, 1)
        r = rand();
        % 在累积概率向量 cumulativeProbabilities 中找到第一个大于等于 r 的索引值 selectedIdx。
        selectedIdx = find(cumulativeProbabilities >= r, 1);
        % 将种群中索引为 selectedIdx 的个体复制到 selectedPopulation 中的对应位置。
        selectedPopulation(i,:) = population(selectedIdx,:);
    end
end

% 交叉操作(使用单点交叉)
function offspringPopulation = crossover(selectedPopulation)
    % 根据选择的个体进行交叉操作
    % 这里使用单点交叉方法

    % 创建一个与选择后种群大小相同的空矩阵 offspringPopulation,用于存储交叉后的后代个体。
    offspringPopulation = zeros(size(selectedPopulation));
    for i = 1:2:size(selectedPopulation, 1)
        % 获取第一个父母个体 parent1 和第二个父母个体 parent2。
        parent1 = selectedPopulation(i,:);
        parent2 = selectedPopulation(i+1,:);
        
        % 随机选择一个交叉点 crossoverPoint,位于染色体的基因位置上,用于划分交叉片段。
        crossoverPoint = randi([1 size(selectedPopulation, 2)]);
        
        % 通过将 parent1 的交叉点之前的基因与 parent2 的交叉点之后的基因连接,得到第一个后代个体 offspring1。
        offspring1 = [parent1(1:crossoverPoint) parent2(crossoverPoint+1:end)];
        % 通过将 parent2 的交叉点之前的基因与 parent1 的交叉点之后的基因连接,得到第二个后代个体 offspring2。
        offspring2 = [parent2(1:crossoverPoint) parent1(crossoverPoint+1:end)];
        
        % 将 offspring1 和 offspring2 分别存储到 offspringPopulation 中对应的位置。
        offspringPopulation(i,:) = offspring1;
        offspringPopulation(i+1,:) = offspring2;
    end
end

% 变异操作(使用位变异)
function mutatedPopulation = mutation(offspringPopulation, mutationRate)
    % 对交叉后的个体进行变异操作
    % 这里使用位变异方法

    % 创建一个与交叉后个体集合大小相同的矩阵 mutatedPopulation,用于存储变异后的个体。
    mutatedPopulation = offspringPopulation;
    for i = 1:size(mutatedPopulation, 1)
        for j = 1:size(mutatedPopulation, 2)
            % 如果 rand() 小于变异率 mutationRate,则进行变异操作。 
            if rand() < mutationRate
                mutatedPopulation(i,j) = rand() * 20 - 10;
            end
        end
    end
end

例题2:

假设我们要使用遗传算法求解以下的多元多峰函数问题:

目标函数:f(x1, x2) = -[(1 - x1)^2 + 100 * (x2 - x1^2)^2],其中 -2 ≤ x1 ≤ 2,-1 ≤ x2 ≤ 3。

该函数被称为Rosenbrock函数,是一个经典的多峰函数,具有一个全局最优解和多个局部最优解。

% 目标函数:f(x1, x2) = -[(1 - x1)^2 + 100 * (x2 - x1^2)^2],其中 -2 ≤ x1 ≤ 2,-1 ≤ x2 ≤ 3。
% 该函数被称为Rosenbrock函数,是一个经典的多峰函数,具有一个全局最优解和多个局部最优解。

% 遗传算法参数设置
populationSize = 50; % 种群大小
chromosomeLength = 2; % 染色体长度
generationCount = 100; % 迭代次数
mutationRate = 0.01; % 变异率

% 初始化种群
population = rand(populationSize, chromosomeLength) * 4 - 2;

% 迭代优化过程
for generation = 1:generationCount
    % 计算适应度
    fitness = calculateFitness(population);
    
    % 选择操作
    selectedPopulation = selection(population, fitness);
    
    % 交叉操作
    offspringPopulation = crossover(selectedPopulation);
    
    % 变异操作
    mutatedPopulation = mutation(offspringPopulation, mutationRate);
    
    % 更新种群
    population = mutatedPopulation;
end

% 最优解
bestIndividual = population(1,:);
bestFitness = calculateFitness(bestIndividual);

% 打印结果
disp(['最优解: ', num2str(bestIndividual)]);
disp(['最优适应度: ', num2str(bestFitness)]);

% 计算适应度函数
function fitness = calculateFitness(population)
    % 计算每个个体的适应度值
    % 这里根据目标函数进行计算
    x1 = population(:,1);
    x2 = population(:,2);
    fitness = -(1 - x1).^2 - 100 * (x2 - x1.^2).^2;
end

% 选择操作(使用轮盘赌选择)
function selectedPopulation = selection(population, fitness)
    % 根据适应度值进行选择操作
    % 这里使用轮盘赌选择方法
    fitnessSum = sum(fitness);
    probabilities = fitness / fitnessSum;
    cumulativeProbabilities = cumsum(probabilities);
    
    selectedPopulation = zeros(size(population));
    for i = 1:size(population, 1)
        r = rand();
        selectedIdx = find(cumulativeProbabilities >= r, 1);
        selectedPopulation(i,:) = population(selectedIdx,:);
    end
end

% 交叉操作(使用单点交叉)
function offspringPopulation = crossover(selectedPopulation)
    % 根据选择的个体进行交叉操作
    % 这里使用单点交叉方法
    offspringPopulation = zeros(size(selectedPopulation));
    for i = 1:2:size(selectedPopulation, 1)
        parent1 = selectedPopulation(i,:);
        parent2 = selectedPopulation(i+1,:);
        
        crossoverPoint = randi([1 size(selectedPopulation, 2)]);
        
        offspring1 = [parent1(1:crossoverPoint) parent2(crossoverPoint+1:end)];
        offspring2 = [parent2(1:crossoverPoint) parent1(crossoverPoint+1:end)];
        
        offspringPopulation(i,:) = offspring1;
        offspringPopulation(i+1,:) = offspring2;
    end
end

% 变异操作(使用位变异)
function mutatedPopulation = mutation(offspringPopulation, mutationRate)
    % 对交叉后的个体进行变异操作
    % 这里使用位变异方法
    mutatedPopulation = offspringPopulation;
    for i = 1:size(mutatedPopulation, 1)
        for j = 1:size(mutatedPopulation, 2)
            if rand() < mutationRate
                mutatedPopulation(i,j) = rand() * 4 - 2;
            end
        end
    end
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/300963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据StarRocks(二) StarRocks集群部署

一、生产机器资源评估 1.梳理数据量&#xff0c;包括每天增量数据接入和全量数据接入 2.数据存储时间长度&#xff08;1个月/3个月/半年/1年/三年等&#xff09; 3.报表的SQL查询数量&#xff0c;SQL查询占用资源的统计&#xff0c;需要提前做好压测 4.压测可以采用官网提供的…

Django 10 表单

表单的使用流程 1. 定义 1. terminal 输入 django-admin startapp the_14回车 2. tutorial子文件夹 settings.py INSTALLED_APPS 中括号添加 "the_14", INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib…

关于burpsuite设置HTTP或者SOCKS代理

使用burpsuite给自己的浏览器做代理&#xff0c;抓包重发这些想必大家都清除 流量请求过程&#xff1a; 本机浏览器 -> burpsuite -> 目标服务器 实质还是本机发出的流量 如果我们想让流量由其他代理服务器发出 实现&#xff1a; 本机浏览器 -> burpsuite -> 某…

离散数学1

注&#xff1a;线性代数已经更新了最大部分的内容&#xff0c;因此过段时间再补充剩余内容。 小王能歌善舞。因此&#xff0c;小王必须得会唱歌也必须得会跳舞&#xff0c;才满足题意 小王能唱歌或者小王能跳舞。因此&#xff0c;小王会唱歌也会跳舞满足。小王不会唱歌但会跳舞…

【ros笔记】urdf文件

urdf文件属于xml文件&#xff0c;他的标签有&#xff1a; <robot name"robot_name"><!-- 看的见摸的着刚体用link --><link name"base_link"><!-- 可视化部分 --><visual><!-- 几何形状 --><geometry><!-- b…

CNN——ResNet

深度残差网络&#xff08;Deep residual network, ResNet&#xff09;的提出是CNN图像史上的一件里程碑事件&#xff0c;并且让深度学习真正可以继续做下去&#xff0c;斩获2016 CVPR Best Paper。此外ResNet的作者都是中国人&#xff0c;一作何恺明。ResNet被提出以后很多的网…

e2studio开发LPS28DFW气压计(1)----轮询获取气压计数据

e2studio开发LPS28DFW气压计.1--轮询获取气压计数据 概述视频教学样品申请完整代码下载产品特性通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user…

单调栈与单调队列

目录 单调栈 单调队列 单调栈 题目如下&#xff1a; 如何维护一个单调栈&#xff1f; 单调递增栈&#xff1a;在保持栈内元素单调递增的前提下&#xff08;如果栈顶元素大于要入栈的元素&#xff0c;将将其弹出&#xff09;&#xff0c;将新元素入栈。单调递减栈&#xff1…

Leetcode2487. 从链表中移除节点

Every day a Leetcode 题目来源&#xff1a;2487. 从链表中移除节点 解法1&#xff1a;单调栈 遍历链表&#xff0c;建立一个单调栈&#xff08;单调递减&#xff09;。 再用头插法将单调栈的元素建立一个新的链表&#xff0c;返回该链表的头结点。 代码&#xff1a; /*…

湖南大学-计算机网路-2023期末考试【部分原题回忆】

前言 计算机网络第一门考&#xff0c;而且没考好&#xff0c;回忆起来的原题不多。 这门学科学的最认真&#xff0c;复习的最久&#xff0c;考的最差。 教材使用这本书&#xff1a; 简答题&#xff08;6*530分&#xff09; MTU和MSS分别是什么&#xff0c;联系是什么&#x…

深入了解static关键字的作用和应用--java面向对象学习

Static修饰成员变量 Static是什么 叫静态&#xff0c;可以修饰成员变量&#xff0c;成员方法 成员变量按有无static修饰分俩种&#xff1a; 类变量&#xff1a;有static修饰&#xff0c;属于类&#xff0c;在计算机里只有一份&#xff0c;会被类的全部对…

VMware NAT 模式,网关无法ping通 网关解决办法

开启红框服务即可。。 参考&#xff1a;VMware NAT 模式&#xff0c;网关无法ping通 网关解决办法_vmware设置net,本机ping不通网关-CSDN博客

StarRocks 在小红书自助分析场景的应用与实践

作者&#xff1a;小红书 OLAP 研发负责人 王成 近两年 StarRocks 一直是小红书 OLAP 引擎体系里非常重要的部分&#xff0c;过去一年&#xff0c;小红书的 StarRocks 使用规模呈现出翻倍的增长速度&#xff0c;目前整体规模已经达到 30 个集群&#xff0c;CPU 规模已经达到了 3…

传感数据分析——高通滤波与低通滤波

传感数据分析——高通滤波与低通滤波 文章目录 传感数据分析——高通滤波与低通滤波前言一、运行环境二、Python实现总结 前言 对于传感信号而言&#xff0c;我们可以提取其中的高频信息和低频信息&#xff0c;低频信息往往是信号的趋势&#xff0c;高频信息往往是一些突变或异…

vue3+echarts应用——深度遍历html的dom结构并用树图进行可视化

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐html数据解析&#x1f496; html字符串转为html对象&#x1f496; 深度遍历html对象内容 ⭐echarts 树图的渲染&#x1f496; 处理html内容为树状结构&#x1f496; 渲染树状图&#x1f496; inscode代码块 ⭐总结⭐结束 ⭐前言 大…

(低级错误)IDEA/Goland报错连接数据库失败:URL错误和权限问题。

前言 做毕设ing&#xff0c;使用Goland自带的数据库工具连接服务器的数据库。报错 错误: Malformed database URL, failed to parse the main URL sections. (view)服务器是华为云&#xff0c;使用宝塔面板。数据库版本5.6.50。 排查过程 鉴于Goland报错报的狗屁不是&#…

hfish蜜罐docker部署

centos 安装 docker-CSDN博客Docker下载部署 Docker是我们推荐的部署方式之一&#xff0c;当前的版本拥有以下特性&#xff1a; 自动升级&#xff1a;每小时请求最新镜像进行升级&#xff0c;升级不会丢失数据。数据持久化&#xff1a;在宿主机/usr/share/hfish目录下建立dat…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-1 坐标系与概念基准

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

编码风格之(3)GUN软件标准风格(1)

GNU软件编码标准风格(1) Author&#xff1a;Onceday Date: 2023年12月26日 漫漫长路&#xff0c;才刚刚开始… 本文主要翻译自《GNU编码标准》(GNU Coding Standards)一文。 参考文档: Linux kernel coding style — The Linux Kernel documentationGNU Coding Standards …

prometheus 黑盒监控

黑盒监控 “白盒监控” 是需要把对应的Exporter程序安装到被监控的目标主机上&#xff0c;从而实现对主机各种资源以及状态的数据采集工作 ”黑盒监控“ 是不需要把Exporter程序部署到被监控的目标主机上&#xff0c;比如全球的网络质量的稳定性&#xff0c;通常用ping操作&am…