PrologのTron Lightcycles AI
-
29-10-2019 - |
質問
AIをゲームに書くのに問題があります(Tron Lightcysなど)。 ncursesを使用して、Cのすべてのグラフィックと動きを書きます。今、私はプロログにボットのAIを書く必要があります。 SWI Prologを使用しています。
現在のゲームフィールド(すべてのマトリックス)、現在の人間の位置、現在のボット位置(マトリックスセルI、Jなど)を保存します。それらは、cから.plファイルのプレンティカットのように保存します。
私のゲームフィールドは、1と0(1-訪問、0-ビジター)を含むマトリックスです。このような:
human_current_position(0,1).
bot_current_position(1,2).
matrix([[1,1,0,0],
[1,1,1,0],
[0,0,0,0],
[0,0,0,0]]).
次に、次のようにこのマトリックスを分析する必要があります。
analyze(matrix).
したがって、Prologの分析関数はある程度の方向(左、下、上、または右)をファイルに保存し、私のCプログラムはこのファイルを読み、ボットを移動します。
ですから、私は質問があります - プロログのこのマトリックスをどのように分析できるか。 Min-Maxアルゴリズムについて何かを読みましたが、Prologでこれを実現することはできません。私のマトリックスとPrologの現在の位置で作業を行う方法を手伝ったり表示したりすることはできますか?
解決
Min-MaxがTronの良い結果につながるかどうかはわかりません。グリッドでは、通常は多くの通勤動きがあり、検索スペースが爆発します。たぶん、小さなフィールドや小さな検索の深さのために。しかし、あなたは否定を最小マックスの失敗として使用しようとすることができ、あなたは無料でアルファ・ベータ剪定を取得することができます(そう思います)。
不確実性のないゲームでは、MIN-MAXアルゴリズムは、最小限の相手ゲインが相手がゲインを最大化しようとすると想定していると計算します。プレイヤーの動きに及び、相手の動きにjを並べます。これは、次のように再帰的な式につながります。
Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )
私たちはゼロサムゲームに対処しているので、対戦相手は私たちの勝利です。 oftoners -gain = - winを持っているように。 MIN-MAX検索を最大検索に再構成できます。各プレイヤーはマキシマイザーです。
Best-Win = max_i ( - Best-Win_i).
勝利の値が範囲{-1、0、1}にある場合、否定を失敗として使用できます。次の述語を実装してゲームをモデル化するだけです。
% move(+Board,+Player,-Board)
% init(+Board)
% win(+Board,+Player)
% oposite(+Player,-Player)
% tie(+Board,+Player)
上記の述語は、引数でゲームを完全にモデル化するため、ゲーム状態はローカル変数に保存されます。その後、ゲームは次の述語を介して「分析」されます。
% best(+Board,+Player,-Board)
best(X,P,Y) :-
move(X,P,Y),
(win(Y,P) -> true;
oposite(P,Q),
\+ tie(Y,Q),
\+ best(Y,Q,_)).
検索の深さを制限するために、追加のパラメーターを追加するか、動きの象徴的な悔い改めを返すことをお勧めします。
さよなら
PS:Tic-Tac-Toeの例があります ここ.