本文參考了以下文章:(也建議直接去看他們的文章,我這裡只是提供了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的最小費用,圖論來做,時間複雜度為 費用流已經用到堆優化了。顯然點,邊較多將無法承受。如果不要求精確解,使用模擬退火也是乙個不錯的選擇。模型簡單,轉移很暴力。先隨機生成一些解,然後隨機挑兩個點,開始試...