import math
from os import path
import numpy as np
import matplotlib.pyplot as plt
class tspinstance:
'''設計乙個類,實現從檔案讀入乙個旅行商問題的例項
檔案格式為:
city number
best known tour length
list of city position (index x y)
best known tour (city index starts from 1)
以檔案01eil51.txt為例:
第一行51為城市數
第二行426為最優解的路徑長度
第三行開始的51行為各個城市的序號、x座標和y座標
最後是最優解的訪問城市系列(注意裡面城市序號從1開始,而python的sequence是從0開始)
eil51tour.png是最優解的城市訪問順序圖
'''def __init__(self, file_name):
'''從檔案file_name讀入旅行商問題的資料
'''self.file_name=file_name
a= open(file_name)
# 城市數量
self.city_num = a.readline()
# 返回座標 51行,3列
self.city = np.zeros((int(self.city_num), 3))
# x座標
self.x = np.zeros(int(self.city_num))
# y座標
self.y = np.zeros(int(self.city_num))
# 城市id
self.id = np.zeros(int(self.city_num))
b = a.readlines()
for i, content in enumerate(b):
if i in range(1, 52 ):
# 單行賦值
self.city[i-1] = content.strip('\n').split(' ')
self.x[i-1] = self.city[i-1][1]
self.y[i-1] = self.city[i-1][2]
for i, content in enumerate(b):
if i in range(53, 104):
self.id[i - 53] = content.strip('\n')
@property
def citynum(self):
'''返回城市數
'''return self.city_num
@property
def optimalval(self):
'''返回最優路徑長度
'''c = 0
i = 1
s = open(self.file_name)
str = s.readlines()
for content in str:
if i == 2:
c = content
i = i + 1
return c
@property
def optimaltour(self):
'''返回最優路徑
'''tour = np.array(self.id)
return tour
def __getitem__(self, n):
'''返回城市n的座標,由x和y構成的tuple:(x,y)
'''(x, y) = (self.x[n-1], self.y[n-1])
return (x, y)
def get_distance(self, n, m):
'''返回城市n、m間的整數距離(四捨五入)
'''u=int(self.x[n-1] - self.x[m-1])
v=int(self.y[n-1] - self.y[m-1])
dis = math.sqrt(pow(u,2) + pow(v,2))
return int(dis+0.5)
def evaluate(self, tour):
'''返回訪問系列tour所對應的路徑程度
'''dis = 0
for i in range(50):
dis += self.get_distance(int(tour[i]), int(tour[i + 1]))
dis += self.get_distance(int(tour[50]), int(tour[0]))
return dis
def plot_tour(self, tour):
'''畫出訪問系列tour所對應的路徑路
'''for i in range(51):
x0,y0 = self.__getitem__(i)
plt.scatter(int(x0),int(y0),s=10,c='c')
#記住座標點的畫法
用遺傳演算法求解TSP問題
最近在做人工智慧的課設,碰到乙個與tsp類似的問題,今天嘗試了一下用遺傳演算法求解tsp,下面是我碰到的問題以及我的一些想法 1.如何對個體進行編碼?tsp問題的實質是求乙個最短的哈密頓迴路,如果將城市標號為0,1,2.n 1,那麼tsp的乙個解就是乙個圓排列,等價於乙個規定了起點的排列,所以容易想...
1044 用分枝定界法求解TSP問題
用分枝定界法求解tsp問題 time limit 1000ms memory limit 65536k total submit 15 accepted 7 description 已知n個城市之間的相互距離,現有一推銷員必須遍訪這n個城市,並且每個城市只能訪問一次,最後又必須返回出發城市。如何安排...
用遺傳演算法求解的tsp問題
對於遺傳演算法的基本定義及內容筆者就不重複了,這裡附上 供大家去學習參看。遺傳演算法 大家也可以參看我其他的文章,比如智慧型演算法和數學建模專題,裡面都有詳細的介紹和題目 完全夠讀者學習和使用的,後面筆者也會對這些專題和其他內容進行更新,敬請期待哦。題目 在一條裝配線上用乙個機械手去固定待裝配部件上...