私は 4x4 tic-tac-toe ゲームで小さなプロジェクトを行っています。次善の策を見つけるために Alpha Beta Search を使用しています。アルファベータ検索では、以下のアルゴリズムの「ユーティリティ」関数で呼び出されているカットオフ評価関数を使用しています
すべてを正常に実装しましたが、問題はユーティリティ関数が負の値を返さないことであり、その理由が本当にわかりません! 以下は機能です
private static int utility(GameTreeNode gtn, bool isMin = false)
{
int nodeValue = 0;
switch (gtn.NodeBoard.getBoardStatus())
{
case Status.Success:
nodeValue = 50;
if (isMin) nodeValue = -50; /// here
break;
case Status.Incomplete:
if (isMin)
nodeValue = gtn.evaluate(State.X);
else
nodeValue = gtn.evaluate(State.O);
break;
}
// case Status.Draw:
return nodeValue;
}
isMin
MinValue 関数から呼び出されると、true に設定されます
isMin
は O の動きで、AI の動きは X です。O が勝った場合、ユーティリティは -50 を返すことになっています。しかし、それは 0 だけを返します。プログラムをデバッグしたところ、実際には -50 が割り当てられますnodeValue
(nodeValue
デバッガーで -50 に変更されます) が、Min 関数または Max 関数で受け取るとゼロになります。
注: プロジェクト全体で使用されるすべての int はsigned int
. unsigned
関数呼び出し元が署名されていないと考えている場合は、キーワードは使用されません
アルファベータ検索の完全なコードはこちら: http://pastie.org/8538015
友達、できるだけ早く助けてください。