當前位置:首頁 » 操作系統 » 爬山演算法題

爬山演算法題

發布時間: 2024-10-21 00:48:08

❶ 爬山演算法(Hill Climbing)解決旅行商問題(TSP)

旅行商問題 TSP(Travelling Salesman Problem)是數學領域中著名問題之一。

TSP問題被證明是 NP完全問題 ,這類問題不者寬腔能用精確演算法實現,而需要使用相似演算法。

TSP問題分為兩類: 對稱TSP (Symmetric TSP)以及 非對稱TSP (Asymmetric TSP)

本文解決的是對稱TSP
假設:A表示城市A,B表示城市B,D(A->B)為城市A到城市B的距離,同理D(B->A)為城市B到城市A的距離
對稱TSP中,D(A->B) = D(B->A),城巧升市間形成無向圖
非對稱TSP中,D(A->B) ≠ D(B->A),城市間形成有向圖

現實生活中,可能出現單行線、交通事故、機票往返價格不同等情況,均可以打破對稱性。

爬山演算法是一種局部擇優的方法,採用啟發式方法。直觀的解釋如下圖:

爬山演算法,顧名思義就是 爬山 ,找到第一個山峰的時候就停止,作為演算法的輸出結果。所以,爬首衫山演算法容易把局部最優解A作為演算法的輸出,而我們的目的是找到全局最優解B。

如下圖所示,盡管在這個圖中的許多局部極大值,仍然可以使用 模擬退火演算法(Simulated Annealing) 發現全局最大值。

必要解釋詳見注釋

此處根據經緯度計算城市間距離的公式,請參考 Calculate distance between two latitude-longitude points? (Haversine formula)

此處初始化數據源可以使用 TSPLIB 中所提供的數據,此程序大致闡述爬山演算法的實現。

編寫於一個失眠夜

菜鳥一枚,歡迎評論區相互交流,加速你我成長•ᴗ•。

❷ 逆向搜索法和爬山法的例子有哪些

