1

AIをゲームに書き込むのに問題があります(トロンライトサイクルなど)。ncurses を使用して、すべてのグラフィックと動きを C で記述します。次に、プロローグにボットの AI を記述する必要があります。私はswiプロローグを使用しています。

現在のゲーム フィールド (すべてのマトリックス)、現在の人間の位置、および現在のボットの位置 (マトリックス セル 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).

したがって、プロローグの分析機能は、ファイルに保存された方向(左、下、上、または右)を返し、私のCプログラムはこのファイルを読み取り、ボットを移動します。

だから私は質問があります-Prologでこのマトリックスをどのように分析できますか。min-max アルゴリズムについて読んだことがありますが、Prolog ではこれを実現できません。プロローグの行列と現在の位置を使用して、最小最大アルゴリズムを機能させる方法を誰かが助けたり、指示したりできますか?

4

1 に答える 1

2

min-max が tron の良い結果につながるかどうかはわかりません。グリッド上では、通常、多くの交換可能な動きがあり、検索スペースを爆破します。おそらく、小さなフィールドおよび/または小さな検索深度の場合です。しかし、最小値と最大値の失敗として否定を使用しようとすると、無料でアルファ ベータ プルーニングが得られます (そう思います)。

不確実性のないゲームでは、ミニマックス アルゴリズムは、対戦相手が自分のゲインを最大化しようとすると想定される最小限の対戦相手のゲインを計算します。プレイヤーの動きに i を、対戦相手の動きに j を範囲指定します。これにより、次のような再帰式が得られます。

Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )

我々はゼロサムゲームを扱っているので、対戦相手の利益が我々の勝利です。Opponents-Gain = - Win になるようにします。最小最大検索を最大検索に再定式化できます。各プレイヤーはマキシマイザーです。

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)

上記の述語は Arguments でゲームを完全にモデル化するため、ゲームの状態はローカル変数に格納されます。次に、ゲームは次の述語を介して「分析」されます。

% 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: 三目並べの例はこちらにあります

于 2011-12-08T19:52:48.360 に答える