遗传算法总结(迭代版本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() < mutationRatemutatedPopulation(i,j) = rand() * 20 - 10;endendend
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() < mutationRatemutatedPopulation(i,j) = rand() * 4 - 2;endendend
end

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 基础入门(资源字典)

资源字典 每个Resources属性存储着一个资源字典集合。如果希望在多个项目之间共享资源的话&#xff0c;就可以创建一个资源字典。资源字段是一个简单的XAML文档&#xff0c;该文档就是用于存储资源的&#xff0c;可以通过右键项目->添加资源字典的方式来添加一个资源字典文件…

计算机组成原理之计算机硬件发展和计算机系统的组成

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Linux chmod命令详解

Linux chmod&#xff08;英文全拼&#xff1a;change mode&#xff09;命令是控制用户对文件的权限的命令 Linux/Unix 的文件调用权限分为三级 : 文件所有者&#xff08;Owner&#xff09;、用户组&#xff08;Group&#xff09;、其它用户&#xff08;Other Users&#xff09…

高效底座模型LLaMA

论文标题&#xff1a;LLaMA: Open and Efficient Foundation Language Models 论文链接&#xff1a;https://arxiv.org/pdf/2302.13971.pdf 论文来源&#xff1a;Meta AI 1 概述 大型语言模型&#xff08;Large Languages Models&#xff0c;LLMs&#xff09;通过大规模文本数…

CMake入门教程【高级篇】qmake转cmake

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1. 概述2.qmake与cmake的差异3. qmake示例4.qmake转cmake示例5.MOC、UIC和RCC…

关于“Python”的核心知识点整理大全63

目录 20.2.11 使用 Git 跟踪项目文件 1. 安装Git 2. 配置Git 3. 忽略文件 .gitignore 注意 4. 提交项目 20.2.12 推送到 Heroku 注意 20.2.13 在 Heroku 上建立数据库 20.2.14 改进 Heroku 部署 1. 在Heroku上创建超级用户 注意 注意 20.2.11 使用 Git 跟踪项目文件…

Ubuntu22.04,Nvidia4070配置llama2

大部分内容参考了这篇非常详细的博客&#xff0c;是我最近看到的为数不多的保姆级别的教学博客&#xff0c;建议大家去给博主点个赞【Ubuntu 20.04安装和深度学习环境搭建 4090显卡】_ubuntu20.04安装40系显卡驱动-CSDN博客 本篇主要是基于这篇博客结合自己配置的过程中一些注…

计算机二级WPS Office考试须知、如何备考、备考建议

本文从计算机二级考试须知、如何备考、备考建议以及考试的注意事项等方面进行讲述&#xff0c;认认真真看&#xff0c;对你受益匪浅。 一、计算机二级考试须知 2021年3月27日至29日将举办第60次全国计算机等级考试&#xff08;NCRE&#xff09;&#xff0c;从今年起&#xff0…

C# 使用Fleck创建WebSocket服务器

目录 写在前面 代码实现 服务端代码 客户端代码 调用示例 写在前面 Fleck 是 C# 实现的 WebSocket 服务器&#xff0c;通过 WebSocket API&#xff0c;浏览器和服务器只需要做一个握手的动作&#xff0c;然后浏览器和服务器之间就形成了一条快速通道&#xff1b;两者之间…

十大开放式耳机品牌哪个好?开放式耳机详细评测攻略分享,精华篇

相信很多朋友在选购开放式耳机的时候&#xff0c;发现市场上的开放式耳机品牌琳琅满目&#xff0c;完全不清楚哪家的产品更胜一筹&#xff0c;有些人甚至跟风购入&#xff0c;因此很容易买到不合适自己的而踩雷。 其实这种耳机我很早之前就有在使用&#xff0c;我对于耳机数码类…

【人工智能Ⅰ】实验11:支持向量机

实验11 支持向量机 一、实验目的 1&#xff1a;了解支持向量机的结构和原理。 2&#xff1a;应用支持向量机建立训练模型&#xff0c;对模型进行评估。 二、实验内容和要求 【实验内容】 选择支持向量机&#xff0c;对花卉图像或玉米果穗图像进行分类。花卉图像包括玫瑰&a…

详解ajax、fetch、axios的区别

众所周知它们都用来发送请求&#xff0c;其实它们区别还蛮大的。这也是面试中的高频题&#xff0c;本文将详细进行讲解。 1. ajax 英译过来是Aysnchronous JavaScript And XML&#xff0c;直译是异步JS和XML&#xff08;XML类似HTML&#xff0c;但是设计宗旨就为了传输数据&a…

Android14之解决Pixel手机联网出现感叹号(一百八十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

景联文科技:以高质量数据赋能文生图大模型

1月5日&#xff0c;在智求共赢・中国AIGC产业应用峰会暨无界AI生态合作伙伴大会上&#xff0c;中国AIGC产业联盟联合无界AI发布了《中国AIGC文生图产业白皮书2023》&#xff0c;从AIGC文生图发展历程、主流工具、产业实践以及规模预测等多个维度&#xff0c;全面揭示了中国AIGC…

Vue中的class和style绑定

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介动态绑定class对象语法数组语法 动态绑定style对象语法多重值 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&#xff01;创建这个专栏的初衷是为了帮助大家更好地应对 Vue.js 技能树的学习…

TS 36.331 V12.0.0-过程(2)-连接控制(3)-RRC连接释放

​本文的内容主要涉及TS 36.331&#xff0c;版本是C00&#xff0c;也就是V12.0.0。

Spring MVC 的RequestMapping注解

RequestMapping注解 使用说明 作用&#xff1a;用于建立请求URL和处理请求方法之间的对应关系。 出现位置&#xff1a; 类上&#xff1a; 请求 URL的第一级访问目录。此处不写的话&#xff0c;就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以…

Web实战丨基于django+html+css+js的学院门户网站

文章目录 写在前面项目概述基本信息项目需求 项目框架程序设计运行结果项目总结 写在后面 写在前面 本期内容&#xff1a;基于DjangoHtmlCssJavaScript的学院门户网站 项目需求&#xff1a; pythondjango 项目下载地址&#xff1a;https://download.csdn.net/download/m0_6…

JAVA课程设计--类京东购物车设计

目录 小组成员 负责模块&#xff1a; 程序介绍&#xff1a; 1.前期调查&#xff1a; 1.1京东购物车页面 首页 购物车界面 商品信息界面 搜索界面 1.2程序设计页面 首页 购物车页面 商品信息界面 搜索界面&#xff1a; 2.使用环境&#xff1a; 3.技术支持 前端V…

Provide/Inject 依赖注入(未完待续)

父组件传递给子组件数据&#xff0c;通过props&#xff0c;但是需要逐层传递 provide/Inject 的推出就是为了解决这个问题&#xff0c;它提供了一种组件之间共享此类值的方式,不必通过组件树每层级显示地传递props 目的是为了共享那些被 认为对于一个组件树而言是全局的数据 p…