Python:遗传算法最优路径

news/2024/5/8 0:01:44/文章来源:https://blog.csdn.net/FightingBob/article/details/128356011

Hello,大家好!读研前写过一篇遗传算法的代码,比较简单,算是个入门,当时就有想用它来解决最优路径的问题,上算法导论课时碰巧有听到同学有分享过,但由于自己研究的方向不是这块,就没有再弄,结果今年的华为杯数学建模竞赛F题居然有所涉及,真是用时方恨晚,最近即将毕业,也稍微空闲些了,就再用遗传算法慢慢捡回我的公众号。今天分享的是如何用遗传算法进行最优路径求解问题!

用python实现遗传算法这是两年前写的遗传算法,做了一个简单的介绍,感兴趣的小伙伴可以翻看。

目录

  • 问题
  • 思路与Python实现
    • 编码
    • 个体评价
    • 选择
    • 交叉
    • 变异
    • 整合
    • 效果演示
  • 获得代码

问题

现在有nnn个地址的坐标,以第一个为起点,途径所有地址,再回到起点,所有地方仅去一次,规划最短路径。

思路与Python实现

编码

首先先解决编码问题,与上篇文章不同,这次解决的是路径规划问题,有的是一个一个的坐标点,因此我们采用“符号编码”代表这些坐标点,染色体上的编码顺序代表路径顺序。

我们随机生成十组坐标,用作本文的示范:

a = list(range(-5,5))
b = list(range(-4,6))
random.shuffle(a)
random.shuffle(b)
local = list(zip(a,b))
序号横坐标纵坐标
0-5-2
1-34
245
3-4-3
4-11
50-1
613
72-4
8-20
932

这些序号就可以用作我们符号编码,例如[0,1,2,3,4,5,6,7,8,9]

个体评价

个体评价也就是我们的目标函数,用来区分群体中个体好坏的标准。我们路径规划问题是寻找最短行驶路径,这里用两点之间距离公式进行度量,然后按照染色体上的编码顺序依次累加两点之间的距离:

def dis(start, end):# 两点之间距离return np.sqrt((end[0]-start[0])**2+(end[1]-start[1])**2)def fuc(x):dis_sum = dis((0,0),local[x[0]])for i in range(1,len(x)):dis_sum += dis(local[x[i-1]],local[x[i]])dis_sum += dis(local[x[-1]],(0,0))return dis_sumdef get_fitness(pops):return list(map(fuc,pops))

注:本文是以原点作为线路的起点和终点,形成闭环,不同情况要不同设计

选择

选择算子的作用是对个体进行优胜劣汰:从父代群体中选取一些适应度高个体遗传到下一代群体中,这次采用锦标赛选择策略

锦标赛选择策略:从种群中随机采样sss个个体(有放回抽样)进行PK,其中适应度值最优的个体胜出,成为下一代的父代基因,进行kkk轮,得到kkk个优质父代。

这样最差的个体永远不会存活,并且计算简单,不容易陷入局部最优,可以达到更好的求解效果。

def select(pops):k = round(np.sqrt(len(pops)+0.25)+0.5)fitness = get_fitness(pops)father_pops = []for i in range(k):min_index = np.array(fitness).argmin()father_pops.append(pops.pop(min_index))fitness.pop(min_index)return father_pops

交叉

接下来就到了整个算法的重头,不同于上一篇文章,单纯地使用两点交叉即可,路径规划中,所有的地点要秉持“不遗漏,不重复”的原则,如果单纯地交叉,会导致地点重复或遗漏。因此就在两点交叉的过程中加一个映射过程,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTQ4O7x8-1671273828116)(.\figures\两点交叉策略示例.png)]

def yinshe(dic, x): # 映射while x in dic.keys():x = dic[x]return xdef jiaocha(Lis1, Lis2): # 两点交叉lis1 = Lis1.copy()lis2 = Lis2.copy()n = len(lis1)cross_points_1 = np.random.randint(low=0, high=n-1)cross_points_2 = np.random.randint(low=cross_points_1+1, high=n)yinshe2 = dict(zip(lis1[cross_points_1: cross_points_2],lis2[cross_points_1: cross_points_2]))yinshe1 = dict(zip(lis2[cross_points_1: cross_points_2],lis1[cross_points_1: cross_points_2]))lis1[cross_points_1: cross_points_2], lis2[cross_points_1: cross_points_2] = lis2[cross_points_1: cross_points_2], lis1[cross_points_1: cross_points_2]lis1[:cross_points_1] = list(map(lambda x: yinshe(yinshe1, x), lis1[:cross_points_1]))lis1[cross_points_2:] = list(map(lambda x: yinshe(yinshe1, x), lis1[cross_points_2:]))lis2[:cross_points_1] = list(map(lambda x: yinshe(yinshe2, x), lis2[:cross_points_1]))lis2[cross_points_2:] = list(map(lambda x: yinshe(yinshe2, x), lis2[cross_points_2:]))return lis1, lis2

