【算法】浅析遗传算法【附完整示例】

遗传算法:模拟自然选择,优化问题求解

1. 引言

在计算机科学和优化问题求解中,遗传算法是一种借鉴生物进化理论的启发式搜索算法。它模拟自然选择和遗传机制,通过迭代搜索最优解。本文将介绍遗传算法的原理、步骤及其在实际应用中的重要性,并通过代码示例和图示帮助大家更好地理解。

2. 遗传算法简介

2.1 定义

遗传算法(Genetic Algorithm,GA)是一种模拟自然选择和遗传机制的搜索算法,主要用于求解优化和搜索问题。

2.2 特点

(1)群体搜索:遗传算法同时处理一群候选解,而非单一解。
(2)遗传操作:通过交叉、变异等遗传操作产生新的解。
(3)适应度评价:根据适应度函数评估解的好坏。
(4)选择机制:根据适应度选择优良个体进入下一代。

3. 遗传算法原理

遗传算法的核心思想是模拟生物进化过程中的自然选择和遗传机制,通过迭代搜索最优解。

3.1 示例:求解函数最大值

以求解函数 f(x) = x * sin(10 * pi * x) + 1 在区间 [0, 2] 上的最大值为例,说明遗传算法的应用。

3.2 代码示例(Python)

import numpy as npdef fitness(x):return x * np.sin(10 * np.pi * x) + 1def genetic_algorithm(pop_size, mutation_rate, generations):# 初始化种群population = np.random.uniform(0, 2, pop_size)for _ in range(generations):# 计算适应度fitness_values = np.array([fitness(x) for x in population])# 选择selected_indices = np.argsort(fitness_values)[-pop_size//2:]selected_population = population[selected_indices]# 交叉crossed_population = np.array([np.random.uniform(selected_population[i], selected_population[j]) for i in range(pop_size//2) for j in range(i+1, pop_size//2)])# 变异mutated_population = np.array([x + np.random.uniform(-mutation_rate, mutation_rate) for x in crossed_population])population = np.concatenate((selected_population, mutated_population))# 返回最优解best_fitness = np.max([fitness(x) for x in population])best_individual = population[np.argmax([fitness(x) for x in population])]return best_individual, best_fitness# 调用遗传算法函数
best_individual, best_fitness = genetic_algorithm(pop_size=100, mutation_rate=0.01, generations=100)# 打印最优解和最大值
print("最优解:", best_individual)
print("最大值:", best_fitness)

输出结果:最优解:某值,最大值:某值。

4. 图示理解

以下通过流程图和种群进化图来帮助大家理解遗传算法。

4.1 流程图

以求解函数最大值为例,流程图如下:

流程图:开始|初始化种群|计算适应度|选择|交叉|变异|判断是否达到终止条件| 是结束|否|返回步骤3
4.1.1 流程图的描述
  1. 开始节点:表示算法的开始。
  2. 初始化种群:随机生成一组候选解。
  3. 计算适应度:评估每个候选解的适应度。
  4. 选择:根据适应度选择优良个体。
  5. 交叉:通过交叉操作产生新的解。
  6. 变异:通过变异操作增加种群多样性。
  7. 判断是否达到终止条件:若满足终止条件,则结束算法;否则,返回步骤3。

4.2 种群进化图

种群进化图:初始种群|选择|交叉|变异|新一代种群|...|最优解
4.2.1 种群进化图的描述
  1. 初始种群:随机生成的第一代种群。
  2. 选择:根据适应度选择优良个体。
  3. 交叉:通过交叉操作产生新的解。
  4. 变异:通过变异操作增加种群多样性。
  5. 新一代种群:经过遗传操作后产生的新一代种群。
  6. 最优解:经过若干代进化后,找到的最优解。

5. 遗传算法的使用

5.1 适用场景

遗传算法适用于以下类型的问题:
(1)问题难以直接求解,但可以评估解的好坏。
(2)问题解空间较大,搜索过程复杂。
(3)问题具有多个局部最优解,需要全局搜索。

5.2 常见应用

  • 函数优化:寻找函数的最大值或最小值。
  • 组合优化:如旅行商问题(TSP)、作业调度问题等。
  • 机器学习:特征选择、参数优化等。
  • 工程设计:结构优化、电路设计等。

5.3 代码示例:旅行商问题(TSP)

旅行商问题是一个经典的组合优化问题,遗传算法可以用来寻找最短的遍历所有城市的路径。

之前我们也用回溯算法进行过求解,感兴趣的小伙伴可以阅读以下文章 --> 浅析回溯算法

