2011-05-02 87 views
0

對於學校的任務,我必須做出一個求解的尖峯時刻遊戲..如果你不熟悉的尖峯時刻..檢查此鏈接:http://www.puzzles.com/products/rushhour.htmA *搜索Rush Hour遊戲?

對於該解算器我必須使用A *搜索算法,我看了一下互聯網,我想我很理解算法的工作原理。只有我真的沒有想法如何在解算器中實現它,也不知道如何構建網格汽車..有人可以給我一些提示/幫助嗎? 不是一個完整的解決方案..

+1

只是一個建議 - 因爲我實現了這個自己。你可能想要簡化一些事情,然後嘗試廣度優先的搜索--Rush Hour的問題空間足夠小,以至於這將立即解決問題。 – 2011-05-02 17:58:56

+0

你應該問你的教授一些幫助。你不能指望人們爲你做功課。除此之外,即使我們發佈解決方案,如果您使用本網站的解決方案,您很可能會因爲作弊而被捕。在這個階段最好向教授尋求幫助。 – 2011-05-02 18:30:24

+1

我不同意。問這樣的問題是學習的好方法。 – mquander 2011-05-02 18:42:35

回答

4

爲了表示汽車的網格,我只是使用一個矩陣的單元格陣列,其中每個單元格標有一個整數 - 0表示「空」,並且每輛車都有一個特定的號碼,因此網格中的不同汽車將顯示爲具有相同編號的連續單元格。

在這一點上,您應該能夠編寫一個函數來返回給定網格中所有可能的「移動」,其中「移動」是從一個網格狀態到另一個網格狀態的轉換 - 您可能不會不需要編碼一個比這更好的移動表示。

要實現A *,您需要一個天真的啓發式算法來確定移動的外觀,這樣您就知道首先嚐試哪個移動。我最初會建議,任何將目標汽車移近目標或讓目標汽車靠近目標汽車的行動可能是更好的選擇。就像Will A在評論中所說的,除非你正在解決一個1000x1000高峯時段的板子,否則這可能不是什麼大問題。

這就是我能想到的所有棘手的部分。

1

正如mquander或Will已經指出的那樣,A *算法可能對您的問題有點過分。

我只是給你一些提示,你可以用什麼其他算法來解決這個問題。 我不想解釋這些算法是如何工作的,因爲你可以在互聯網上找到很多好的描述。但是,如果你有問題,請不要猶豫,問我。

您可以使用屬於「非信息搜索」種類的算法。例如,您可以進行廣度優先搜索,深度優先搜索,統一成本搜索,深度限制搜索或迭代深化搜索。如果您使用廣度優先搜索或統一成本搜索,則可能需要處理可用內存空間問題,因爲這些算法具有指數空間複雜度(並且必須將整個搜索空間保留在內存中)。因此,使用深度優先搜索(空間複雜度爲O(b * m))更具有內存友好性,因爲如果不包含解決方案,您首先訪問的樹的左側部分可以省略。深度限制搜索和迭代深化搜索幾乎相同,而在迭代深化搜索中,您可以迭代地增加樹的搜索級別。

如果你比較時間複雜度(B =分支的樹中,m =最大的樹中,L =深度級別限制,d =溶液的深度的深度的因素):

廣度優先:乙^ (d + 1)

統一成本:b ^?

深度拳頭:乙^ M

深度限制:乙^升如果(L> d)

迭代深化:乙^ d

因此,大家可以看到迭代加深或廣度優先搜索表現相當好。深度限制搜索的問題在於,如果您的解決方案位於比搜索級更深的位置,那麼您將找不到解決方案。

然後你有所謂的「知情搜索」,如最優先搜索,貪婪搜索,A *,爬坡或模擬退火。總之,對於最優先搜索,您使用每個節點的評估函數作爲「合意性」的估計值。貪婪搜索的目標是擴大節點,使您更接近目標。爬山和模擬退火是斯圖爾特·拉塞爾解釋說爬山算法如下(我非常喜歡...):爬山算法就像在迷霧中攀登珠穆朗瑪峯一樣「。它只是一個循環,不斷向增值的方向發展。所以你只是「走」到增加評估功能的方向。

我會用的穿制服的搜索算法之一,因爲他們是非常容易實現的(你只需要程序樹,並正確地傳輸它)。如果你有一個很好的評價函數知情搜索執行通常是更好的... 希望幫助你...