2016-09-30 8 views
2

私は、minimaxアルゴリズムを使ってHaskellでTic Tac Toeプログラムを書こうとしています。私は次のようにデータ型「ローズ」自分を構築:Haskell Recursive Minimax Tree

data Rose a = a :> [Rose a] 

これは私が「店の私のミニマックス木したいデータ型です。私はminimaxアルゴリズムの仕組みを理解していますが、それを再帰関数で実装することはできません。

minimax :: Player -> Rose Board -> Rose Int 
minimax p (r :> []) | hasWinner r == Just p    = 1 :> [] 
         | hasWinner r == Just (nextPlayer p) = (-1) :> [] 
         | otherwise       = 0 :> [] 
minimax p (r :> rs) = maximum(map root xs) :> xs 
    where xs = map (minimax' (nextPlayer p)) rs 

minimax' :: Player -> Rose Board -> Rose Int 
minimax' p [email protected](r :> []) = minimax p b 
minimax' p (r :> rs) = minimum(map root xs) :> xs 
    where xs = map (minimax p) rs 

「プレーヤー」はまた、値P1又はP2のものとすることができる自己構成されたデータ型です。 "hasWinner"関数は、指定された "Board"(Tic Tac Toeボードを保持できるデータ型)が勝者を持っているかどうかをチェックし、P1またはP2、またはNothingを返します。

私が書いたこの「ミニマックス」機能は私にエラーを与えているわけではありませんが、結果は正しくありません。私のminimax実装の欠陥はどこですか?

答えて

4

2人のプレーヤーを正しく切り替えることはできません。 minimax' p [email protected](r :> []) = minimax p bが間違っています。 map (minimax p) rsminimax'は、最大化の半分のために他のプレーヤーに切り替わりません。

P1(最大化しようとしています)とP2(最小化しようとしています)に対してこれを明示的に書くことをおすすめします。

終盤には、プレーヤーが現在

minimax :: Player -> Rose Board -> Rose Int 
minimax p (r :> []) | hasWinner r == Just P1 = 1 :> [] 
         | hasWinner r == Just P2 = (-1) :> [] 
         | otherwise    = 0 :> [] 

をプレイしている気にすることなく、勝者を割り当てることができP1

minimax P1 (r :> rs) = maximum (map root xs) :> xs 
    where xs = map (minimax (nextPlayer p)) rs 

プレーヤーP2を最大化しようとしているプレイヤーは、

minimax P2 (r :> rs) = minimum (map root xs) :> xs 
    where xs = map (minimax (nextPlayer p)) rs 
+0

こんにちはCirdec、ありがとうございました。あなたのコードは論理的ですが、私はP1と入力用のボード例を与えるminimax関数をテストすると、私のminimaxツリーは '1'で埋められます。しかし、サンプルボードには実際にP2が勝つシナリオがあります。つまり、ツリーに「-1」もあるはずです...「hasWinner」関数が機能するかどうかを二重にチェックし、いくつかのテストの後では正しく動作するように見えます。 – Felix

+1

'r'が' P1'で選択された移動であれば、 'rs'は' P2'に利用可能な動きであり、 'P2'は' minimize'を試みています。おそらく、「P1」は、「P1」が「P2」のために最も好きなものを選択する代わりに、他のプレイヤーがどのように移動を選択するかを考慮する必要があるかもしれない。 – Cirdec

+0

P2の移動を最小限にすることと実質的に同じではありませんか?私のコードであなたの理論をどのように実装するのですか? – Felix

0
を最小化しようとしています

多くのテストと混乱して、ゲームツリーを作った機能にいくつかの欠陥があることが分かりました。デバッグした後、Cirdecが提案したアルゴリズムが正しく動作しました!