逆向搜索
計算機科學術語
科普中國 | 本詞條由「科普中國」科學網路詞條編寫與應用工作項目審核
審閱專家 姚遠
逆向搜索就是從目標狀態出發進行的搜索,通常是與正向搜索同時進行(雙向搜索),如果正向搜索時新擴展的狀態是逆向搜索中出現過的,將兩段搜索路徑連接起來就是找到了一個解(通常是一種搜索步數最少的解)。如果反向搜索時新擴展的狀態是正向搜索中出現過的,則與上述一樣,也是一種最優解。逆向搜索既是一種技術,又是一種思維,廣泛應用於計算機軟體、互聯網技術、電信技術、工業通用技術及貿易經濟等領域。
中文名
逆向搜索
外文名
backward search
相對
正向搜索
學科
計算機技術
本質
逆向思維
人工智慧舉例互聯網應用舉例鐵路運輸舉例網路貿易舉例計算機軟體舉例TA說參考資料
人工智慧舉例
在人工智慧中,雙向產生式系統是一種同時應用正向和逆向搜索方式的產生式系統。在該系統中,把狀態描述和目標描述合並為一資料庫,其中狀態描述應用F規則,目標描述應用B規則。[1]比如,智能機器人為了制定行動規劃,具有自動求解問題的能力,它可用一套特殊的產生式規則在狀態空間中搜索求解。為了得到操作序列,可以從當前的狀態集出發,進行正向搜索,也可以從目標狀態集出發進行逆向搜索,也可根據目標狀態和當前狀態的差選擇合適的操作(手段-目的分析法)等。[2]
互聯網應用舉例
搜索引擎優化(SEO)的主要工作是通過了解各類搜索引擎如何抓取互聯網頁面、如何進行索引以及如何確定其對某一特定關鍵詞的搜索結果排名等技術,來對SEO網頁進行相關的優化,更改自己的網站,向排列在搜索結果前列的網站學習網站的組織方式和網頁的編寫方式,使其提高搜索引擎排名,從而提高網站訪問量,最終提升網站的銷售能力或宣傳能力的技術,達到SEO目的。沒銀這個揣摩搜索引擎的過程是種逆向搜索的過程。
鐵路運輸舉例
逆向進路搜索演算法是鐵路運輸系統中的一種重要演算法。這種演算法利用站場圖和二叉樹的相似性,通過站場信息建立二叉樹模型,但該演算法搜索二叉樹的過程與傳統的二叉樹搜索演算法的搜索方向相反,它是由目標孩子向根節點搜索,這種逆向滑大搜索不需要進行遍歷搜索,就可以快速有效地完成所有進路的搜索。即在站場圖中完成任意一對車站按鈕之間的基本進路和變更進路的搜索。為了滿足一些特殊的要求(解決車次跟蹤的問題),該搜索也能完成任意一對車站設備之間的基本進路和變更進路的搜索。
網路貿易舉例
網路目標市場逆向搜索模型的建立思路是首先從分析一個具體產品的原理、功能和用途入手,並考慮它的主要技術規范、價格等其他因素,確定此商品的樣本特徵;由以上對產品樣本特徵的分析,推測出有效市場;制定出一套搜索步驟,檢索出需要此產品的商務網站,從而找到需此產品的企業、公司等顧客。
計算機軟體舉例
逆向搜索系統,用於從輸入的子字串中檢驗來自給定列表的一個或幾個字的存在的一種系統。字的列表存儲在一存儲器陣列,其對於存儲一個子字的每一存儲器單元包括一個比較器。串被分子串。每一子串被載入幾次到比較寄存器,每次滾動移動一個子字。在每一存儲器單元,同時與輸入子串進行比較。對於每一存儲器枯讓宴單元一個邏輯電路檢測串的子字與列表字的子字的相繼匹配。只要對於列表的完整字出現匹配,則對這一字設置一信號。設置一列表匹配信號,優先權編碼器可用來輸出匹配字之一的地址(位置)。[3]一、爬山法簡介
爬山法(climbing method)是一種優化演算法,其一般從一個隨機的解開始,然後逐步找到一個最優解(局部最優)。 假定所求問題有多個參數,我們在通過爬山法逐步獲得最優解的過程中可以依次分別將某個參數的值增加或者減少一個單位。例如某個問題的解需要使用3個整數類型的參數x1、x2、x3,開始時將這三個參數設值為(2,2,-2),將x1增加/減少1,得到兩個解(1,2,-2), (3, 2,-2);將x2增加/減少1,得到兩個解(2,3, -2),(2,1, -2);將x3增加/減少1,得到兩個解(2,2,-1),(2,2,-3),這樣就得到了一個解集:
(2,2,-2), (1, 2,-2), (3, 2,-2), (2,3,-2), (2,1,-2), (2,2,-1), (2,2,-3)
從上面的解集中找到最優解,然後將這個最優解依據上面的方法再構造一個解集,再求最優解,就這樣,直到前一次的最優解和後一次的最優解相同才結束「爬山」。
二、Python實例
設方程 y = x1+x2-x3,x1是區間[-2, 5]中的整數,x2是區間[2, 6]中的整數,x3是區間[-5, 2]中的整數。使用爬山法,找到使得y取值最小的解。
代碼如下:
import random
def evaluate(x1, x2, x3):
return x1+x2-x3
if__name__== '__main__':
x_range = [ [-2, 5], [2, 6], [-5, 2] ]
best_sol = [random.randint(x_range[0][0], x_range[0][1]),
random.randint(x_range[1][0], x_range[1][1]),
random.randint(x_range[2][0], x_range[2][1])]
while True:
best_evaluate = evaluate(best_sol[0], best_sol[1], best_sol[2])
current_best_value = best_evaluate
sols = [best_sol]
for i in xrange(len(best_sol)):
if best_sol[i] > x_range[i][0]:
sols.append(best_sol[0:i] + [best_sol[i]-1] + best_sol[i+1:])
if best_sol[i] < x_range[i][1]:
sols.append(best_sol[0:i] + [best_sol[i]+1] + best_sol[i+1:])
print sols
for s in sols:
el = evaluate(s[0], s[1], s[2])
if el < best_evaluate:
best_sol = s
best_evaluate = el
if best_evaluate == current_best_value:
break
print 'best sol:', current_best_value, best_sol
某次運行結果如下:
[[0, 5, 1], [-1, 5, 1], [1, 5, 1], [0, 4, 1], [0, 6, 1], [0, 5, 0], [0, 5, 2]]
[[-1, 5, 1], [-2, 5, 1], [0, 5, 1], [-1, 4, 1], [-1, 6, 1], [-1, 5, 0], [-1, 5, 2]]
[[-2, 5, 1], [-1, 5, 1], [-2, 4, 1], [-2, 6, 1], [-2, 5, 0], [-2, 5, 2]]
[[-2, 4, 1], [-1, 4, 1], [-2, 3, 1], [-2, 5, 1], [-2, 4, 0], [-2, 4, 2]]
[[-2, 3, 1], [-1, 3, 1], [-2, 2, 1], [-2, 4, 1], [-2, 3, 0], [-2, 3, 2]]
[[-2, 2, 1], [-1, 2, 1], [-2, 3, 1], [-2, 2, 0], [-2, 2, 2]]
[[-2, 2, 2], [-1, 2, 2], [-2, 3, 2], [-2, 2, 1]]
best sol: -2 [-2, 2, 2]
可以看到,最優解是-2,對應的x1、x2、x3分別取值-2、2、2。
三、如何找到全局最優
爬山法獲取的最優解的可能是局部最優,如果要獲得更好的解,多次使用爬山演算法(需要從不同的初始解開始爬山),從多個局部最優解中找出最優解,而這個最優解也有可能是全局最優解。
另外,模擬退火演算法也是一個試圖找到全局最優解的演算法。
Python實現的Kmeans++演算法實例
1、從Kmeans說起Kmeans是一個非常基礎的聚類演算法,使用了迭代的思想,關於其原理這里不說了。下面說一下如何在matlab中使用kmeans演算法。創建7個二維的
Python中的map、rece和filter淺析
1、先看看什麼是iterable對象以內置的max函數為例子,查看其doc:printmax.__doc__max(iterable[,key=func])-valuemax(a,b,c,...[,key=func])-,returnitsla
Python中的Numpy入門教程
1、Numpy是什麼很簡單,Numpy是Python的一個科學計算的庫,提供了矩陣運算的功能,其一般與Scipy、matplotlib一起使用。其實,list已經提供了類似於矩陣的

