2016-07-27 23 views
1

私はあまり正式なコンピュータサイエンス教育を受けていないので、これは愚かな質問であれば事前にお詫びします。expectiminimaxアルゴリズムのツリー構造

私は現在、Pythonでサイコロゲームを書いています。ルールはであり、the game found in The Witcher 2のようなではありませんが、代わりにしばらく前にApp Storeから外された古いモバイルサイコロのゲームに基づいています。

  • プレイヤーとAIは、当初5 poker dice各ロール次のよう

    ルールです。

  • プレイヤーとAIは、どのサイコロを掴んで残りのものを選んで結果を出すかを選択します。
  • 上記の工程を繰り返す。
  • 上位のカードがタイブレーカーとして機能している(以下を参照)上位のハンドを持つものは誰でも勝ちます。カインド

  • ツーペア
  • ワンペア
  • ハイカード
    1. 種類のファイブ
    2. フォー
    3. ストレート
    4. フルハウス
    5. スリー

関連するコードは以下の通りです:この層構造正しいです:

class Tree(object): 
    '''Generic tree node''' 
    def __init__(self, children=None, value=None, type=None): 
     self.children = [] 
     self.value = value 
     self.type = type # either 'player', 'ai', or 'chance' 
     if children is not None: 
      for child in children: 
       self.add_child(child) 

    def add_child(self, node): 
     assert isinstance(node, Tree) 
     self.children.append(node) 

    def is_terminal(self): 
     return len(self.children) == 0 


def expectiminimax(node): 
    '''Adapted from Wikipedia's pseudocode''' 
    MAX_INT = 1e20 
    if node.is_terminal(): 
     return node.value 
    if node.type == 'player': 
     q = MAX_INT 
     for child in node.children: 
      q = min(q, expectiminimax(child)) 
    elif node.type == 'ai': 
     q = -MAX_INT 
     for child in node.children: 
      q = max(q, expectiminimax(child)) 
    elif node.type == 'chance': 
     q = 0 
     for child in node.children: 
      # All children are equally probable 
      q += len(node.children)**-1 * expectiminimax(child) 
    return q 


def ai_choose(ai_hand, player_hand): 
    ''' 
    Given an AI hand and a player hand, choose which cards to hold onto 
    for best outcome. 
    ''' 
    def construct_tree(ai_hand, player_hand): 
     ''' 
     Construct a 5-layer (?) tree for use with expectiminimax. 
         Δ    MAX 
        / \ 
        O ... O    CHANCE - Possible AI moves 
       /\ /\ 
       ∇ .. ∇ ∇ .. ∇   MIN - Possible card dice rolls 
      / \ ........ 
      O ... O ...........  CHANCE - Possible player moves 
     /\ /\ ............ 
      ▢ .. ▢ ▢ .. ▢ ............. END - Possible card dice rolls 
     ''' 
     tree_structure = ['ai', 'chance', 'player', 'chance', 'ai'] 
     tree = Tree(type=tree_structure[0]) 
     for subset in powerset(ai_hand.hand): 
      tree.add_child(Tree(value=subset)) 
    # ... 

私がお聞きしたいのは、これはありますか?または、最小、最大、およびチャンスのレイヤーを再配置する必要がありますか?他の一般的なコメントも歓迎します。

答えて

0

レイヤーが正しいことが分かります。私は以前何か類似したことをやっていました。ツリー構造のデータ構造を使わなくても実装できると思っています。これは実行可能でなければならず、チャンスタイプを必要としないのでよりクリーンです。

+0

待ち時間、なぜチャンスタイプが必要ないのですか?ゲームは確定的ではありません。 – pixatlazaki

+0

申し訳ありませんが、私の悪い。私はそれを書いたときに自分のプログラムを考えていました。明らかに決定的なものではありません。しかし、AIを書きたい場合は、プレイヤーがどのダイスを得るかは関係ありません。あなたが降伏できない限り。 AIは彼にとって最高のものを計算しなければなりません。それはプレーヤーに影響を与えないからです。 – Allafesta

+1

@Allafestaまあ、私はそうだと思いますよね?プレイヤーが持っているものは、AIの方がより高いリスクに動く可能性があるからです。 AIがフルハウスを持っている場合、プレイヤーが1対の対戦相手を持っているかどうか、対戦相手がまっすぐかどうかによって、異なる決定を下す必要があります。 – pixatlazaki