日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

【建模算法】基于粒子群算法求解TSP问题(Python实现)

發(fā)布時間:2024/8/1 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【建模算法】基于粒子群算法求解TSP问题(Python实现) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【建模算法】基于粒子群算法(PSO)求解TSP問題(Python實現(xiàn))

TSP (traveling salesman problem,旅行商問題)是典型的NP完全問題,即其最壞情況下的時間復(fù)雜度隨著問題規(guī)模的增大按指數(shù)方式增長,到目前為止還未找到一個多項式時間的有效算法。本文探討了基于粒子群算法求解TSP問題的Python實現(xiàn)。

一、問題描述

? 本案例以31個城市為例,假定31個城市的位置坐標如表1所列。尋找出一條最短的遍歷31個城市的路徑。

城市編號X坐標Y坐標城市編號X坐標Y坐標
11.3042.312173.9182.179
23.6391.315184.0612.37
34.1772.244193.782.212
43.7121.399203.6762.578
53.4881.535214.0292.838
63.3261.556224.2632.931
73.2381.229233.4291.908
84.1961.044243.5072.376
94.3120.79253.3942.643
104.3860.57263.4393.201
113.0071.97272.9353.24
122.5621.756283.143.55
132.7881.491292.5452.357
142.3811.676302.7782.826
151.3320.695312.372.975
163.7151.678

