5

我有一個工作的F#程序,運行Dominion,一款紙牌遊戲。我想用遺傳算法來確定最佳的演奏策略。但是,我不太瞭解AI或遺傳算法。你能指點我一些好的文學作品嗎?卡牌遊戲的遺傳算法(Dominion)

遊戲策略包括對給定手的反應。在每一個回合中,一個機器人都是一張牌。它可以選擇玩行動牌,或者根據已經處理的情況購買新牌。目標是以儘可能多的勝利點卡片結束遊戲。

硬編碼的方式可能類似於:

def play(hand, totalDeck): 
    if hand contains Smithy then use Smithy 
    if hand contains enough coins for Province then buy Province 
    if more than 30% of the totalDeck is Smithy, then buy coins 

我想在每個卡上,橋面總的目標部分的矢量方面描述策略:

[Smithy, Province, Copper, ...] 
[.3, .2, .1, ...] 

然後爲了改變一個機器人,我可以改變這個向量,看看這個變種版本是否更好。健身功能將是Dominion對其他各種機器人的平均分數。 (一個機器人的得分取決於對手是誰,但希望通過玩很多機器人對許多機器人,這可以甚至出)。

這是否有意義?我走向正確的道路嗎?

+0

對不起,但國際海事組織這是一個非常糟糕的描述你的問題。我甚至不知道你爲什麼要「結合」兩個機器人或你想要結合的機器人。我認爲行動牌是一種在遊戲過程中發生變化的動態屬性。請根據目標函數和決策變量更清楚地說明問題。我假設你想訓練你寫的一個通用bot的一些參數。也許你可以詳細說明這一點。你用什麼樣的編程語言編寫了紙牌遊戲的模擬器? – Andreas

+0

我同意我沒有很好地解決這個問題。我再次嘗試;這看起來如何? –

+0

絕對值得多花一點時間 – Andreas

回答

4

你從哪裏吸引其他機器人?你保持靜態嗎?如果是這樣,受過訓練的機器人本身不會變得「好」,只是善於利用虛擬機器人。如果不是,那麼其他機器人也會發展,除非其他限制適用,否則勝率不會成爲質量的良好指標。始終認識到,在充滿技能的機器人羣中,他們彼此的表現會顯得平庸!

你可以採取共同進化方法:

  • 變異的所有漫遊在一個足夠大的人羣。
  • 讓他們相互競爭,重複出現在循環賽的比賽,例如100倍
  • 消除一些表現最差的殭屍程序,
  • 保持幾個不變的最好的殭屍(精英
  • 筆芯其餘的人羣都有突變和好的機器人交叉。

或者你可以培養對一個固定的基準:

  • 請與出現良好,與遊戲
  • 或者知識手工製作的政策機器人,擁有人類玩家(自己呢?)提供這些舉措。這可能是您的機器人培訓體驗的一個很好的來源,但除非您有權訪問大型的(專家)人體動作數據庫,否則它非常緩慢。針對您的基準
  • 選擇表現最佳,變異等
2

  • 火車我覺得矢量不會真的有好結果的,除非比賽是非常線性。我建議採用以下基於規則的方法:

    在每一回閤中你都持有一套牌,並且你想確定你玩的牌,或者如果你沒有玩一張你想畫一張牌的牌一。你需要的是某種優先級功能,告訴你哪個牌最好玩。這種優先功能可以通過遺傳編程來描述。除非沒有卡的優先級高於設定的級別(例如0),否則您將一直玩最高優先級的卡,在這種情況下,您將繪製一張新的卡。遺傳編程可用於演變該優先功能。

    既然你使用F#,用C#編寫的HeuristicLab試試這種方法可能是個好主意。您可以將您的程序作爲問題實施,並讓評估功能執行該遊戲的模擬。爲你的規則寫一個語法和解釋器。定義一些參數,使您的優先規則能夠做出有意義的決定,例如一些常用的遊戲信息,比如打牌數量,剩餘省份等,以及一些與卡牌有關的信息,例如打牌的影響(以勝點爲準)等等。這些是您的解釋器的輸入變量,它們將會計算優先級值。具有最佳優先級值的卡是您選擇的卡。然後評估你的策略,例如定義10個隨機解決方案,當你創建這樣一個問題時,在評估中讓每個解決方案都與那些隨機機器人競爭。衡量你擊敗每一個隨機機器人的數量,你贏得的越多,越多的機器人擊敗了更好的健身,越贏得越差的得分。然後,您也可以爲您的問題添加一個分析器,它將使用性能最好的解決方案更新問題的隨機解決方案,以便隨着時間的推移逐漸發展。

    如果你願意,你也可以使用目標部分的想法。在這種情況下,你的編碼將是一個RealVector。您還可以使用HeuristicLab對其進行優化(使用進化策略,粒子羣優化或遺傳算法)。

  • 5

    Dominion是一款出色的遊戲,但使用遺傳算法進行優化很難,因爲任何給定遊戲的輸入在不同遊戲(卡組使用)之間不同,遊戲過程中最優策略會發生變化,對於任何特定情況,最佳遊戲只會慢慢出現在基因搜索中(直觀上,基於我對GAs和遊戲的非常好的理解)。

    對於Dominion來說,我認爲一個更好的方法可能是直接啓發式(基於規則)方法,或者非常有趣的蒙地卡羅搜索(例如參見http://cacm.acm.org/magazines/2012/3/146245-the-grand-challenge-of-computer-go/fulltext)。蒙託卡羅搜索的吸引力正是因爲:

    • 在Dominion中很容易生成隨機但合法的移動序列。
    • 它至少直接的判斷這樣的序列的「價值」(VP的增加)的「最佳遊戲」規則
    • 先驗建設是硬(這是什麼使得遊戲的那麼好)

    這是一個非常好的挑戰 - 你應該記錄你的經驗。