细心的小伙伴肯定就发现了,为什么映射过程的代码里有一个while循环,这个地方是我在实验的过程中发现的一个细节,如果单靠一次映射,并不能保证所重复的点都映射完,就像上图中的例子,明明999对应的是444,但是444本身也在交叉的基因之中,并没能把9映射到外面,故需要三次映射,即9→4→3→69 \rightarrow 4 \rightarrow 3 \rightarrow 69436,因此才把外面的999替换为了666

变异

是对群体中的个体的某些基因座上的基因值作变动,模拟生物在繁殖过程,新产生的染色体中的基因会以一定的概率发生突变。这样的设计可以很好地避免局部最优的情况。

def mutation(pop, MUTATION_RATE=0.003):if np.random.rand() < MUTATION_RATE:n = len(pop)cross_points_1 = np.random.randint(low=0, high=n-1)cross_points_2 = np.random.randint(low=cross_points_1+1, high=n)pop[cross_points_1], pop[cross_points_2] = pop[cross_points_2], pop[cross_points_1]return pop

整合

有了“个体评价”、“选择”、“交叉”、“变异”这些模块,就可以实现一代代的遗传进化:

def evolution(pops):father_pops = select(pops)k = len(father_pops)new_pops = []for i in range(k-1):for j in range(i+1,k):son1, son2 = jiaocha(father_pops[i], father_pops[j])son1 = mutation(son1, MUTATION_RATE=0.3)son2 = mutation(son2, MUTATION_RATE=0.3)new_pops.append(son1)new_pops.append(son2)return new_pops

效果演示

最后只需要把前面的内容整合在一起即可,因为问题比较简单,所以遗传的代数设置50就足够了。

local = [(-5, -2), (-3, 4), (4, 5), (-4, -3), (-1, 1), (0, -1), (1, 3), (2, -4), (-2, 0), (3, 2)]
pops = initpop(N, list(range(10)))
for _ in range(50):pops = evolution(pops)
print(min(get_fitness(pops)))

然后我们把整个遗传过程可视化出来,效果如所想的一样,最短的路径就是围着转一圈,整个过程感觉还是非常神奇的,如果有想要这个可视化代码的小伙伴,可在文末获得,文章中就不再赘述了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8ikJ09L-1671273828118)(.\figures\演示.gif)]

获得代码

以下是我的个人公众号,本文完整代码已上传,关注公众号回复“遗传算法最优路径”,即可获得,谢谢大家支持。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sX4ltMkB-1671273828118)(F:\公众号\0.jpg)]

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

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

相关文章

C# 绘图基本方法

一得到Graphics对象 1 OnPaint事件中使用 Protected overrid void OnPaint(PaintEventArgs e) {Graphics ge.Graphics;...... }2 其他情况实现 Graphics gthis.CreaateGraphics();二 关于Graphics的释放 1 对于CreateGraphics&#xff08;&#xff09;得到的Graphics对象&a…

【Linux权限】文件权限值,权限掩码,粘滞位,普通用户添加信任名单

目录 1.权限分为2种用户&#xff1a;超级用户&#xff0c;普通用户 2.文件类型和访问权限 ​3.权限掩码&#xff08;八进制&#xff09; 4.sudo短暂提升权限 5.粘滞位 1.权限分为2种用户&#xff1a;超级用户&#xff0c;普通用户 超级用户&#xff08;通常为root&#x…

ArcGIS Pro 加载项(5)——样式符号属性对调

之前是已经通过Python构建脚本工具&#xff0c;实现了stylx文件的符号属性的对调。 ArcGIS Pro脚本工具&#xff08;12&#xff09;——样式符号属性对调_学学GIS的博客-CSDN博客为地类做样式符号匹配经常碰到这样的问题&#xff1a;属性表里面只有地类代码&#xff0c;但是做…

安全分析模型

安全分析模型自动化调优 MLOps&#xff08;Machine Learning Operations&#xff09;是一种人工智能 的工程实践&#xff0c;是面向机器学习项目的研发运营管理体系 。旨在实现 ML 管道的操作、ML 模型的部署和管理标准化&#xff0c;支持ML 模型的发布、激活、监控、性能跟踪…

MacOS配置GitHub SSH-key

mac和linux配置方法基本类似 打开终端连接到账户 git config --global user.name "xxxx" git config --global user.email "xxxxqq.com" 创建ssh-key ssh-keygen -t rsa -C "xxxxqq.com" 一路enter选择默认项&#xff0c;创建完成 查…

【云服务器 ECS 实战】一文掌握负载均衡服务原理及配置方法

一、负载均衡基本原理概述协议/端口轮询策略会话保持二、云服务器 ECS 负载均衡相关配置协议&监听配置后端服务器配置健康检查配置测试在上期文章中&#xff0c;介绍了负载均衡的概述及优势&#xff0c;并详细演示了阿里云服务器负载均衡服务的选型与购买配置。本期文章我们…

【YOLOv7-环境搭建③】PyCharm安装和环境、解释器配置

