2

棋盤式表示在一個不到64個位置的簡單棋類策略遊戲中仍然效果如何,或者基於陣列的簡單郵箱實現更實用嗎?策略棋盤遊戲的高效棋盤表示AI

我們學校的AI班每年都有一次比賽,教授組成一個棋盤遊戲,我們有四周的時間來創建一個AI來玩遊戲。通常,這些棋子是具有類似規則的棋子的子集,並在較小的棋盤上進行。即8×5,7×7等。我完全不知道如何使用40比特來比較象棋的典型64。

我唯一的問題是我不是很熟悉C或C++,並且會更容易在Java中實現該程序。他們是否有足夠的Java支持位操作來實現位圖表示,如果這樣可以增加效率,是否值得增加複雜性?學習曲線是否太陡峭?

我的計劃是根據時間使用AB剪枝,靜止搜索,轉位表,殺手移動等使用Negamax搜索。在如此短的時間內創建競爭性AI的任何其他提示?

回答

2

一個位面板可以工作,但在我看來,爲了使它正常工作而增加的工作量和複雜度在後來的計算效率上不值得任何可能的收益。

在事物的整體規模,從(&|)按位掩蔽任何效率超過取出數組(一個ListMap或偶數)的元件將用任何AI在很大程度上掩蓋或搜索算法要使用。

也就是說,指數或多項式複雜度的算法仍然需要O(e^n)O(n^d)以及用指針解除引用的二進制算術保存的少量CPU週期將不重要。

只需要使用目前可以使用的最簡單的數據結構(可能是一個數組,或者任何其他的數據結構),並專注於讓算法運行。如果你有時間,你可以分析你的程序,並且如果你發現數組查找正在佔用20%的運行時間,那麼也許可能考慮將所有事情重構爲按位運算。我個人認爲可能的方式是並行地搜索解決方案空間,以最大限度地利用多個CPU核心,或者更好地以一種可以跨多個計算節點分佈的方式。是的,如果你發現了一些非常聰明的東西,那至少可以使你有資格獲得碩士學位。 :)

+0

我喜歡使用更簡單的方法使用它,然後根據時間和性能進行調整。同時搜索遊戲樹將是我的下一個問題......感謝您的建議。 – npearson

+0

在4-8核心機器上運行時,來自並行執行的收益遠不及從位擺動中獲得的可能收益。雖然它可能更容易點擊(例如,如果您是以功能風格進行編程)。但是與位操作相比,大規模並行性非常複雜(例如GPU)。 – ziggystar

+0

您可能還會從製作智能算法而不是從位擺動優化中學到更多東西。 – ziggystar

0

以比特尺度設置個別位通常比布爾數組中的設置元素慢,因爲前者需要讀取+按位AND/OR +寫入,而後者只需寫入。

讀取位標度中的個別位也比較慢:讀取+按位AND/OR +移位與只讀。

因此,如果您的AI需要大量獨立電路板單元的讀取/寫入狀態,那麼比布爾數組更有效。同時,當電路板使用較少的存儲器時,即當單元被封裝成比特時,製作整塊電路板的克隆操作更快。如果您的AI經常克隆吟遊詩人,並且在克隆操作之間只進行少量獲取/設置操作,則無論板的尺寸如何,比特尺度都會更好。

+0

如果我實現了一個良好的製作和取消移動功能,我不應該克隆板。問題出現在移動的一代......我可以在不使用位板的情況下快速生成移動嗎? – npearson

1

在大學裏,我有類似於你的AI遊戲寫作比賽,當我擔心一些小分項時,比如「靜態編碼速度更快」還是「理智檢查會減慢我的程序速度」,我取得了最大的加速比。但是'如果我寫我的AI更聰明/更高效,它會更好地執行的等級,所以我要實現我發現的這個很酷的新技巧。

常見的加速示例包括alpha-beta修剪,殺手啓發式和選擇計算遊戲狀態強度的好算法(請注意,好!=更精確 - 也可能意味着更快且仍然準確。 ,如果你的分數計算更簡單,它可以讓你看到更多的動作,這意味着你用黑桃來彌補它)。

+0

讓評估更快或更準確會更好嗎?兩者的平衡很好? – npearson

+0

這種問題只能通過點對點的不同機器人,並看到哪些勝利:) – Patashu

1

你不如使用位面板。這並不是那麼複雜,而且你在移動生成和靜態交換評估方面獲得了顯着的提速。你的AI算法,不管多聰明,仍然需要做很多。

有關於這個問題的一個很好的網站:chessprogramming.wikispaces.com/Bitboards

因爲你的主板是不同的大小一些技巧可能不適用,這取決於你如何分配比特廣場。另一方面,由於它只是碎片的一個子集,傳統上用位板解決傳統問題的一些問題可能不存在。