TSP旅行商问题

求解的问题,burma.tsp里面的内容
1 16.47 96.10
2 16.47 94.44
3 20.09 92.54
4 22.39 93.37
5 25.23 97.24
6 22.00 96.05
7 20.47 97.02
8 17.20 96.29
9 16.30 97.38
10 14.05 98.12
11 16.53 97.38
12 21.52 95.59
13 19.41 97.13
14 20.09 94.55
主程序
为方便调用,已经将所有的模块整合到一个程序内。
import random
import math
import matplotlib.pyplot as plt
import re
#本程序为老师布置的旅行商问题的程序练习作业#
#制作者-zqh 联系方式:博客园-克莱比 qq:962903415#
#-------参数部分--------#
generation=[]
fitvalue=[]
# dict={
# 1:[16.47,96.10],2:[16.47,94.44],3:[20.09,92.54],
# 4:[22.39,93.37],5:[25.23,97.24],6:[22.00,96.05],
# 7:[20.47,97.02],8:[17.20,96.29],9:[16.30,97.38],
# 10:[14.05,98.12],11:[16.53,97.38],12:[21.52,95.59],
# 13:[19.41,97.13],14:[20.09,94.55]
# }
#修改部位1。此部分的字典操作应该采用文件读写的方式来完成 crossrate=4
mutationrate=1
size=30
popgeneration=400 #——————————————这里是交叉的模块——————————#
def crossOver(population):
ret = []
for i in range(0,int(len(population)/2)):
cplist1=[]
cplist2=[]
register1=[]
register2=[]
crossval1=[]
crossval2=[]
x1=random.choice(population)
target=0
while target!=1:
x2=random.choice(population)
if x2!=x1:
target=1
if x2==x1:
continue
# print('随机抽出两个不同的母体',(x1,x2))
while len(cplist1)<=crossrate: #随机抽crossrate条染色体位置传给子代
crossposition=random.randrange(0,13)
if crossposition not in cplist1: #保证随机取得交叉位置不重复
cplist1.append(crossposition)
crossval1.append(x1[crossposition])
# print('母体1传给子代的交叉位置%s,交叉位置值%s' %(cplist1,crossval1))
for i in range(0,14):
if i not in cplist1:
cplist2.append(i)
crossval2.append(x2[i])
# print('母体2传给子代的交叉位置%s,交叉位置值%s' %(cplist2,crossval2))
for i1 in range(0,14):
if i1 not in cplist1: #单体长度14,如果是交叉位置上的就传值,如果不是就传d
register1.append('d')
if i1 in cplist1:
register1.append(x1[i1])
# print('母体1交叉位置形成子代1副本',register1)
for i2 in x2:
if i2 not in crossval1: #给d更换的值不能与已经存在的值重复
for xp in range(0,len(register1)):
if register1[xp]=='d': #用于定位d的位置
register1[xp]=i2
break
# print('交叉后的子体1',register1)
for p1 in range(0,14):
if p1 not in cplist2:
register2.append('d')
if p1 in cplist2:
register2.append(x2[p1])
# print('母体2交叉位置形成子代1副本',register2)
for p2 in x1:
if p2 not in crossval2:
for xp1 in range(0,len(register2)):
if register2[xp1]=='d':
register2[xp1]=p2
break
# print('交叉后的子体2',register2)
ret.append(register1)
ret.append(register2)
print('交叉完成后的种群',ret)
return ret #——————————————这里是变异的模块——————————#
def mutation(population):
ret=[]
for i in population:
porbility=random.uniform(0,1)
if porbility<mutationrate:
a=random.randrange(0,14)
b=random.randrange(0,14)
trans=i[a]
trans1=i[b]
i[a]=trans1
i[b]=trans
ret.append(i)
else:
ret.append(i)
# print('变异完成后的种群',ret)
return ret #——————————————————这里是产生随机种群的模块——————————#
def creatPop(popsize):
ret1=[]
for i in range(0,popsize):
ret=[]
# while(len(ret)<=13):
# x=random.randrange(1,15)
# if x not in ret: #xulie
# ret.append(x)
# ret1.append(ret)
#根据上次说的改进,可以使用random乱序来生成
for i1 in range(0,14):
ret.append(i1+1)
random.shuffle(ret)
ret1.append(ret)
print('生成的初代种群',ret1)
return ret1
creatPop(2) #——————————————————这里是将文件内的数据读取出来并放入字典的程序——————————# dict={} fil=open('burma14.tsp','r',encoding='utf8') #r代表读操作,且打开时按utf8
for i in range(0,14):
readtext=fil.readline()
readline=re.split('[ ]',readtext)
for i in range(0,4):
readline.remove('')
dict.update({int(readline[0]):[float(readline[1]),float(readline[2])]})
print(dict) #————————————————这里是适应度函数值的计算模块——————
def fitNess(population):
ret=[]
for i in population:
# print(i)
distance = 0
s=0
for xp in range(0,len(i)-1):
# print(dict[i[s]])
# print(dict[i[s+1]])
distance=distance+((dict[i[s]][0]-dict[i[s+1]][0])**2+(dict[i[s]][1]-dict[i[s+1]][1])**2)**(1/2)
# print(distance) #每两个相邻的点位求距离
s=s+1
distance=distance+((dict[i[0]][0]-dict[i[13]][0])**2+(dict[i[0]][1]-dict[i[13]][1])**2)**(1/2) #最后再求终点到起点的距离
ret.append(distance)
print('计算并集内个体适应度',ret)
return ret def popChoice(population):
ret=[]
ret1=[]
dict1={}
unionpop=[]
for i in start:
unionpop.append(i)
for i1 in population:
unionpop.append(i1)
print('新老种群并集',unionpop)
fitlist=fitNess(unionpop)
for xp in range(0,len(fitlist)):
dict1.update({fitlist[xp]:unionpop[xp]})
print(dict1)
fitlist.sort()
print(fitlist)
for xp1 in fitlist:
ret.append(dict1[xp1])
print(ret)
for xp2 in range(0,size):
if ret[xp2] not in ret1:
ret1.append(ret[xp2])
print(ret1)
print('最优适应度值为',fitlist[0])
fitvalue.append(fitlist[0])
return ret1 a=creatPop(size)
start=a
for i in range(0,popgeneration):
b=crossOver(start)
c=mutation(b)
d=popChoice(c)
print('第%s世代,他的最优解为%s' %(i+1,d[0]))
start=d for i1 in range(0,popgeneration):
generation.append(i1) plt.plot(generation,fitvalue)
plt.ylabel('fitness value') #为y轴加注释
plt.xlabel('generation') #为x轴加注释
plt.show()
#本程序为老师布置的旅行商问题的程序练习作业#
#制作者-zqh 联系方式:博客园-克莱比 qq:962903415#
TSP旅行商问题的更多相关文章
- 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- 数学建模 TSP(旅行商问题) Lingo求解
model: sets: cities../:level; link(cities, cities): distance, x; !距离矩阵; endsets data: distance ; end ...
- ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现
本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...
- Python动态展示遗传算法求解TSP旅行商问题(转载)
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/jiang425776024/articl ...
- 基于GA遗传算法的TSP旅行商问题求解
import random import math import matplotlib.pyplot as plt import city class no: #该类表示每个点的坐标 def __in ...
- TSP旅行商问题的Hopfield求解过程
连续型Hopfield在matlab中没有直接的工具箱,所以我们们根据Hopfield给出的连续行算法自行编写程序.本文中,以求解旅行商 问题来建立Hopfield网络,并得到解,但是该解不一定是 ...
- hdu5067Harry And Dig Machine(TSP旅行商问题)
题目链接: huangjing 题意:给出一幅图.图中有一些点,然后从第1个点出发,然后途径全部有石头的点.最后回到原点,然后求最小距离.当初作比赛的时候不知道这就是旅行商经典问题.回来学了一下. 思 ...
- TSP 旅行商问题(状态压缩dp)
题意:有n个城市,有p条单向路径,连通n个城市,旅行商从0城市开始旅行,那么旅行完所有城市再次回到城市0至少需要旅行多长的路程. 思路:n较小的情况下可以使用状态压缩dp,设集合S代表还未经过的城市的 ...
- HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)
题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...
随机推荐
- ubuntu20.04 LTS 更换国内163源、阿里源、清华源、中科大源
Ubuntu 20.04 是 Ubuntu 的第 8 个 LTS 版本,其重大更新和改进将在 2030 年前终止,计划于2020年 4 月 23 日发布. 国内有很多Ubuntu的镜像源,有阿里的.网 ...
- 【k8s实战一】Jenkins 部署应用到 Kubernetes
[k8s实战一]Jenkins 部署应用到 Kubernetes 01 本文主旨 目标是演示整个Jenkins从源码构建镜像到部署镜像到Kubernetes集群过程. 为了简化流程与容易重现文中效果, ...
- nacos注册中心源码流程分析
作为一个注册中心,和eureka类似,核心的功能点: 1.服务注册:nacos客户端携带自身信息向nacos服务端进行注册. 2.服务心跳:客户端定时向服务端发送心跳,告知服务端自己处于可用状态 3. ...
- iOS音乐电台类项目开发
1.技术难度不是太大,代码大致如下 2.用到的一些第三方 ZFProgressView,pageController,RESideMenu,MJRefresh,MBProgressHUD,RNFros ...
- 使用h5开发跨平台APP确保数据安全交互---服务器篇
从eclipse到android studio的安卓开发经验告诉我原声开发才是硬道理,其实以前很抵触html5开发app的,虽然没有去了解过,但是冥冥中就觉得它运行速度太慢了,加载渲染根本比不上原生开 ...
- [EF] - Code First处理Clustered Index
Clustered Index <=>集群索引: http://msdn.microsoft.com/en-us/library/ms177443.aspx 由于其特殊性,使得每个tabl ...
- 个人MySQL的事务特性原理学习笔记总结
目录 个人MySQL的事务特性原理笔记总结 一.基础概念 2. 事务控制语句 3. 事务特性 二.原子性 1. 原子性定义 2. 实现 三.持久性 1. 定义 2. 实现 3. redo log存在的 ...
- 机器学习 第4篇:数据预处理(sklearn 插补缺失值)
由于各种原因,现实世界中的许多数据集都包含缺失值,通常把缺失值编码为空白,NaN或其他占位符.但是,此类数据集与scikit-learn估计器不兼容,这是因为scikit-learn的估计器假定数组中 ...
- Elasticsearch索引生命周期管理方案
一.前言 在 Elasticsearch 的日常中,有很多如存储 系统日志.行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索引 的数量也会持续增长,然而这些场景基本上只有 ...
- FileZilla使用教程
FileZilla使用教程和问题汇总 正式开始之前我还是想闲聊几句,毕竟调试解决这些问题,整整耗了我一天半的时间.前不久学校要求上交一个web大作业,然后我们宿舍就寻思光做出来前后端搞头不大,不如整个 ...