import numpy as np
# 假设有一个城市的坐标列表
cities = np.random.rand(20, 2)
def distance(path):# 计算路径的总距离total_distance = 0for i in range(len(path)):total_distance += np.linalg.norm(cities[path[i]] - cities[path[(i+1) % len(path)]])return total_distance
def genetic_algorithm_tsp(pop_size, mutation_rate, generations):# 初始化种群population = [np.random.permutation(len(cities)) for _ in range(pop_size)]for _ in range(generations):# 计算适应度fitness_values = np.array([1 / distance(path) for path in population])# 选择selected_indices = np.argsort(fitness_values)[-pop_size//2:]selected_population = [population[i] for i in selected_indices]# 交叉crossed_population = []for _ in range(pop_size//2):parent1, parent2 = np.random.choice(selected_population, 2, replace=False)start, end = sorted(np.random.choice(len(cities), 2, replace=False))child = np.concatenate((parent1[start:end], [x for x in parent2 if x not in parent1[start:end]]))crossed_population.append(child)# 变异mutated_population = []for path in crossed_population:if np.random.rand() < mutation_rate:i, j = np.random.choice(len(cities), 2, replace=False)path[i], path[j] = path[j], path[i]mutated_population.append(path)population = selected_population + mutated_population# 返回最优解best_fitness = np.max(fitness_values)best_individual = population[np.argmax(fitness_values)]return best_individual, 1 / best_fitness
best_individual, best_distance = genetic_algorithm_tsp(pop_size=100, mutation_rate=0.01, generations=100)
print("最优路径:", best_individual)
print("最短距离:", best_distance)

输出结果:最优路径:某路径,最短距离:某值。

6. 遗传算法的意义

  1. 全局搜索能力:遗传算法能够在整个解空间中搜索最优解,避免陷入局部最优。
  2. 适应性强:遗传算法适用于多种类型的优化问题,具有较强的通用性。
  3. 并行性:遗传算法的种群搜索特性使其易于并行化,提高计算效率。

7. 总结

遗传算法作为一种模拟自然进化过程的优化算法,在实际应用中具有广泛的意义。通过本文的介绍,相信大家对遗传算法的原理、使用和意义有了更深入的了解。在实际问题求解过程中,我们可以根据问题的特点,灵活运用遗传算法,提高问题求解的效率。

8. 扩展阅读

  • 动态规划:一种与遗传算法不同的算法,适用于子问题重叠的情况。
  • 贪心算法:一种在每一步选择中都采取当前最优解的算法,适用于具有贪心选择性质的问题。
  • 回溯算法:一种通过尝试各种可能的组合来找到问题解的算法,适用于求解组合问题。
  • 粒子群优化算法:另一种启发式优化算法,模拟鸟群觅食行为来寻找最优解。

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

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

相关文章

中国居民膳食指南书籍知识点汇总

人如果吃不好&#xff0c;就不能好好思考&#xff0c;好好爱&#xff0c;好好休息。——维吉尼亚伍儿夫 文章目录 书籍简介饮食准则推荐膳食图示 准则一&#xff1a;食物多样&#xff0c;合理搭配合理搭配的方法平衡膳食的科学原理均衡饮食的作用食物功效&#xff08;有科学实验…

LeeCode Practice Journal | Day25_Backtracking04

491. 非递减子序列 题目&#xff1a;491. 非递减子序列 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 (programmercarl.com) solution public class Solution {public List<IList<int>> results new List<IList<int>>();pu…

力扣224【基本计算器】

给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。 注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如 eval() 。 1 < s.length < 3 * 105 s 由数字、‘’、‘-’、‘(’、‘)’、和 ’ ’ 组成 s 表示一个有效的…

02、爬虫数据解析-Re解析

数据解析的目的是不拿到页面的全部内容&#xff0c;只拿到部分我们想要的内容内容。 Re解析就是正则解析&#xff0c;效率高准确性高。学习本节内容前需要学会基础的正则表达式。 一、正则匹配规则 1、常用元字符 . 匹配除换行符以外的字符 \w 匹配字母或数字或下划…

基于Python的房产数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录&#xff1a; 目录 详细视频演示 设计文档详细参考 技术开发的参考技术栈&#xff01; 2.1 Python语言 2.2 Django框架 2.3 MySQL 2.4 Hadoop介绍 2.5 Scrapy介绍 4.2 系统结构设计 4.3 数据库设计 界面设计与功能实现 5.1系统登录注册实现 5.2管理员模块…

【请求代理】springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能

springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能 一、前言二、解决思路三、基于gateway实现四、基于过滤器Filter实现五、问题总结 **注&#xff1a;本文源码获取或者更多资料&#xff0c;关注公众号&#xff1a;技术闲人**一、前言 在项目开发时会遇到w…

基于yolov8的口罩检测模型

项目介绍 本项目基于yolov8对图像进行训练&#xff0c;可以检测戴口罩的人与没有带口罩的人的图片和视频&#xff0c;除此之外&#xff0c;还提供了数据分析界面&#xff0c;支持检测过的信息转化为excel&#xff0c;信息可视化等功能 配置过程 软件开发环境:python3.9 系统…