下载链接&#xff1a; 来源&#xff1a;&#xff08;博主&#xff09;唐三. 链接:https://pan.baidu.com/s/1y6s_EScOqvraFcx7iPSy1g 提取码:m1oa 安装&#xff1a; 以管理员身份打开安装完成后&#xff0c;打开软件到达以下界面&#xff0c;框框全选到达以下界面&#xf…

一起Talk Android吧(第四百四十五回:UI控件之TimePicker)

文章目录概念介绍使用方法内容总结各位看官们大家好&#xff0c;上一回中咱们说的例子是"UI控件之DatePicker",这一回中说的例子是"UI控件之TimePicker"。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; 概念介绍 看官们…

【Spring]SpringMVC

一、SpringMVC简介 1、什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层。指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 实体类Bean&#xff1a;专门存储业务数据…

ClassLoader 隔离性的基石是namespace,证明给你看

一、背景 朋友&#xff1a;在我知识体系中ClassLoader的双亲委派机制是流畅丝滑的&#xff0c;可是看到通过委派执行类加载来保障这种分治能力&#xff0c;进而达到了类资源的隔离性突然就感觉有点陌生和排斥呢&#xff1f; 我&#xff1a;类的命名空间有了解嘛&#xff1f; …

优秀的后端应该有哪些开发习惯?

见识过各种各样的代码,优秀的、垃圾的、不堪入目的、看了想跑路的等等,所以这篇文章记录一下一个优秀的后端 Java 开发应该有哪些好的开发习惯。 拆分合理的目录结构 受传统的 MVC 模式影响,传统做法大多是几个固定的文件夹 controller、service、mapper、entity,然后无限…

超越nnFormer!UNETR++:高效准确的3D医学图像分割

UNETR: Delving into Efficient and Accurate 3D Medical Image Segmentation 论文链接&#xff1a; https://arxiv.org/abs/2212.04497 代码链接&#xff1a; https://github.com/Amshaker/unetr_plus_plus 导读 这篇论文主要讲述了一种名为 UNETR 的 3D 医学图像分割方法&…

Spring MVC【创建与使用】

Spring MVC【创建与使用】&#x1f34e;一.Spring MVC介绍&#x1f352;1.1 什么是SpringMVC?&#x1f352;1.2 MVC 定义&#x1f352;1.3 Spring MVC 与 MVC 的区别&#x1f352;1.4 Spring MVC的基本功能&#x1f34e;二. Spring MVC项目的创建&#x1f352;2.1 Spring MVC …

[附源码]计算机毕业设计PythonQ宝商城(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

WebService基于Baidu OCR和Map API的导航服务

哈尔滨工业大学国家示范性软件学院 《面向服务的软件系统》大作业 项目题目&#xff1a; 基于OCR和地图API的路牌定位与导航服务 项目组成员&#xff1a; 姓名 学号 李启明 120L021920 完成日期&#xff1a; 2022年 12 月 15 日 1.选题 1.1 作业…

Spring Boot热部署配置

⭐️前言⭐️ 在我们进行Spring Boot项目的编写过程中&#xff0c;会有局部的代码&#xff0c;发生一些变动&#xff0c;这时候&#xff0c;我们只有将项目重启&#xff0c;发生变动的代码才能够生效&#xff0c;为了解决这个问题&#xff0c;我们可以设置Spring Boot热部署&a…

【财务】FMS财务管理系统---应收管理

笔者前面介绍了FMS财务管理系统相关逻辑结构&#xff0c;本篇文章继续对应收管理进行了系统的介绍&#xff0c;希望通过此文能够加深你对FMS财务管理系统的认识。 上一篇主要介绍了财务进销存系统的数据流与模块组成&#xff0c;知道了FMS系统中数据的来源并从系统结构上说明了…

Wireshark 实验

本部分按照数据链路层、网络层、传输层以及应用层进行分类&#xff0c;共有 10 个实验。需要使用协议分析软件 Wireshark 进行&#xff0c;请根据简介部分自行下载安装。 准备 请自行查找或使用如下参考资料&#xff0c;了解 Wireshark 的基本使用&#xff1a; 选择对哪块网…

Linux——linux面试题

cat a.txt | cut -d "/" -f 3 | sort | uniq -c |sort -nrgrep ESTABLISHED | awk -F " " {print $5} |cut -d ":" -f 1 | sort |uniq -c | sort -nr找回mysql的root用户的密码 首先&#xff0c;进入到/etc/my.cnf&#xff0c;插入一句skip-gra…

Linux——虚拟机安装Linux系统

实验1-2 虚拟机安装Linux系统 VMware 9.0 虚拟机Linux镜像ISO文件相关工具可以在这里边找到 http://pan.baidu.com/s/1ntA18FJ 或者请自行下载使用 创建新的虚拟机&#xff0c;如下图&#xff1a; 下一步&#xff1a;选择安装配置类型为“典型”如下图&#xff1a; 下一步&…