用python來編寫TSP問題

2021-08-29 12:20:59 字數 3830 閱讀 8928

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問題

對於遺傳演算法的基本定義及內容筆者就不重複了,這裡附上 供大家去學習參看。遺傳演算法 大家也可以參看我其他的文章,比如智慧型演算法和數學建模專題,裡面都有詳細的介紹和題目 完全夠讀者學習和使用的,後面筆者也會對這些專題和其他內容進行更新,敬請期待哦。題目 在一條裝配線上用乙個機械手去固定待裝配部件上...