求解的问题,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旅行商问题的更多相关文章

  1. 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  2. 数学建模 TSP(旅行商问题) Lingo求解

    model: sets: cities../:level; link(cities, cities): distance, x; !距离矩阵; endsets data: distance ; end ...

  3. ACS蚁群算法求解对称TSP旅行商问题的JavaScript实现

    本来以为在了解蚁群算法的基础上实现这道奇怪的算法题并不难,结果实际上大相径庭啊.做了近三天时间,才改成现在这能勉强拿的出手的模样.由于公式都是图片,暂且以截图代替那部分内容吧,mark一记. 1 蚁群 ...

  4. Python动态展示遗传算法求解TSP旅行商问题(转载)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/jiang425776024/articl ...

  5. 基于GA遗传算法的TSP旅行商问题求解

    import random import math import matplotlib.pyplot as plt import city class no: #该类表示每个点的坐标 def __in ...

  6. TSP旅行商问题的Hopfield求解过程

      连续型Hopfield在matlab中没有直接的工具箱,所以我们们根据Hopfield给出的连续行算法自行编写程序.本文中,以求解旅行商 问题来建立Hopfield网络,并得到解,但是该解不一定是 ...

  7. hdu5067Harry And Dig Machine(TSP旅行商问题)

    题目链接: huangjing 题意:给出一幅图.图中有一些点,然后从第1个点出发,然后途径全部有石头的点.最后回到原点,然后求最小距离.当初作比赛的时候不知道这就是旅行商经典问题.回来学了一下. 思 ...

  8. TSP 旅行商问题(状态压缩dp)

    题意:有n个城市,有p条单向路径,连通n个城市,旅行商从0城市开始旅行,那么旅行完所有城市再次回到城市0至少需要旅行多长的路程. 思路:n较小的情况下可以使用状态压缩dp,设集合S代表还未经过的城市的 ...

  9. HDU 5067 Harry And Dig Machine(状压DP)(TSP问题)

    题目地址:pid=5067">HDU 5067 经典的TSP旅行商问题模型. 状压DP. 先分别预处理出来每两个石子堆的距离.然后将题目转化成10个城市每一个城市至少经过一次的最短时间 ...

随机推荐

  1. nacos注册中心源码流程分析

    作为一个注册中心,和eureka类似,核心的功能点: 1.服务注册:nacos客户端携带自身信息向nacos服务端进行注册. 2.服务心跳:客户端定时向服务端发送心跳,告知服务端自己处于可用状态 3. ...

  2. matplotlib学习日记(八)----完善统计图

    (一)再说legend() import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 2.1, 0.1) y = np.p ...

  3. 深度学习论文翻译解析(十六):Squeeze-and-Excitation Networks

    论文标题:Squeeze-and-Excitation Networks 论文作者:Jie Hu  Li Shen Gang Sun 论文地址:https://openaccess.thecvf.co ...

  4. 各个JDK版本新语法糖

    java5语法扩充 自动装箱.泛型.动态注解.枚举.可变长参数.循环遍历等语法 JDK7 fork/join jdk8  二进制数的原生支持.switch语句中支持string <>操作符 ...

  5. Linux 路由 静态路由

    Linux 路由 静态路由 目录 Linux 路由 静态路由 一.临时生效,使用命令route A.添加到主机的路由 B.添加到网络的路由 C.添加默认路由 D.删除路由 E.查看所有路由信息 二.临 ...

  6. Redis学习之路(三)常用命令总结

    一.集群 查看Redis集群有多少个库 192.168.200.100:7001> config get databases 1) "databases" 2) " ...

  7. kubectl常用命令(个人记录)

    一.获取pod信息 1.获取当前集群运行的所有的pods的信息 kubectl get pod   2.获取当前集群运行的所有的pod运行在哪个节点 kubectl get pods -owide   ...

  8. HotSpot学习(二):虚拟机的启动过程源码解析

    1. 前言 上文介绍了HotSpot编译和调试的方法,而这篇文章将迈出正式调试的第一步--调试HotSpot的启动过程. 学习启动过程可以帮助我们了解程序的入口,并对虚拟机的运行有个整体的把握,方便日 ...

  9. 设计模式之委派模式(Delegate Pattern)深入浅出

    学习目标:精简程序逻辑,提升代码的可读性. 内容定位:希望通过对委派模式的学习,让自己写出更加优雅的代码的人群. 委派模式定义: 委派模式(Delegate Pattern)的基本作用是负责任务的调度 ...

  10. 手写实现JDK的动态代理

    Person接口 package com.zhoucong.proxy.jdk; public interface Person { // 寻找真爱 void findlove(); } 人物实现类 ...