2011-09-12 14 views
2

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

現在のゲームフィールド(すべてのマトリックス)、現在の人間の位置、現在のボットの位置(マトリックスセルi、jなど)を保存します。彼らはcからの.plファイルのような述語を保存します。

私のゲームフィールドは1と0(1 - visited、0 - unvisited)を含むマトリックスです。

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で認識できない。 誰も助けたり、Prologで私のマトリックスと現在のポジションでmin min maxアルゴリズム を作成する方法を指示できますか?

+0

Prologでミニマックスを使用できないのはなぜですか? – templatetypedef

+0

私は使用できます。しかし、私はundestand方法に傾けることができません。 – nub

+2

Ivan Bratkoの* Prolog Programming in Artificial Intelligence *のコピーを入手してください.Prologには、Prologのミニマックスの説明が含まれています。 –

答えて

2

min-maxがトロンにとって良い結果につながるかどうかはわかりません。グリッド上には があり、検索空間を吹き飛ばす多くの可換的な動きがあります。おそらく、小さな フィールドや小さな検索深度の場合。しかし、min-maxの失敗として否定文を使用しようとする可能性があります。そして、あなたはアルファベータを無料で得ることができます(私はそう思います)。

不確実性のないゲームでは、min-maxアルゴリズムは、反対側の相手が自分の利得を最大にしようとすると仮定した最小の対戦利得を計算します。相手が移動してjを移動させ、jを移動させます。

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

私たちはゼロサムゲームを扱うので、対戦相手は勝利です。それで、我々は対戦相手が勝利=勝利を得るようにする。 min-max検索を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,_)). 
あなたが検索の深さを制限する、または 動きの象徴repesentationを返すために追加のパラメータを追加したい場合があります

さようなら

P.S:あなたは三目並べの例hereを見つけます。