1

五目並べ(5列)ゲームをJavaで個別のプロジェクトとしてコーディングしようとしています。AIの場合、アルファベータプルーニングでミニマックス関数を使用することがこれに取り組む良い方法であることを理解しています。ただし、これがどのように機能するかを想像するのに少し問題があります。

私の質問はこれです:ミニマックスツリーのノードの良い表現は何ですか?

私の評価関数は、ボード上のすべての空きスペースを「重み付け」すると思います。次に、そのボードから最小値決定木のノードとして最良の値を取得します。私は正しい方向にいますか?

そして、他のヒントも大歓迎です!前もって感謝します!

4

2 に答える 2

4

状態空間検索は、ボードのさまざまな状態を介して行われます。空いている場所ならどこにでも石を置けるので、動きが多いです。各状態は、3 つの値 (白、黒、または空いている) を持つ 9x9 マトリックスなどとして表すことができます。したがって、9x9 ボードでは、3 ^ 81 の可能なボード状態があります。

どのボード状態からでも、移動回数は空いている頂点の数です。これらの頂点のいずれかに石を置くことができます。自分の色しか遊べません。したがって、最大で 81 の可能な移動があります..最初の移動で 81、2 番目の移動で 80 というように続きます。したがって、深さ 5 まで合理的に検索でき、おそらくそれ以上..悪くありません。

前述のように、適切な表現は 2D マトリックスです。これは、空を表す 0、白を表す 1、黒を表す 2 などの値を持つ int の 2D 配列にすることができます。... int[9,9]。

あなたの評価関数はあまりよく聞こえません。代わりに、次の点についてポイントを与えます。

-- 連続して 5 を獲得 -- 基本的に、これは勝利なので最大スコアを与えます -- 2 つのオープン エンドで連続 4 を獲得 -- 対戦相手はあなたが 5 を獲得するのをブロックできないため、最大スコアも与えます。 -- 1 つのオープン エンドで 4 連続 -- 対戦相手はブロックするために 1 つの場所でプレーしなければならないため、依然として非常に脅威的なポジションです。-- 2 つのオープン エンドで 3 連続 -- 再び非常に高いスコア --- 4、3、2、1 両方のクローズド エンドで -- 5 を連続して作成することはできないため、0。

等々。

次に、標準のミニマックス アルゴリズム (アルファ ベータ プルーニング) を適用するだけです。これはチェスとまったく同じですが、異なる状態空間ジェネレータと評価関数があります。

于 2011-03-29T08:55:30.177 に答える
2

次の形式の評価関数を検討します。たとえば、1 行に 6 つの位置の各セットを検討します。(19x19 のボードでは、各ラインに沿って 14 があり、各対角線に沿って 0 から 14 までのさまざまな数字があります。ボード全体でこれらの数は 742 になると思います。私の計算は間違っている可能性があります。) 各セットには 729 の可能な配置があります。黒、白、空のスペースの。または、端から端までの対称性を考慮すると、378 になります。または、ええと、それよりも少ないですが、黒/白の対称性も考慮に入れると、どれだけ少ないかを計算するのは面倒です.

したがって、評価関数は、378 個またはそれ以上の数の要素を持つテーブル (または、水平線と垂直線用に 1 つ、対角線用に 1 つ) の 6 つの石の各ブロックのテーブル ルックアップで構成されます。 . 結果を合計すると、それがポジションの評価になります。

実際には、より大きなテーブル (ポジションのより長い行から派生したもの) がよりうまく機能することが判明する場合があります。

しかし、テーブルには何が入りますか?あなたのプログラムがそれを解決できるようにしましょう。テーブル内の任意の値から始めます (たとえば、eval(line) = #black(line)-#white(line) などを取ることができます)。アルファベータ検索を使用して、プログラムを再生させます。何が起こるかに応じて、テーブルのエントリを更新します。これにはさまざまな方法があります。ここに(スケッチ的に説明された)いくつかがあります。

  • 各ゲーム中、各プレイヤーのポジションで各パターンが何回発生したかを追跡します。ゲームが終わったら、各パターンのスコアを調整して、勝者がより頻繁に見たパターンがよりよく見えるようにします。
  • 検索を行うたびに、現在の位置のパターンのスコアを調整して、現在の静的スコアを検索によって得られたスコアに近づけます。
  • 移動するたびに、「前」の位置にある各パターンのスコアを調整して、「前」のスコアが「後」のスコアと一致するようにします。
  • 多数の異なるテーブルを用意します (したがって、評価関数のさまざまなバリアントが多数あります)。互いに対戦させてください。なんらかの進化を適用します (たとえば、全員と対戦してから、成績の悪い選手を捨てて、成績の良い選手から派生したミュータントに置き換えます)。

これらのアイデアのより洗練されたバージョン (チェスに適用されますが、同じアイデアが五目並べにも有効です) については、 http: //cs.anu.edu.au/~Lex.Weaver/pub_sem/publications/knightcap をご覧ください。 .pdf .

于 2011-03-29T09:23:32.647 に答える