模擬退火演算法解決TSP例項

2021-10-10 21:32:05 字數 3347 閱讀 6615

本文參考了以下文章:(也建議直接去看他們的文章,我這裡只是提供了python版本的**和初學者需要的一些**注釋

模擬退火演算法理論:

模擬退火演算法例項:

關於模擬退火演算法之前只看理論,到頭來還是一知半解,而今抬手程式設計,發現很簡單的乙個例項就能讓你記得更牢,何樂而不為?

原始碼是c++的,我看懂了之後通過重新編寫python程式來達到熟練理解的目的;另外,我在例項的基礎上新增了詳細注釋,便於初學者理解。

'''

該**通過模擬退火演算法來尋找旅行商問題(tsp)的近似最優解

'''import math

import random

import time

t = 5000 # 初始溫度

delta = 0.8 # 溫度衰減率

# 內迴圈內的兩個限制

iloop = 500 # 內迴圈最大迴圈次數

limit = 200 # 內迴圈中失敗的最大次數

# 外迴圈的兩個限制

oloop = 10 # 外迴圈最大迴圈次數

eps = 1e-8 # 達到最低溫度時退出迴圈

class path:

def __init__(self, cities=, len=0):

self.cities = cities

self.len = len

# 計算兩點距離

def distance(x, y):

return math.sqrt(pow(x[0] - y[0], 2) + pow(x[1] - y[1], 2))

# 構建距離矩陣

def getdistmatrix(a, n):

distmatrix = [[0] * n for i in range(n)]

for i in range(n - 1):

for j in range(i + 1, n):

distmatrix[i][j] = distmatrix[j][i] = distance(a[i], a[j])

# for i in range(n):

# for j in range(n):

# print(distmatrix[i][j]," ")

# print()

return distmatrix

# 初始化路徑

def get_init_path(a, n, distmatrix):

initpath = path() # 路徑

for i in range(n - 1):

initpath.len = initpath.len + distmatrix[i][i + 1]

print(initpath.cities, ": ", initpath.len)

return initpath

# 隨機產生新路徑

def get_next_path(n, curpath):

newpath = path()

newpath.cities = curpath.cities

# 隨機取兩個不同隨機數

random.seed(time.time())

x = random.randint(0, n - 1)

random.seed(time.time())

y = random.randint(0, n - 1)

while x == y:

x = random.randint(0, n - 1)

y = random.randint(0, n - 1)

# 採用兩點位置交換法產生新路徑

temp = newpath.cities[x]

newpath.cities[x] = newpath.cities[y]

newpath.cities[y] = temp

for i in range(n - 1):

newpath.len = newpath.len + distmatrix[newpath.cities[i]][newpath.cities[i + 1]]

return newpath

# 搜尋

def search(n, curpath, t):

loop_l = 0

bad_num = 0

while true:

loop_l = loop_l + 1

for i in range(iloop):

nextpath = get_next_path(n, curpath)

de = nextpath.len - curpath.len

if de < 0:

curpath = nextpath

print(curpath.cities, ": ", curpath.len)

bad_num = 0

bad_bad_num = 0

else:

p = math.exp((-1) * de / t)

r = random.random()

if p > r:

curpath = nextpath

print(curpath.cities, ": ", curpath.len)

# 不論隨機取到到的較差解有沒有被採納,都要記一次失敗

bad_num = bad_num + 1

# 如果失敗次數超過限制時,則應該退出

if bad_num > limit:

bad_bad_num = bad_bad_num + 1

break

if bad_bad_num > oloop or t < eps:

break

# 每次外迴圈結束就更新一下溫度值

t = t * delta

print(curpath.cities, ": ", curpath.len)

return curpath.len

# 列印結果

if __name__ == '__main__':

# 輸入

a = [[1, 0], [0, 6], [2, 3], [5, 4], [6, 1], [7, 5], [8, 2]]

n = len(a)

# 構建距離矩陣

distmatrix = getdistmatrix(a, n)

# 初始化路徑

initpath = get_init_path(a, n, distmatrix)

# 搜尋

minlen = search(n, initpath, t)

# 列印結果

print("所以最短路徑是", minlen)

模擬退火演算法解決TSP問題

模擬退火法 模擬退火法簡單解釋 為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期 間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。所謂的退火是指將固體加熱到足夠高的溫度,...

模擬退火 解決 TSP 問題

tsp問題求解 n個城市之間有一定距離,現在讓選擇乙個城市出發,然後到達所有的城市,最後回到原點每個城市只到達一次,求出一條路徑並且求出最短的距離 tsp問題是乙個np問題,但是可以求近似解,通過模擬退火演算法實現,源 include include include include include ...

TSP 模擬退火

都知道tsp是經典的np問題,從乙個點開始遍歷所有點,不重複,求最短路徑。可以用列舉終點,跑流量為2的最小費用,圖論來做,時間複雜度為 費用流已經用到堆優化了。顯然點,邊較多將無法承受。如果不要求精確解,使用模擬退火也是乙個不錯的選擇。模型簡單,轉移很暴力。先隨機生成一些解,然後隨機挑兩個點,開始試...