私は、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実装の欠陥はどこですか?
こんにちはCirdec、ありがとうございました。あなたのコードは論理的ですが、私はP1と入力用のボード例を与えるminimax関数をテストすると、私のminimaxツリーは '1'で埋められます。しかし、サンプルボードには実際にP2が勝つシナリオがあります。つまり、ツリーに「-1」もあるはずです...「hasWinner」関数が機能するかどうかを二重にチェックし、いくつかのテストの後では正しく動作するように見えます。 – Felix
'r'が' P1'で選択された移動であれば、 'rs'は' P2'に利用可能な動きであり、 'P2'は' minimize'を試みています。おそらく、「P1」は、「P1」が「P2」のために最も好きなものを選択する代わりに、他のプレイヤーがどのように移動を選択するかを考慮する必要があるかもしれない。 – Cirdec
P2の移動を最小限にすることと実質的に同じではありませんか?私のコードであなたの理論をどのように実装するのですか? – Felix