二、粒子群算法主要步驟

  • 初始化粒子群。包括粒子的初始位置及速度,慣性因子等參數(shù)值
  • 粒子數(shù)M一般選取20~40個,不過對于一些特殊的難題需要更多的粒子,粒子數(shù)量越多,搜索范圍就越廣,越容易找到全局最優(yōu)解,但是也會帶來更大的計算消耗。

  • 評價各個粒子的初始適應(yīng)值。

  • 將初始的適應(yīng)值作為各個粒子的局部最優(yōu)解,保存各粒子的最優(yōu)位置。并找到其中的最優(yōu)值,作為全局最優(yōu)解的初值,并記錄其位置

  • 更新粒子速度及位置

  • 計算更新后粒子的適應(yīng)值,更新每個粒子的局部最優(yōu)值以及整個粒子群的全局最優(yōu)值。

  • 重復(fù)4~5直至滿足迭代結(jié)束條件

    流程圖如下:

  • 三、粒子群算法求解TSP問題

    1.TSP問題

    **旅行商問題(Traveling Salesman Problem,TSP)**是一個典型的NP問題。

    問題描述:一個銷售員需要訪問31個城市,恰好訪問每個城市一次,并最終回到出發(fā)城市,銷售員希望整個旅行的路程最短(或者成本定義為旅行所需的全部費用是他旅行經(jīng)過的的各邊費用之和,而銷售員希望使整個旅行費用最低)。從圖論的角度來看,該問題實質(zhì)是在一個帶權(quán)完全無向圖中,找一個權(quán)值最小的Hamilton回路。

    2.位置更新(position update)

    在TSP問題中,我們所求的是一個序列,需要優(yōu)化的是這個序列的順序,粒子xix_ixi? 如何定義是關(guān)鍵,我們將其定義為當(dāng)前粒子 i所走的順序序列,如:

    xi=(1,3,5,2,4)x_i=(1,3,5,2,4)xi?=(1,3,5,2,4)代表著該TSP問題一共有五個城市需要訪問,當(dāng)前粒子i的訪問順序為1→3→5→2→4,

    因此全部城市的訪問順序的所有可能序列就構(gòu)成了問題的可行空間,**粒子位置的更新就意味著粒子xix_ixi? 從一種序列sis_isi? 變化成另外一種序列 sjs_jsj?

    3.速度更新(velocity update)


    四、求解結(jié)果

    最優(yōu)路線與最優(yōu)值:

    最優(yōu)軌跡圖:

    優(yōu)化過程:

    當(dāng)然,PSO是一個基于概率的隨機自搜索算法,每次的搜索結(jié)果都不盡相同,但是若算法的收斂性表現(xiàn)的較好,也可以認為對算法的設(shè)計是合理的。

    五、Python源代碼

    #粒子群算法求解31座城市TSP問題完整代碼: import numpy as np import matplotlib.pyplot as plt import seaborn as sns import time#計算距離矩陣 def clac_distance(X, Y):"""計算兩個城市之間的歐氏距離,二范數(shù):param X: 城市X的坐標.np.array數(shù)組:param Y: 城市Y的坐標.np.array數(shù)組:return:"""distance_matrix = np.zeros((city_num, city_num))for i in range(city_num):for j in range(city_num):if i == j:continuedistance = np.sqrt((X[i] - X[j]) ** 2 + (Y[i] - Y[j]) ** 2)distance_matrix[i][j] = distancereturn distance_matrix#定義總距離(路程即適應(yīng)度值) def fitness_func(distance_matrix, x_i):"""適應(yīng)度函數(shù):param distance_matrix: 城市距離矩陣:param x_i: PSO的一個解(路徑序列):return:"""total_distance = 0for i in range(1, city_num):start_city = x_i[i - 1]end_city = x_i[i]total_distance += distance_matrix[start_city][end_city]total_distance += distance_matrix[x_i[-1]][x_i[0]] # 從最后的城市返回出發(fā)的城市return total_distance#定義速度更新函數(shù) def get_ss(x_best, x_i, r):"""計算交換序列,即x2結(jié)果交換序列ss得到x1,對應(yīng)PSO速度更新公式中的 r1(pbest-xi) 和 r2(gbest-xi):param x_best: pbest or gbest:param x_i: 粒子當(dāng)前的解:param r: 隨機因子:return:"""velocity_ss = []for i in range(len(x_i)):if x_i[i] != x_best[i]:j = np.where(x_i == x_best[i])[0][0]so = (i, j, r) # 得到交換子velocity_ss.append(so)x_i[i], x_i[j] = x_i[j], x_i[i] # 執(zhí)行交換操作return velocity_ss# 定義位置更新函數(shù) def do_ss(x_i, ss):"""執(zhí)行交換操作:param x_i::param ss: 由交換子組成的交換序列:return:"""for i, j, r in ss:rand = np.random.random()if rand <= r:x_i[i], x_i[j] = x_i[j], x_i[i]return x_idef draw(best):result_x = [0 for col in range(city_num+1)]result_y = [0 for col in range(city_num+1)]for i in range(city_num):result_x[i] = city_x[best[i]]result_y[i] = city_y[best[i]]result_x[city_num] = result_x[0]result_y[city_num] = result_y[0]plt.xlim(0, 5) # 限定橫軸的范圍plt.ylim(0, 4) # 限定縱軸的范圍plt.plot(result_x, result_y, marker='>', mec='r', mfc='w',label=u'路線')plt.legend() # 讓圖例生效plt.margins(0)plt.subplots_adjust(bottom=0.15)for i in range(len(best)):plt.text(result_x[i] + 0.05, result_y[i] + 0.05, str(best[i]+1), color='red')plt.xlabel('橫坐標')plt.ylabel('縱坐標')plt.title('軌跡圖')plt.show()def print_route(route):result_cur_best=[]for i in route:result_cur_best+=[i]for i in range(len(result_cur_best)):result_cur_best[i] += 1result_path = result_cur_bestresult_path.append(result_path[0])return result_pathif __name__=="__main__":#讀取31座城市坐標coord = []with open("data.txt", "r") as lines:lines = lines.readlines()for line in lines:xy = line.split()coord.append(xy)coord = np.array(coord)w, h = coord.shapecoordinates = np.zeros((w, h), float)for i in range(w):for j in range(h):coordinates[i, j] = float(coord[i, j])city_x=coordinates[:,0]city_y=coordinates[:,1]#城市數(shù)量city_num = coordinates.shape[0]# 參數(shù)設(shè)置size = 500 #粒子數(shù)量r1 = 0.7 #個體學(xué)習(xí)因子r2 = 0.8 #社會學(xué)習(xí)因子iter_max_num = 1000 #迭代次數(shù)fitness_value_lst = []distance_matrix = clac_distance(city_x, city_y)# 初始化種群各個粒子的位置,作為個體的歷史最優(yōu)pbestpbest_init = np.zeros((size, city_num), dtype=np.int64)for i in range(size):pbest_init[i] = np.random.choice(list(range(city_num)), size=city_num, replace=False)# 計算每個粒子對應(yīng)的適應(yīng)度pbest = pbest_initpbest_fitness = np.zeros((size, 1))for i in range(size):pbest_fitness[i] = fitness_func(distance_matrix, x_i=pbest_init[i])# 計算全局適應(yīng)度和對應(yīng)的gbestgbest = pbest_init[pbest_fitness.argmin()]gbest_fitness = pbest_fitness.min()# 記錄算法迭代效果fitness_value_lst.append(gbest_fitness)# 迭代過程for i in range(iter_max_num):# 控制迭代次數(shù)for j in range(size):# 遍歷每個粒子pbest_i = pbest[j].copy()x_i = pbest_init[j].copy()# 計算交換序列,即 v = r1(pbest-xi) + r2(gbest-xi)ss1 = get_ss(pbest_i, x_i, r1)ss2 = get_ss(gbest, x_i, r2)ss = ss1 + ss2x_i = do_ss(x_i, ss)fitness_new = fitness_func(distance_matrix, x_i)fitness_old = pbest_fitness[j]if fitness_new < fitness_old:pbest_fitness[j] = fitness_newpbest[j] = x_igbest_fitness_new = pbest_fitness.min()gbest_new = pbest[pbest_fitness.argmin()]if gbest_fitness_new < gbest_fitness:gbest_fitness = gbest_fitness_newgbest = gbest_new fitness_value_lst.append(gbest_fitness)# 輸出迭代結(jié)果print("最優(yōu)路線:", print_route(gbest))print("最優(yōu)值:", gbest_fitness)#繪圖 sns.set_style('whitegrid')plt.rcParams['font.sans-serif'] = 'SimHei' # 設(shè)置中文顯示plt.rcParams['axes.unicode_minus'] = Falsedraw(gbest)plt.figure(2)plt.plot(fitness_value_lst)plt.title('優(yōu)化過程')plt.ylabel('最優(yōu)值')plt.xlabel('迭代次數(shù)({}->{})'.format(0, iter_max_num))plt.show()

    總結(jié)

    以上是生活随笔為你收集整理的【建模算法】基于粒子群算法求解TSP问题(Python实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 在线免费国产视频 | 狠狠干超碰 | 国产午夜精品在线 | 亚洲熟妇丰满大屁股熟妇 | 日韩精品五区 | 日本学生初尝黑人巨免费视频 | 99精品视频免费版的特色功能 | 日韩精品久久久久久久的张开腿让 | 欧美一级淫片aaaaaa | 91丨国产丨捆绑调教 | 2019自拍偷拍 | 玖玖视频国产 | 青青草黄色 | 人妻互换免费中文字幕 | 夜夜撸av| 男女做那个的全过程 | 毛片视频在线免费观看 | 青青草社区 | 麻豆影视国产在线观看 | 玩弄白嫩少妇xxxxx性 | 国产精品免费视频一区 | 欧美另类精品xxxx孕妇 | 伊人色婷婷| 91成人在线播放 | 亚洲天堂2016 | 亚欧在线免费观看 | 中文字幕日韩电影 | 日本我不卡 | 久久久久久久精 | 久久中文网 | 日本五十路 | 午夜一区二区视频 | www.国产.com | 欧美xxxxav| 欧美精品 日韩 | 色亚洲视频 | 3d动漫精品啪啪一区二区竹菊 | 欧美激情视频在线观看 | 4438亚洲最大 | 欧美一区二区三区在线 | 欧美日韩亚洲高清 | 99久久久无码国产精品性色戒 | 777久久| 香蕉一级视频 | 国产三级自拍视频 | 久久久国产精品免费 | 澳门av网站| 日韩av网页| 亚洲丁香| 女futa攻玩遍整个后宫 | 青草青在线视频 | 日本成人免费在线 | 免费播放毛片 | 四虎精品视频 | 91av免费看 | 欧美性生交大片免费看app麻豆 | 美女又黄又免费的视频 | 97人妻一区二区精品免费视频 | 欧美国产中文字幕 | 日韩一区二区中文字幕 | 中文字幕在线视频免费 | 欧美人与野 | 九草在线观看 | 精品视频一区二区在线 | 肥臀av| 日韩av不卡在线观看 | 国内av| 伊人激情视频 | 国产a国产片| 国产一级久久久久毛片精品 | 亚洲免费一区二区 | 国产又大又粗又硬 | 国内一级视频 | 成人综合网站 | 久久国产露脸精品国产 | 一级黄色免费大片 | 国产露脸无套对白在线播放 | 黑人玩弄人妻一区二区三区四 | 伊人久久久 | 国产成人无码网站 | 在线看片中文字幕 | 精品人妻一区二区三区潮喷在线 | 丝袜制服影音先锋 | 黑人巨大精品欧美一区二区蜜桃 | 国产一区视频在线观看免费 | 精品麻豆视频 | 成人深夜在线观看 | 91资源在线播放 | 做爰视频毛片视频 | 黑人巨大精品欧美一区二区蜜桃 | 日日摸天天爽天天爽视频 | 少妇毛片视频 | 99视频网 | 天天艹天天操 | 亚洲女优在线 | 亚洲精品二三区 | 自拍偷在线精品自拍偷无码专区 | 日本香蕉网| 成人三级影院 |