❸ 演算法式和爬山法的區別

爬山演算法是一種簡單的貪心搜索演算法,該演算法每次從當前解的臨近解空間中選擇一個最優解作為當前解,直到達到一個局部最優解。爬山演算法實現很簡單,其主要缺點是會陷入局部最優解,而不一定能搜索到全局最優解。

演算法式:把解決問題的方法一一進行嘗試,最終找到解決問題的答案。特點冊鏈:問題解決的系列搜索,採用試誤州巧孫的方式解決問題,優點:一定可以找到某種解決問題的方法,缺點:耗時耗力。

爬山法與手段目的分析法的區別:

使用爬山法的每一步都在逐漸接近最終目標,不存在中途折回的情況;在使用手段目的分析法時,人們有時為了達到目的,不得不暫時擴大目標狀態與初始狀態的差異,以有利於達到最終目標。

比如,兩兵交戰,若敵我力量懸殊,我軍可採取迂迴戰術曲線救國,先假裝寬咐投降,獲取情報,再一舉反攻。

熱點內容
菜鳥教程源碼 發布:2024-11-23 21:21:13 瀏覽:701
安卓手機怎麼錄屏能帶聲音 發布:2024-11-23 21:20:19 瀏覽:816
androidstudio查看簽名 發布:2024-11-23 21:14:54 瀏覽:818
能編譯stm32和C語言的軟體 發布:2024-11-23 21:12:45 瀏覽:768
電腦伺服器時間 發布:2024-11-23 21:08:02 瀏覽:644
php怎麼寫介面 發布:2024-11-23 20:53:38 瀏覽:965
伺服器ip解封後 發布:2024-11-23 20:29:13 瀏覽:34
wordpress伺服器搭建 發布:2024-11-23 20:22:56 瀏覽:841
pythonfor讀取文件 發布:2024-11-23 20:22:45 瀏覽:930
西數128m緩存硬碟 發布:2024-11-23 20:15:32 瀏覽:997