ミニマックスアルゴリズムをコネクトフォーゲームで使用する方法を調査しています。プログラムを見ていると、この評価関数が見つかりました。
private static int[][] evaluationTable = {{3, 4, 5, 7, 5, 4, 3},
{4, 6, 8, 10, 8, 6, 4},
{5, 8, 11, 13, 11, 8, 5},
{5, 8, 11, 13, 11, 8, 5},
{4, 6, 8, 10, 8, 6, 4},
{3, 4, 5, 7, 5, 4, 3}};
//here is where the evaluation table is called
public int evaluateContent() {
int utility = 128;
int sum = 0;
for (int i = 0; i < rows; i++)
for (int j = 0; j <columns; j++)
if (board[i][j] == 'O')
sum += evaluationTable[i][j];
else if (board[i][j] == 'X')
sum -= evaluationTable[i][j];
return utility + sum;
}
そして、可能なソリューションを評価するためにMiniMaxアルゴが使用されます。
これがどのように/なぜ機能するのかわかりません。誰かが説明できますか?
表の数値は、そのスペースを含む4つの接続された位置の数を示します。次に例を示します。
これにより、各正方形がゲームの勝利にどれだけ役立つかがわかり、戦略の決定に役立ちます。
evaluateBoard
関数は、0未満の数値を返すと思います
intユーティリティ= 128
はタイプミスです-138に初期化する必要があります(表のすべての値の合計が276 = 2 x 138であるため)。これにより、evaluateBoard
関数が戻ります。
この評価関数は、ボードの平均位置を中心としたガウス正規分布に他なりません。中心位置がより多いものは、この評価関数からより高いスコアを取得します。この行列をMATLABでプロットすると、値がテントを形成するため、中心位置にバイアスがかかることがわかります。ただし、これは総合評価を実行し、空間分析を行わないため、これよりもはるかに優れた評価関数があると言わざるを得ません。
score = board.longest_chain(board.get_current_player_id()) * 10
# Prefer having your pieces in the center of the board.
# score boost
for row in range(6):
for col in range(7):
if board.get_cell(row, col) == board.get_current_player_id():
score -= abs(3-col)
Elif board.get_cell(row, col) == board.get_other_player_id():
score += abs(3-col)
上記は、longest_chainを介して取得された空間分析結果に中心指向のアイデアを適用する1つの例にすぎません。