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个城市每一个城市至少经过一次的最短时间 ...
随机推荐
- PHP远程代码执行漏洞:CVE-2019-11043
漏洞详情: Nginx上fastcgi_split_path_info在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致PATH_INFO为空.而php-fpm在处理PATH_INFO为空的情 ...
- SpringBoot从入门到精通教程(二)
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- python一键搭建ftp服务
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyf ...
- ceph存储集群的应用
1.ceph存储集群的访问接口 1.1ceph块设备接口(RBD) ceph块设备,也称为RADOS块设备(简称RBD),是一种基于RADOS存储系统支持超配(thin-provisioned). ...
- CentOS7下常用安装服务软件源码编译安装方式的介绍
简介:介绍源码编译安装软件包的管理 源码安装优点:编译安装过程,可以设定参数,指定安装目录,按照需求进行安装,指定安装的版本,灵活性比较大. 源码安装的缺点:需要对依赖包一个一个的进行安装,不敢随便升 ...
- 【Mongodb】后台主键_id自增(Java版本)
ObjectId的选择 创建MongoDB文档时,如果没有赋值ID,系统会自动帮你创建一个,通常会在客户端由驱动程序完成.得到的ObjectId类似于这种 ObjectId使用12字节的存储空间, ...
- Oracle创建表空间创建用户授权
注意:SYS用户下执行.sys登录必须为sysdba身份.查看数据文件存放位置. select * from dba_data_files; 1.创建表空间 CREATE TABLESPACE tp_ ...
- 【探索之路】机器人篇(4)-根据3D文件来优化自己的机器人模型
此章节不是必须做的!!!! 因为我已经用solidworks画了机器人的3D模型,那我就直接导入已经画好的三维模型. 如果大家没有画也是可以直接使用上一章节我们已经构建的机器人模型.我这里只是一个对显 ...
- linux零基础之--常用命令
linux: 用户命令 linux 目录切换命令 linux文件命令 linux : vi编辑器 linux:打包压缩
- linkedhashmap中关于LRU算法的实现
//LinkedHashMap的一个构造函数,当参数accessOrder为true时,即会按照访问顺序排序,最近访问的放在最前,最早访问的放在后面 public LinkedHashMap(int ...