用python視覺化模擬退火演算法

2021-08-15 08:51:55 字數 3540 閱讀 2947

按我個人的理解的話,是解決組合優化的問題是,使用隨機化的方法得到新解,如果新解比舊解要好,那麼就接受。如果新解沒有舊解好,那麼也按一定概率[exp(-delta_f/t)]接受。t是乙個溫度,內迴圈就產生新解直到達到平穩,外迴圈就退火(緩慢的速率溫度)。到結束溫度時,會收斂到最優解。那麼我用的示例是旅行商問題。直接貼**吧。

from matplotlib import pyplot as plt

import numpy as np

def coordinate_init(size):

#產生座標字典

coordinate_dict = {}

coordinate_dict[0] = (0, 0)#起點是(0,0)

for i in range(1, size + 1):#順序標號隨機座標

coordinate_dict[i] = (np.random.uniform(0, size), np.random.uniform(0, size))

coordinate_dict[size + 1] = (0, 0)#終點是(0,0)

return coordinate_dict

def distance_matrix(coordinate_dict,size):#生成距離矩陣

d=np.zeros((size+2,size+2))

for i in range(size+1):

for j in range(size+1):

if(i==j):

continue

if(d[i][j]!=0):

continue

x1 = coordinate_dict[i][0]

y1 = coordinate_dict[i][1]

x2 = coordinate_dict[j][0]

y2 = coordinate_dict[j][1]

distance=np.sqrt((x1-x2)**2+(y1-y2)**2)

if(i==0):

d[i][j]=d[size+1][j]=d[j][i]=d[j][size+1]=distance

else:

d[i][j]=d[j][i]=distance

return d

def path_length(d_matrix,path_list,size):#計算路徑長度

length=0

for i in range(size+1):

length+=d_matrix[path_list[i]][path_list[i+1]]

return length

def new_path(path_list,size):

#二交換法

change_head = np.random.randint(1,size+1)

change_tail = np.random.randint(1,size+1)

if(change_head>change_tail):

change_head,change_tail=change_tail,change_head

change_list = path_list[change_head:change_tail + 1]

change_list.reverse()#change_head與change_tail之間的路徑反序

new_path_list = path_list[:change_head] + change_list + path_list[change_tail + 1:]

return change_head,change_tail,new_path_list

def diff_old_new(d_matrix,path_list,new_path_list,head,tail):#計算新舊路徑的長度之差

old_length=d_matrix[path_list[head-1]][path_list[head]]+d_matrix[path_list[tail]][path_list[tail+1]]

new_length=d_matrix[new_path_list[head-1]][new_path_list[head]]+d_matrix[new_path_list[tail]][new_path_list[tail+1]]

delta_p=new_length-old_length

return delta_p

t_start=2000#起始溫度

t_end=1e-20#結束溫度

a=0.995#降溫速率

lk=50#內迴圈次數,馬爾科夫鏈長

size=20

coordinate_dict=coordinate_init(size)

print(coordinate_dict)#列印座標字典

path_list=list(range(size+2))#初始化路徑

d=distance_matrix(coordinate_dict,size)#距離矩陣的生成

best_path=path_length(d,path_list,size)#初始化最好路徑長度

print('初始路徑:',path_list)

print('初始路徑長度:',best_path)

best_path_temp=#記錄每個溫度下最好路徑長度

best_path_list=#用於記錄歷史上最好路徑

balanced_path_list=path_list#記錄每個溫度下的平衡路徑

balenced_path_temp=#記錄每個溫度下平衡路徑(區域性最優)的長度

while t_start>t_end:

for i in range(lk):

head, tail, new_path_list = new_path(path_list, size)

delta_p = diff_old_new(d, path_list, new_path_list, head, tail)

if delta_p < 0:#接受狀態

balanced_path_list=path_list = new_path_list

new_len=path_length(d,path_list,size)

if(new_len距離矩陣的話,太大沒必要輸出了,還有個圖:

還是說下思路吧:為了不用什麼文字檔案輸入什麼的,我打算先是隨機生成乙個座標字典,然後通過這個座標字典,算出對應的距離矩陣。然後按順序初始化路徑。好了,然後就是退火了。初始溫度我定了2000,其實定大一點比較好吧,雖說這樣演算法就比較慢,退火的速率我定了0.995,這樣算是比較慢的退火,這樣比較能找到全域性最優解吧而不是區域性最優解。生成新的路徑我是用了二交換法,也就是隨機選兩個點,然後這兩點之間的路徑反序。比較跟別人的部落格不一樣的是,我做了視覺化處理,記錄了每個溫度下的最好路徑長度和平衡路徑長度。然後最優路徑圖也plot出來了。還有一點要注意的點是,一定要弄距離矩陣,不然幾萬次迴圈都開方的話,速度太慢了,而且開方多了,誤差疊加。。。真的會很大。以上。

Python 資料視覺化

資料視覺化指的是通過視覺化表示來探索資料,它與資料探勘緊緊相關,而資料探勘指的是使用 來探索資料集的規律和關聯。資料集可以是用一行 就能表示的小型數字列表,也可以是數以吉位元組的資料。漂亮地呈現資料關乎的並非僅僅是漂亮的。以引人注目的簡潔方式呈現資料,讓人能夠明白其含義,發現資料集中原本未意識到的規...

python 視覺化庫

在做titanic分析的過程中,看了一些大神的想法,發現在分析資料的過程中,許多大神會使用到seaborn,plotly這些庫,而我等小白僅僅知道matplotlib這個唯一的資料視覺化庫而已。上網查詢資料後整理如下 資料視覺化庫可以根據其應用場景來分為以下幾類 基礎的2d,3d圖繪製庫,互動資訊視...

Python資料視覺化2 1 為什麼視覺化需要規劃

摘要 資料分析與視覺化 大多數視覺化故事是圍繞問題或話題展開的 資料探索或收集的起源。這問題包含了整個故事的起因,構成整個故事。這樣的資料征程以乙個問題開始,比如,2014年,報道的埃博拉病毒死亡人數是多少?回答這個問題需要乙個彼此協作的團隊完成。資料傳播者的作用應該是創造一種轉變觀眾看法的經歷。故...