前端开发:HTML与CSS

文章目录 前言1.1、CS架构和BS架构1.2、网页构成 HTML1.web开发1.1、最简单的web应用程序1.2、HTTP协议1.2.1 、简介1.2.2、 http协议特性1.3.3、http请求协议与响应协议 2.HTML概述3.HTML标准结构4.标签的语法5.基本标签6.超链接标签6.1、超链接基本使用6.2、锚点 7.img标签8.…

Apollo:实时通信架构CyberRT入门, my writer

1. 简介 1.1 从 ROS 系统说起 Apollo 最初用的中间件是 ROS(机器人操作系统),在 v3.0 之前用的都是基于 ROS 框架进行开发。概括来说,ROS 系统主要包含三方面: 第一是通信系统,ROS 是个分布式的松耦合系统,算法模块是以独立的进程形式存在的,也就是我们常说的 Node。R…

单击和一些案例

一、单击 1、单击概念 除了定位鼠标之外&#xff0c;processing鼠标还捕捉鼠标是否被单击。mousePressed在鼠标单击和不单击的情况下有不同的值。mousePressed变量是一种bool变量&#xff0c;也就是说它只有两个可能的值&#xff0c;真和假。当鼠标按下的时候mousePressed的值…

C# 插入排序

栏目总目录 概念 插入排序&#xff08;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常采用in-pl…

apache2和httpd web服务器

apache2和httpd web服务器 apache2和httpd web服务器是啥apache是软件基金会apache2是一个web服务httpd和apache2是同一个东西&#xff0c;但是不同linux发行版中叫法不一样。就是同一个东西&#xff0c;但是看上去有一些不一样。 apache2和httpd web服务器是啥 apache是软件基…

Scikit-learn内置的数据集

数据集是我们学习和研究机器学习不可或缺的基础&#xff0c;Scikit-learn库内置了丰富的数据集资源&#xff0c;非常适合初学者用来练习和验证机器学习算法的效果。 一、鸢尾花数据集 鸢尾花数据集&#xff08;Iris Dataset&#xff09;是机器学习领域中最著名的数据集之一&am…

在occluded Person Re-ID中,选择clip还是ViT作为backbone?

在遮挡行人再识别&#xff08;Occluded Person Re-Identification, Occluded Person Re-ID&#xff09;任务中&#xff0c;使用CLIP&#xff08;Contrastive Language-Image Pre-Training&#xff09;作为backbone和使用Vision Transformer&#xff08;ViT&#xff09;作为back…

【每日一篇】使用图神经网络进行交通速度预测的上下文感知知识图谱框架【为了自己方便读论文】

Context-aware knowledge graph framework for traffic speed forecasting using graph neural network 论文链接&#xff1a; https://arxiv.org/abs/2407.17703 翻译&#xff1a; 摘要 人类流动在空间和时间上受到城市环境的密切影响&#xff0c;构成了理解交通系统的重…

C语言 合并两个链表并按学号升序排列

已有a,b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。 #include <stdio.h> #include <stdlib.h>typedef struct Node {long num;float score;struct Node* next; } Node;Node* creat() {Node *head = NULL, *p1, *p2;p1 = p2 = …

MarkTool之UDP

UDP客户端&#xff0c;主要作用是与UDP服务端连接进行数据通讯 1、连接参数有4个&#xff0c;绑定IP和Port&#xff0c;服务端IP和Port 2、接收数据和发送数据的参数设置&#xff0c;有16进制&#xff0c;有字符&#xff0c;有原始数据&#xff0c;都可进行选择 3、定时发送&a…

理解常见开源协议的区别

本文将介绍几种常见的开源许可证&#xff0c;包括GPL、LGPL、MIT、Apache、BSD 和 木兰协议&#xff08;Mulan PSL&#xff09;&#xff0c;并详细解释它们的区别。 1. GPL (GNU General Public License) GPL 是最著名和最常用的开源许可证之一&#xff0c;由自由软件基金会 …

module federation模块联邦与微前端

module federation是什么 webpack5新增了module federation&#xff0c;module federation的作用&#xff0c;将每个构建(build)作为容器(这是一个概念)&#xff0c;构建后的资源可以正常部署&#xff0c;同时还具备在运行时对外暴露其中的模块&#xff0c;这就意味着多个构建…

泰安网站建设有几大特点

泰安网站建设的特点可以分为以下几个方面&#xff1a; 一、突出地域特色。泰安是山东省的一个地级市&#xff0c;具有悠久的历史和深厚的文化底蕴。在网站建设过程中&#xff0c;泰安的特色文化和旅游资源应得到充分的展示。可以通过优美的图片、详细的介绍和生动的文字&#x…