本篇文章是博主在学习时,用于个人学习、研究或者欣赏使用,如果对您有所帮助,麻烦点一个小小的赞、收藏、评论,十分感谢您能看到这篇文章。文章分类在经验分享: 经验分享---《毕业设计》基于遗传算法的旅游路程和资金需求最优规划方案
随着社会经济的蓬勃发展,民众对于旅游的热爱与追求持续升温,展现出不断增长的热情与渴望。本文提出了一种基于遗传算法的旅游路程和资金需求最优规划方案。该方法旨在解决旅游者在规划行程时面临的关键问题,即如何在满足旅游需求的同时,实现旅行路程最短和资金需求最低。通过引入遗传算法,本文能够将这一复杂问题转化为一个优化问题,并在给定的约束条件下寻找最优解。本文首先构建了旅游路程和资金需求的数学模型,该模型综合考虑了旅游者的出行距离、住宿费用、餐饮费用等多个因素。然后,利用遗传算法通过不断迭代和进化,能够找到满足旅游者需求的最优行程规划方案。
实验结果表明,基于遗传算法的旅游路程和资金需求最优规划方案能够有效提高旅游行程的效率和经济效益。与传统的规划方法相比,该方法在寻找最优解方面具有更高的准确性和效率。因此,本文的研究对于旅游规划领域具有重要的理论意义和实践价值。
关键词: 旅游规划;资金需求;遗传算法;最优规划
随着全球化和人们生活水平的提高,旅游业已成为全球经济的重要组成部分[1]。旅游不仅为人们提供了休闲和娱乐的机会,还促进了文化交流、经济发展和社会进步[2]。然而,旅游规划是一个复杂且多维度的决策问题,涉及到时间、费用、兴趣点、交通等多个因素。因此,如何为旅游者提供既经济又高效的旅游规划方案,成为了旅游研究领域的重要课题[3]。
传统的旅游规划方法通常依赖于人工经验和简单的数学优化技术,这些方法在处理大规模、多约束的旅游规划问题时,往往表现出效率低下和求解质量不高的问题[4]。随着人工智能和智能优化算法的快速发展,越来越多的学者开始探索将这些先进算法应用于旅游规划领域。
遗传算法作为一种模拟自然选择和遗传学原理的优化算法,具有全局搜索能力强、鲁棒性高等优点,已经被广泛应用于各种优化问题中。通过模拟自然界的进化过程,遗传算法可以在复杂、多约束的旅游规划问题中,寻找到满足旅游者需求的最优解[5]。
在此背景下,本文研究基于遗传算法的旅游路程和资金需求最优规划方案,具有重要的理论和实践意义[6]。理论上,本研究将遗传算法应用于旅游规划领域,有助于拓展智能优化算法的应用范围,丰富旅游规划的理论体系。实践上,本研究可以为旅游者提供更加个性化、高效的旅游规划服务,提升旅游体验,同时也有助于旅游企业和政府部门优化资源配置,提高旅游业的整体效益。因此,本研究对于推动旅游业的发展和创新,具有重要的现实意义和应用价值。
国外在基于遗传算法的旅游规划研究方面起步较早,且研究成果较为丰富[7]。国外的学者早在上世纪末就开始探索将遗传算法应用于旅游规划领域,并取得了一系列重要的研究成果[8]。这些研究不仅涉及旅游路线的优化、旅游资源的配置,还涉及到旅游市场的分析、旅游决策支持系统等多个方面[9]。例如,利用遗传算法对旅游市场进行细分,为旅游企业提供更加精准的营销策略[10];通过遗传算法构建旅游决策支持系统,为旅游者和旅游企业提供更加智能的决策支持[11]。此外,国外的学者还尝试将遗传算法与其他优化算法、机器学习等技术相结合,以提高旅游规划的智能化水平[12]。
在国内,基于遗传算法的旅游规划研究起步较晚,但近年来发展势头迅猛。随着国内旅游业的蓬勃发展和人工智能技术的广泛应用,越来越多的学者开始关注和研究如何将遗传算法等智能优化技术应用于旅游规划领域[13]。目前,国内的研究主要集中在旅游路线的优化、旅游资源的合理配置、旅游需求的预测等方面[14]。例如刘歌利用智能算法对旅游路线进行优化,以最短的时间和最低的成本实现旅游目的[15] 陈雨璇和代晓利则通过智能算法对旅游资源进行合理配置,以提高旅游业的整体效益[16]。此外,还有一些学者尝试将遗传算法与其他算法相结合,以提高旅游规划的准确性和效率。
综上所述,无论是国内还是国外,基于遗传算法的旅游规划研究都取得了显著的进展和成果。然而,由于旅游规划问题的复杂性和多样性,仍然存在许多挑战和问题亟待解决。因此,未来的研究需要继续深入探索和应用智能优化算法,不断提高旅游规划的准确性和效率,为旅游业的发展和创新做出更大的贡献。
本文主要研究了基于遗传算法的旅游路程和资金需求最优规划问题。通过对旅游规划中的关键因素进行数学建模,本文构建了一个优化模型,旨在找到在能够最大化旅游体验质量的行程规划方案。
本文正文部分总共有四章,第一章对基于遗传算法的旅游路程和资金需求最优规划问题介绍,第二章进行了基于遗传算法的旅游路程和资金需求最优规划方案的设计,第三章详细旅游路程和资金需求最优规划方案的实现,第四章对旅游路程和资金需求最优规划方案的代码运行结果进行测试,并分析测试结果,以达到旅游路程和资金需求最优规划的目的。
首先,明确了旅游路程和资金需求最优规划问题的目标,建立了一个数学模型,将旅游规划问题转化为一个目标优化问题。这样,可以在一个统一的框架下对旅游规划进行研究和求解。
接着,本文设计了一个评价函数来评估每个行程方案的优劣,即路程最短,花费最少准则。综合考虑了旅行距离花费、城市旅行费用等多个因素,确保本文能够全面评估每个方案的优劣。通过对评价函数的计算和比较,本文可以筛选出接近最优的行程方案。
为了实现这一目标,本文采用了遗传算法作为求解方法。遗传算法是一种模拟生物进化过程的优化算法,具有全局搜索和自适应调整的能力。在本文中,本文设计了适当的编码策略来表示旅游行程,并实现了选择、交叉和变异等遗传操作。这些操作共同构成了遗传算法的核心,使算法能够在迭代过程中逐步逼近最优解。
在实验验证阶段,本文设计了实验来评估本文方法的有效性和优越性。通过与其他算法的旅游规划方法进行对比分析,本文发现基于遗传算法的旅游路程和资金需求最优规划方案在多个方面都表现出了显著的优势。具体来说,该方法能够在合理的时间内找到接近最优的旅行方案,为旅游者提供更加高效、经济的旅游规划服务。
综上所述,本文的主要研究内容是基于遗传算法的旅游路程和资金需求最优规划问题。通过数学建模和遗传算法的实现,本文成功地找到了一种有效的求解方法,并通过实验验证了其有效性和优越性。这一研究成果为旅游规划领域提供了一种新的方案,有助于提升旅游者的旅游体验感和旅游业的整体效益。
遗传算法(Genetic Algorithm,简称GA)是一种计算模型,其灵感来源于达尔文的生物进化理论,特别是遗传选择和自然淘汰机制。其核心理念融合了生物遗传学和适者生存的自然法则,通过模拟这一过程,构建了一种具有“生存+检测”迭代搜索机制的算法。这种算法以群体中的所有个体为操作对象,借助随机化技术指导,实现对编码参数空间的高效搜索。
基本架构是以自然选择规律与遗传理论为依托,对自然界中生物的进化方式和遗传进行模拟求解问题的一类自组织与自适应的人工智能技术。它的中心思想就是“优胜劣汰,适者生存”。 在初始的种群中,本文根据所设定的适应度函数来评估个体,并运用遗传学的复制、交叉和变异操作对个体进行筛选。这一过程中,适应度高的个体将得以保留,并组成新一代的种群。新一代种群不仅继承了前一代的信息,而且在适应度上有所优化。这一过程持续进行,不断推动种群中个体的适应度提升,直至满足特定的条件为止。
基本要素包括参数编码、适应度函数的设计、初始群体的设定、适应度函数的设计、控制参数设定、遗传操作设计、控制参数设定。其中,选择、交叉和变异构成了遗传算法的遗传操作。参数编码是将问题的解表示为一个变量序列,即染色体。基于染色体的操作有三种:复制、交叉和变异。复制模拟无性繁殖,选择适应度高的个体进入下一代;交叉操作模拟了生物进化过程中的有性生殖机制,通过染色体间的交换和组合,创造出新的、可能更为优秀的个体。而变异操作则模仿了生物在自然环境中因各种随机因素导致的基因突变现象,以极低的概率对遗传基因进行随机的改变。
遗传算法因其简单通用、强大的鲁棒性、适合并行处理以及高效实用的特点,在众多领域得到了广泛应用,并取得了显著成效,逐渐成为了重要的智能算法之一。具体来说,遗传算法在复杂函数系统优化、机器学习、系统识别、故障诊断、分类系统、控制器设计、神经网络设计以及自适应滤波器设计等领域都有广泛应用。
1)在数据处理和距离矩阵计算之后,本文中定义了一些算法中需要用到的参数,如种群数、迭代次数、最优选择概率、弱者生存概率、变异率等。
2)定义一个计算个体适应度(路径长度)的函数。该函数遍历个体中的每个城市,计算城市之间的距离,并累加得到总路径长度。
3)定义一个改良函数,用于对初始种群中的个体进行改良。该函数随机选择两个城市,并交换它们的位置,如果改良后的个体路径长度更短,则更新个体。
4)定义自然选择函数。该函数根据个体的适应度对种群进行排序,并选择适应度较高的个体作为强者,按照最优选择概率将一部分适应度较低的个体作为弱者生存下来。
5)定义交叉繁殖函数。该函数从父代中随机选择两个个体,并随机选择一个交叉点,将交叉点之间的基因片段进行交换,生成两个子代个体。
6)然后,本文中定义了变异操作函数。该函数遍历子代个体,根据变异率随机选择两个基因位置,并交换它们的值,引入随机性,增加种群的多样性。
7)在遗传算法的主要操作完成后,初始化种群,并开始进行迭代优化。在每一代中,先进行自然选择操作,选择适应度较高的个体作为父代。然后通过交叉繁殖操作生成子代个体。接下来,对子代个体进行变异操作。最后,更新种群,将父代和子代个体合并为新的种群。
8)在每一代结束后,计算种群中最优个体的适应度和路径长度,并将路径长度添加到distance_list列表中。
9)通过迭代多次,并持续更新种群,逐渐找到适应度最高的个体,即解决TSP问题的最优路径。
10)最后,将最优路径的顺序和对应的距离打印出来,并绘制优化过程的图表,展示路径的变化和优化的进程。
通过这样的迭代过程,遗传算法能够逐步优化种群,找到适应度最高的个体,即最优路径。本文可采用遗传算法实现对于旅游城市之间的路径规划,从而计算出城市旅游的最短路径。算法实现流程图如下所示:
图2-1 算法实现流程图
根据经纬度计算两地之间的距离时,本文将地球近似看成一个标准的球体,以此来通过计算球面上俩点距离的方法来计算俩地之间的距离。需要的相关参数信息来自于百度百科,如下表1所示。
表1 经纬度计算需要的相关参数信息表
数据名称 | 数值大小 |
---|---|
地球赤道周长 | 40075.02千米 |
地球平均半径 | 6371.393千米 |
圆周率 | 3.141592653589793 |
对于任何球面上的两点,圆心角的半正矢值可以通过如下公式计算
本次实验测试的城市选择中国的34个省会,省会城市通常是一个地区的政治、经济和文化中心,其旅游资源丰富,具备相当大的旅游资源优势,吸引着大量游客。
省会城市旅游情况的一般分析:
(1)景点丰富:省会城市拥有许多历史文化名胜和自然风光,如博物馆、古迹、公园等,吸引着游客前来参观。
(2)文化活动多样:省会城市通常有丰富的文化活动,如艺术展览、音乐会、戏剧表演等,为游客提供更多选择。
(3)购物和美食:省会城市的商业中心通常聚集了各种品牌店和特色小吃,游客可以在这里尽情购物和品尝当地美食。
(4)交通便利:作为地区的政治和经济中心,省会城市的交通网络通常比较发达,游客到达和出行都比较方便。
(5)酒店和住宿:省会城市有各种星级酒店和民宿,满足不同游客的住宿需求,提供舒适的住宿环境。
(6)旅游服务设施完善:由于省会城市的重要地位,旅游服务设施一般比较完善,游客可以享受到更好的旅游体验。
综上所述,省会城市作为一个地区的门户和窗口,具有独特的旅游优势和吸引力,对于推动当地旅游业的发展和促进地方经济增长起着重要作用。
将中国34个省会城市作为旅游路线规划研究对象具有重要的必要性,对于促进旅游业发展、提升旅游体验、推动区域经济发展都具有积极意义,其必要性的分析如下:
(1)全面性:将34个省会城市作为研究对象,可以实现旅游路线规划的全面性。涵盖更广泛的地域范围,展示各地文化、风景和特色,为游客提供更多选择。
(2)多样性:不同省会城市具有独特的旅游资源和景点,通过研究这些城市,可以设计出更加多样化和富有吸引力的旅游路线,满足不同游客的需求。
(3)综合性:每个省会城市都有其独特的历史、文化、自然风光等特色,通过整合这些城市的资源,可以设计出更具综合性和丰富性的旅游线路,提升旅游体验。
(4)促进区域发展:旅游路线规划研究涉及到多个省会城市,可以促进不同地区之间的合作与交流,推动区域经济发展,促进文化交流。
(5)引导游客消费:通过研究34个省会城市的旅游资源,可以有效引导游客消费、增加旅游收入,拉动当地经济发展,实现共赢局面。
(6)战略规划:将34个省会城市纳入旅游路线规划研究范围,有助于制定更长远、更具前瞻性的旅游发展战略,为未来的旅游业发展奠定基础。
中国34个省会城市的经纬度数据来自百度,城市旅游2-3花费资金数据来自携程旅游、去哪儿旅行、百度百科、飞猪、维基百科,数据获取时间为2024年2月21日。
表1 中国34个省会城市的经度、纬度和城市旅游花费合计信息表
省会 | 经度 | 纬度 | 花费合计 | 省会 | 经度 | 纬度 | 花费合计 |
---|---|---|---|---|---|---|---|
济南 | 117 | 36.65 | 706 | 太原 | 112.53 | 37.87 | 1200 |
石家庄 | 114.48 | 38.03 | 950 | 西安 | 108.95 | 34.27 | 1530 |
长春 | 125.35 | 43.88 | 2824 | 郑州 | 113.6 | 34.76 | 1189 |
哈尔滨 | 126.63 | 45.75 | 2772 | 合肥 | 117.27 | 31.86 | 1519 |
沈阳 | 123.38 | 41.8 | 896 | 南京 | 118.78 | 32.04 | 1697 |
呼和浩特 | 111.65 | 40.82 | 2748 | 杭州 | 120.19 | 30.26 | 2294 |
广州 | 113.23 | 23.16 | 2562 | 海口 | 110.35 | 20.02 | 3835 |
南宁 | 108.33 | 22.84 | 1748 | 贵阳 | 106.71 | 26.57 | 1860 |
长沙 | 113 | 28.21 | 1281 | 武汉 | 114.31 | 30.52 | 2764 |
成都 | 104.06 | 30.67 | 1853 | 拉萨 | 91.11 | 29.97 | 4577 |
兰州 | 103.73 | 36.03 | 3157 | 银川 | 106.27 | 38.47 | 2407 |
福州 | 119.3 | 26.08 | 3184 | 昆明 | 102.73 | 25.04 | 3317 |
南昌 | 115.89 | 28.68 | 1416 | 北京 | 116.46 | 39.92 | 658 |
天津 | 117.2 | 39.13 | 272 | 上海 | 121.48 | 31.22 | 1173 |
重庆 | 106.54 | 29.59 | 1763 | 乌鲁木齐 | 87.68 | 43.77 | 2561 |
西宁 | 101.74 | 36.56 | 2689 | 香港 | 114.1 | 22.2 | 2016 |
澳门 | 113.33 | 22.13 | 3380 | 台北 | 121.5 | 25.05 | 4500 |
实验测试环境在CPU为i5-12400F,显卡为4060Ti的台式机上测试,使用的平台为PyCharm,编程语言为Python。
毕业论文相关程序设计的后续内容放在下面的资源链接中,如有需要自行下载: 论文复现-基于随机蕨的快速相位差DOA估计 如果获取上述方式获取不到资源,请在评论区发表自己的邮箱地址(私信不回复),看到后会尽快发送给你。
初始染色体的路程: 493.61443077537336
第300代后的最短的路程:164.0013944919979;第300代后的最少路程花费:9469.38475749383;第300代后的最优路径:
32-->30-->29-->4-->31-->9-->27-->34-->33-->25-->23-->22-->24-->19-->18-->20-->21-->26-->3-->12-->11-->10-->2-->1-->17-->16-->13-->14-->8-->7-->28-->15-->6-->5-->32
第350代后的最短的路程:161.8742823793638;第350代后的最少路程花费:9346.56602732846;第350代后的最优路径:
6-->15-->28-->7-->8-->14-->13-->17-->16-->1-->2-->10-->11-->12-->3-->26-->21-->20-->18-->19-->22-->24-->23-->25-->33-->34-->27-->9-->31-->4-->29-->30-->32-->5-->6
第1000代后的最短的路程:161.2488921835166;第1000代后的最少路程花费:9310.45621005291;第1000代后的最优路径:
6-->15-->28-->7-->8-->14-->13-->17-->16-->2-->1-->10-->11-->12-->3-->26-->21-->20-->18-->19-->22-->24-->23-->25-->33-->34-->27-->9-->31-->4-->29-->30-->32-->5-->6
基于遗传算法的旅游路程和资金需求最优规划方案设计的最终运行结果路线图如下:
图4-1 基于遗传算法的旅游路程和资金需求最优规划方案设计的最终运行结果图
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
为研究其他算法是否也能够达到此优化效果,选用了模拟退火算法作为基于遗传算法的旅游路程和资金需求最优规划方案设计的对比实验。基于模拟退火算法的旅游路程和资金需求最优规划方案设计的运行过程如下所示:
图4-2 基于模拟退火算法的旅游路程和资金需求最优规划方案设计的最终运行结果图
由上述对比实验结果可知,基于模拟退火算法的旅游路程和资金需求最优规划方案的设计在迭代次数为225次时得到收敛,此时最优路径长度为201.0,比基于遗传算法的最优路线规划的最短路径161.8742要高39.1258。
本文深入研究了基于遗传算法的旅游路程和资金需求最优规划问题,并对该算法在旅游规划领域的应用进行了全面探讨。通过对旅游规划问题的详细分析,本文明确了问题的核心要素和约束条件,进而构建了一个合理的数学模型。
在模型的构建过程中,本文充分考虑了旅行时间、预算限制以及旅游者的景点选择偏好等关键因素,确保模型能够全面反映旅游规划的实际需求。同时,本文设计了一个适应度函数,该函数综合考虑了旅行距离、旅行费用以及景点吸引力等多个因素,从而能够准确评估每个行程方案的优劣。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
""""
题目:基于遗传算法的旅游路程和资金需求最优规划方案
"""
from math import floor
import numpy as np
import time
import matplotlib.pyplot as plt # 导入所需要的库
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 使用微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False # 处理负号显示异常
class Gena_TSP(object):
def __init__(self, data,
maxgen=1000,
size_pop=100,
cross_prob=0.80,
pmuta_prob=0.02,
select_prob=0.8):
self.maxgen = maxgen # 最大迭代次数
self.size_pop = size_pop # 群体个数
self.cross_prob = cross_prob # 交叉概率
self.pmuta_prob = pmuta_prob # 变异概率
self.select_prob = select_prob # 选择概率
self.data = data # 城市的左边数据
self.num = len(data) # 城市个数 对应染色体长度
# 距离矩阵n*n, 第[i,j]个元素表示城市i到j距离matrix_dis函数见下文
self.matrix_distance = self.matrix_dis()
# 通过选择概率确定子代的选择个数
self.select_num = max(floor(self.size_pop * self.select_prob + 0.5), 2)
# 父代和子代群体的初始化(不直接用np.zeros是为了保证单个染色体的编码为整数,np.zeros对应的数据类型为浮点型)
self.chrom = np.array([0] * self.size_pop * self.num).reshape(self.size_pop,
self.num) # 父 print(chrom.shape)(200, 14)
self.sub_sel = np.array([0] * int(self.select_num) * self.num).reshape(self.select_num, self.num) # 子 (160, 14)
# 存储群体中每个染色体的路径总长度,对应单个染色体的适应度就是其倒数 #print(fitness.shape)#(200,)
self.fitness = np.zeros(self.size_pop)
self.best_fit = [] # 最优距离
self.best_path = [] # 最优路径
# 计算城市间的距离函数 n*n, 第[i,j]个元素表示城市i到j距离
def matrix_dis(self):
res = np.zeros((self.num, self.num))
for i in range(self.num):
for j in range(i + 1, self.num):
res[i, j] = np.linalg.norm(self.data[i, :] - self.data[j, :]) # 求二阶范数 就是距离公式
res[j, i] = res[i, j]
return res
# 随机产生初始化群体函数
def rand_chrom(self):
rand_ch = np.array(range(self.num)) ## num 城市个数 对应染色体长度 =14
for i in range(self.size_pop): # size_pop # 群体个数 200
np.random.shuffle(rand_ch) # 打乱城市染色体编码
self.chrom[i, :] = rand_ch
self.fitness[i] = self.comp_fit(rand_ch)
# 计算单个染色体的路径距离值,可利用该函数更新fittness
def comp_fit(self, one_path):
res = 0
for i in range(self.num - 1):
res += self.matrix_distance[one_path[i], one_path[i + 1]] # matrix_distance n*n, 第[i,j]个元素表示城市i到j距离
res += self.matrix_distance[one_path[-1], one_path[0]] # 最后一个城市 到起点距离
return res
# 路径可视化函数
def out_path(self, one_path):
res = str(one_path[0] + 1) + '-->'
for i in range(1, self.num):
res += str(one_path[i] + 1) + '-->'
res += str(one_path[0] + 1) + '\n'
print(res)
# 子代选取,根据选中概率与对应的适应度函数,采用随机遍历选择方法
def select_sub(self):
fit = 1. / (self.fitness) # 适应度函数
cumsum_fit = np.cumsum(fit) # 累积求和 a = np.array([1,2,3]) b = np.cumsum(a) b=1 3 6
pick = cumsum_fit[-1] / self.select_num * (
np.random.rand() + np.array(range(int(self.select_num)))) # select_num 为子代选择个数 160
i, j = 0, 0
index = []
while i < self.size_pop and j < self.select_num:
if cumsum_fit[i] >= pick[j]:
index.append(i)
j += 1
else:
i += 1
self.sub_sel = self.chrom[index, :] # chrom 父
# 交叉,依概率对子代个体进行交叉操作
def cross_sub(self):
if self.select_num % 2 == 0: # select_num160
num = range(0, int(self.select_num), 2)
else:
num = range(0, int(self.select_num - 1), 2)
for i in num:
if self.cross_prob >= np.random.rand():
self.sub_sel[i, :], self.sub_sel[i + 1, :] = self.intercross(self.sub_sel[i, :], self.sub_sel[i + 1, :])
def intercross(self, ind_a, ind_b): # ind_a,ind_b 父代染色体 shape=(1,14) 14=14个城市
r1 = np.random.randint(self.num) # 在num内随机生成一个整数 ,num=14.即随机生成一个小于14的数
r2 = np.random.randint(self.num)
while r2 == r1: # 如果r1==r2
r2 = np.random.randint(self.num) # r2重新生成
left, right = min(r1, r2), max(r1, r2) # left 为r1,r2小值 ,r2为大值
ind_a1 = ind_a.copy() # 父亲
ind_b1 = ind_b.copy() # 母亲
for i in range(left, right + 1):
ind_a2 = ind_a.copy()
ind_b2 = ind_b.copy()
ind_a[i] = ind_b1[i] # 交叉 (即ind_a (1,14) 中有个元素 和ind_b互换
ind_b[i] = ind_a1[i]
x = np.argwhere(ind_a == ind_a[i])
y = np.argwhere(ind_b == ind_b[i])
if len(x) == 2:
ind_a[x[x != i]] = ind_a2[i] # 查找ind_a 中元素=- ind_a[i] 的索引
if len(y) == 2:
ind_b[y[y != i]] = ind_b2[i]
return ind_a, ind_b
# 变异模块 在变异概率的控制下,对单个染色体随机交换两个点的位置。
def mutation_sub(self):
for i in range(int(self.select_num)): # 遍历每一个 选择的子代
if np.random.rand() <= self.cross_prob: # 如果随机数小于变异概率
r1 = np.random.randint(self.num) # 随机生成小于num==可设置 的数
r2 = np.random.randint(self.num)
while r2 == r1: # 如果相同
r2 = np.random.randint(self.num) # r2再生成一次
self.sub_sel[i, [r1, r2]] = self.sub_sel[i, [r2, r1]] # 随机交换两个点的位置。
# 进化逆转 将选择的染色体随机选择两个位置r1:r2 ,将 r1:r2 的元素翻转为 r2:r1 ,如果翻转后的适应度更高,则替换原染色体,否则不变
def reverse_sub(self):
for i in range(int(self.select_num)): # 遍历每一个 选择的子代
r1 = np.random.randint(self.num) # 随机生成小于num==14 的数
r2 = np.random.randint(self.num)
while r2 == r1: # 如果相同
r2 = np.random.randint(self.num) # r2再生成一次
left, right = min(r1, r2), max(r1, r2) # left取r1 r2中小值,r2取大值
sel = self.sub_sel[i, :].copy() # sel 为父辈染色体 shape=(1,14)
sel[left:right + 1] = self.sub_sel[i, left:right + 1][::-1] # 将染色体中(r1:r2)片段 翻转为(r2:r1)
if self.comp_fit(sel) < self.comp_fit(self.sub_sel[i, :]): # 如果翻转后的适应度小于原染色体,则不变
self.sub_sel[i, :] = sel
# 子代插入父代,得到相同规模的新群体
def reins(self):
index = np.argsort(self.fitness)[::-1] # 替换最差的(倒序)
self.chrom[index[:self.select_num], :] = self.sub_sel
def GA_TSP(data):
Path_short = Gena_TSP(data) # 根据位置坐标,生成一个遗传算法类
Path_short.rand_chrom() # 初始化父类
# 绘制初始化的路径图
x = data[:, 0]
y = data[:, 1]
print('初始染色体的路程: ' + str(Path_short.fitness[0]))
# 循环迭代遗传过程
for i in range(Path_short.maxgen):
Path_short.select_sub() # 选择子代
Path_short.cross_sub() # 交叉
Path_short.mutation_sub() # 变异
Path_short.reverse_sub() # 进化逆转
Path_short.reins() # 子代插入
# 重新计算新群体的距离值
for j in range(Path_short.size_pop):
Path_short.fitness[j] = Path_short.comp_fit(Path_short.chrom[j, :])
# 每隔三十步显示当前群体的最优路径
index = Path_short.fitness.argmin()
if (i + 1) % 50 == 0:
# 获取当前时间戳 记录运算时间
timestamp = time.time()
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(timestamp))
print(formatted_time)
print('第' + str(i + 1) + '代后的最短的路程: ' + str(Path_short.fitness[index]))
print('第' + str(i + 1) + '代后的最少路程花费: ' + str(Path_short.fitness[index]*125.521*0.46)) # 0.46元/人公里
print('第' + str(i + 1) + '代后的最优路径:')
Path_short.out_path(Path_short.chrom[index, :]) # 显示每一步的最优路径
# 存储每一步的最优路径及距离
Path_short.best_fit.append(Path_short.fitness[index])
Path_short.best_path.append(Path_short.chrom[index, :])
res1 = Path_short.chrom[0]
x0 = x[res1]
y0 = y[res1]
for i in range(len(data) - 1):
plt.quiver(x0[i], y0[i], x0[i + 1] - x0[i], y0[i + 1] - y0[i], color='r', width=0.005, angles='xy', scale=1,
scale_units='xy')
plt.quiver(x0[-1], y0[-1], x0[0] - x0[-1], y0[0] - y0[-1], color='r', width=0.005, angles='xy', scale=1,
scale_units='xy')
plt.title('基于遗传算法的旅游路程和资金需求最优规划方法的设计')
plt.show()
return Path_short # 返回遗传算法结果类
if __name__ == '__main__':
# 城市信息
nCity = 34
City = np.array([116.46, 39.92, 117.2, 39.13, 121.48, 31.22, 106.54, 29.59, 91.11, 29.97, 87.68, 43.77,
106.27, 38.47, 111.65, 40.82, 108.33, 22.84, 126.63, 45.75, 125.35, 43.88, 123.38, 41.8,
114.48, 38.03, 112.53, 37.87, 101.74, 36.56, 117, 36.65, 113.6, 34.76, 118.78, 32.04,
117.27, 31.86, 120.19, 30.26, 119.3, 26.08, 115.89, 28.68, 113, 28.21, 114.31, 30.52,
113.23, 23.16, 121.5, 25.05, 110.35, 20.02, 103.73, 36.03, 108.95, 34.27, 104.06, 30.67,
106.71, 26.57, 102.73, 25.04, 114.1, 22.2, 113.33, 22.13]).reshape(34, 2)
cost = [706, 950, 2824, 2772, 896, 2748, 2562, 1748, 1281, 1853, 3157, 1416, 272, 1763, 2689, 3380,
1200, 1530, 11889, 1519, 2294, 3835, 1860, 2764, 4577, 2407, 3317, 658, 1173, 2561, 2016, 4500]
# 执行算法,绘制最优路径图
Path_short = GA_TSP(City)
print('旅游中国34个省会城市的最终总花费: ' + str(Path_short.fitness[Path_short.fitness.argmin()] * 125.521 * 0.46 + sum(cost))) # 0.46元/人公里
毕业论文相关程序设计的后续内容放在下面的资源链接中,如有需要自行下载: 论文复现-基于随机蕨的快速相位差DOA估计
文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者私信联系作者。