2012-04-12 60 views
4

我正在爲Python編碼類編寫一個項目,我有一個問題。我正在編寫一個Reversi引擎,它會在遊戲中看到幾個動作,然後選擇它認爲最好的動作。雖然我知道python不是一種理想的語言(因爲它不如其他語言那麼快),但我認爲可以編寫至少可以運行的代碼,但可能會有點慢。我應該使用哪些模塊來創建遊戲樹?

這就是說,我正在嘗試創建兩個表格:一個遊戲板(認爲矩陣)和一個保存整數的遊戲樹。我想要使​​用高效的內存和快速添加,刪除和讀取條目。

我現在使用的電路板效率不高。我想問一下任何人會建議什麼模塊(有關如何使用它們的說明)來編寫一些可以使內存等同但內存較輕的模塊(例如:array,numpy;除了我不知道如何使用這些):

self.board = [[0, 0, 0, 0, 0, 0, 0, 0,], 
       [0, 0, 0, 0, 0, 0, 0, 0,], 
       [0, 0, 0, 0, 0, 0, 0, 0,], 
       [0, 0, 0, 1, 2, 0, 0, 0,], 
       [0, 0, 0, 2, 1, 0, 0, 0,], 
       [0, 0, 0, 0, 0, 0, 0, 0,] 
       [0, 0, 0, 0, 0, 0, 0, 0,], 
       [0, 0, 0, 0, 0, 0, 0, 0,]] 

對於遊戲樹我有想法取決於列表清單應該是多麼輕量級。我正在寫在標準Python工作的思路是相似的:

tree_zero = % 

tree_one = [%, %, %] 

tree_two = [[%, %, %], [%, %, %], [%, %, %]] 

tree_thre = [[[%, %, %], [%, %, %], [%, %, %]], 
      [[%, %, %], [%, %, %], [%, %, %]], 
      [[%, %, %], [%, %, %], [%, %, %]]], 

tree_four = [[[[%, %, %], [%, %, %], [%, %, %]], 
       [[%, %, %], [%, %, %], [%, %, %]], 
       [[%, %, %], [%, %, %], [%, %, %]]], 

      [[[%, %, %], [%, %, %], [%, %, %]], 
       [[%, %, %], [%, %, %], [%, %, %]], 
       [[%, %, %], [%, %, %], [%, %, %]]], 

      [[[%, %, %], [%, %, %], [%, %, %]], 
       [[%, %, %], [%, %, %], [%, %, %]], 
       [[%, %, %], [%, %, %], [%, %, %]]]] 

其中每個%是上面給出的主板之一(而且是理想更多:不是動不動就正好有三個選項)。但是這是一個緩慢而沉重的對象,python很難有效地使用內存(特別是當我比4層更深時)。

如果有人曾經使用過這樣的程序,或有高效模塊導入的想法讓我知道!

對於遊戲樹的示例,請考慮wikipedia page,尤其是頁面上的第一張圖片。

編輯:理想情況下,我想進一步看比前進四步,這只是前四個級別的樣子。此外,將會有多個給定樹木的副本浮動以供使用。速度對於像這樣呈指數增長的東西很重要。

+0

既然你只是展望三招,這應該不是特別的記憶密集型。你有任何代碼嗎? – 2012-04-12 19:51:21

+0

您可能想查看一些[關於此主題的其他問題](http://stackoverflow.com/search?q=reversi)。 – 2012-04-12 19:56:10

+0

Python列表實際上是很好的對象,如果你想要的只是隨機訪問其中一個項目 - 列表列表本身沒有任何錯誤。你可以自己構建一個樹對象,它允許你以更易讀的形式檢索葉節點或子樹 - 但是如果那裏的內部數據保存爲列表的列表就可以了 – jsbueno 2012-04-12 20:15:05

回答

3

在我看來,Python對於這類工作完全是完美的!也就是說,我在使用Python進行棋盤遊戲的過程中度過了非常有趣且富有成效的時間。

我的第一個建議是探索Bit Boards。雖然這裏的應用例子是國際象棋,但這個概念完全可以轉讓給Reversi。使用零和1來表示集合主板上存在的碎片不僅具有內存佔用少的優點,而且還具有計算速度提高的優點(按位運算快於相等運算)。

此外,您應該重新設計您的模型以某種方式實現遞歸(由評分函數提供便利)。這樣的實現意味着您可以編寫單個函數,並允許它縮放無限移動深度(或者更確切地說,您的設計不受限制,僅受限於資源),而不是預測和硬編碼1,2,3,4動作的邏輯。針對這種效應的精心設計的功能適用於雙方(玩家),然後可以停止選擇適合閾值的最佳選項(根據您選擇的任何標準停止計算,實時計算的位置)。

作爲參考,這裏是一個board game called Thud的github,它與我的程序幾乎完全相同。在這裏,我使用了17x17的棋盤,三種不同的棋子和兩種不同的策略 - 我們都可以看到它已經比Reversi的規則複雜得多。

哦,並且一個好的遞歸模型也適用於多線程!

+0

我很樂意討論任何與你同樣的 - AI是一個非常有趣的追求! – hexparrot 2012-04-12 21:40:40

+0

+1非常有趣。我剛剛開始了一個名爲[** Tsoro **](http://en.wikipedia.org/wiki/Igisoro)的類似非洲傳統棋盤遊戲的概念驗證,並希望開發Python中的遊戲AI。這真的幫助我提出AI設計,非常感謝!如果你有興趣,我會爲這個概念驗證創建一個github回購。乾杯! – chridam 2015-06-12 08:28:31

相關問題