問題タブ [minimax]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2618 参照

algorithm - ミニマックス評価関数

Unity3Dを使用して、ゲーム「ファイナルファンタジーVIII」で見られるミニゲームのトリプルトライアドを開発しています。

基本的なゲームは3x3グリッドで、プレイヤーとNPCは5枚のカードを手に持っています。目的は、ボードがいっぱいになるまでに最も多くのカードを保持することです。カードには、上下左右に4つの数字が入っています。あるプレイヤーがカードをグリッド上に置き、他のプレイヤーがその隣にカードを置くことができます。その後、カードの数字が比較されます(たとえば、カードが中央にあり、対戦相手がその左側で1枚プレイした場合。対戦相手のカードの右の値は、すでにそこにあるカードの左の値と比較されます)。一方のカードがもう一方のカードよりも大きい場合、プレイヤーは対戦相手のカードを「取ります」。

トリプルトライアドの詳細については、http://finalfantasy.wikia.com/wiki/Triple_Triadをご覧ください。

私は現在、人間がNPCと対戦できるように、シングルプレイヤー用のAIを設計しています。AIを開発する最善の方法は、アルファベータ法を使用したミニマックスアルゴリズムを使用して、AIの順番で可能な限り最良の動きを実現することであると判断しました。

私が抱えている問題は、インターネットで見た例の大部分が三目並べの評価関数を示していることです。これは、トリプルトライアドエバリュエーターよりもはるかに簡単です。これは、関数がカードの値と、カードがプレイされている位置(たとえば、敵のカードを取る)を考慮に入れる必要があるためです。

このエバリュエーター関数をコーディングする方法について誰かがヒントを持っていますか?または、少なくとも、このサイトのコードを、ボードのトリプルトライアドを評価するコードに適合させるにはどうすればよいでしょうか。

http://www3.ntu.edu.sg/home/ehchua/programming/java/JavaGame_TicTacToe_AI.html

0 投票する
2 に答える
702 参照

java - Minimax アルゴリズムで開始するアルファ/ベータの値は何ですか?

0 投票する
3 に答える
15593 参照

c++ - 三目並べのミニマックスアルゴリズムでbestMoveを返す

RusselNorvigの人工知能に関する本に記載されている三目並べのミニマックスアルゴリズムをコーディングしようとしました。bestMoveをユーザーに返す方法を除いてすべてがありました。bestMoveを返そうと努力していますが、いつbestMoveを選択するかを決めることができません。助けて、誰か?

PS:minmax値を見つけるための他の擬似コードがあります。ただし、三目並べのみに焦点を当てているため、他のゲームにも拡張しようとしています。ありがとう。

更新:コード全体はここにあります:http://ideone.com/XPswCl

0 投票する
1 に答える
135 参照

c++ - ネガマックスの制約を理解する

コードのスニペットは、tictactoe ゲームでの位置の bestMove を計算するために作成されます。minRating != LOSING_POSITION という for ループの条件を除いて、コードのほぼすべての部分を取得しました。このコードは、指定された疑似コードの実装に由来します。

for ループの 2 番目の条件を、forced win が見つかるまで指定されたコードと一致させることができませんでした。この事実とその minRating != LOSING_POSITION との類似点を見つけることができませんでした

0 投票する
1 に答える
617 参照

algorithm - 同じプレイヤーの連続移動を削除するアルファベータ

私は Checkers に alpha-beta pruning を実装し、動作していると思っていましたが、コンピューターが複数のジャンプを連続して実行しないことがわかりました (必要な場合)。例えば:

AI は次のことを行います。

AIは次のことを行う必要があります。

MovePiece の戻り値をチェックすることで、この問題を修正しようとしました。これは、プレイヤーがターンを完了したかどうかを返します。これは、移動がジャンプであるかどうか、およびさらにジャンプする必要があるかどうかによって判断されます。戻り値に基づいて、MaxValue/MinValue を再度実行するか (追加の移動があることを最初に確認したときの値に応じて異なります)、ツリーを続行してプレーヤーを切り替えます。

関連するコード (C#) は次のとおりです (retVal は、Value、Depth、Move to do を含む型です)。

...

ただし、これにより、いくつかの...興味深い結果が得られます (最初の移動は最小限のプルーンしか実行しません)。

新しい動きで MaxValue/MinValue を再度呼び出すのは正しいことですか?

0 投票する
1 に答える
2123 参照

artificial-intelligence - アルファベータ枝刈りのための評価関数の設計

私はチェスのゲームを設計しており、その背後にある AI は、アルファ ベータ プルーニングを使用した検索ツリーを実装しています。ゲームの評価関数の設計に苦労しています。

あらゆる種類のゲームの評価関数を設計するにはどうすればよいでしょうか?

0 投票する
1 に答える
402 参照

c++ - MinMax TicTacToe の簡単なデモ

私は、MinMax アルゴリズムがどのように機能するかを理解しようとして、髪の毛を引っ張ってきました。うまくいけば、アルファ ベータ プルーニング アルゴリズムが機能することを願っています。発生する再帰について混乱しています。

  • まず、各中間ボードは採点されますか? または端末ゲームボードのみ。
  • 第二に、正確には何が返されますか? プログラムは次の手をどこに置くべきかをどのように知るのでしょうか? ボード スコア (tictactoe では -1,0,1) を返すことになっているようですが、プログラムはどの手が次にプレイされるべきかをどのように認識しますか。

これを実証する単純な C または C++ プログラムを見つけようとしましたが、うまくいきませんでした。私はこのアルゴリズムを学ぼうとしています。コンピューター プログラミング クラスの残りの部分でプレゼンテーションを作成できます。

どうもありがとう!Ⅴ

0 投票する
1 に答える
203 参照

java - ミニマックス コードは常に 0 を返します

ウィキペディアからアルファベータ剪定を書きました。コネクト フォー AI を作成しようとしています。関数は列番号を返す必要があり、メイン関数が動きます。

0 投票する
1 に答える
222 参照

javascript - Chess Alpha Beta データストレージとしての JavaScript FileSystem API

私は JavaScript でチェス プログラムを書き始めており、サーバーをチェス AI ロジックに含める必要がある場合は Node.JS を作成することも考えています。私の質問は非常に単純です: JavaScript 用のクライアント側 FileSystem API は、将来の参照のためにミニマックス結果をキャッシュする合理的な方法ですか、それとも結果データが多すぎて 1 つの場所に保存できないのでしょうか? 私のアイデアは、AI がユーザーに適応し、毎回手動で再決定するのではなく、以前の決定にアクセスできるようにすることで「学習」できるようにする方法として使用できるというものでした。これは合理的な計画ですか、それとも必要なメモリ使用量を過小評価していますか? あなたの答えがこれがもっともらしいというものであれば、この方法でデータを保存するための最も効率的な方法に関するいくつかのヒントも役立ちます。

0 投票する
1 に答える
546 参照

c++ - MiniMaxからアルファベータ検索への変換に関する問題

OK、私の問題はボードゲームプログラミングで遊んだことがある人なら誰でもよく知っているはずなので、ここにあります:

  • MiniMaxアルゴリズムのバリエーションを実装しました(最小/最大値の代わりに移動を返します)。
  • 完全に失敗しましたが、アルファベータとして設定しようとしました。

だから、これが私のMiniMaxコードです:

アルファベータ検索になるように上記のことをどのように調整できるかについてのアイデアはありますか?


そして、これがアルファ-ベータ変換の私の試みです(これは惨めに失敗します):


ヒント(誤解を避けるため)

  • このthis->eval()関数は、プレーヤーAの観点からスコアを返します。たとえば、+ 100スコアは、ポジションがプレーヤーAに有利であることを意味し、-100スコアは、ポジションがプレーヤーBに有利であることを意味します。

  • MINUS_INFPLUS_INFは、それぞれ任意の小さい値と大きい値として定義されています。

  • これは宿題のようなものではありません(もしそれが私がそのようなもので遊ぶことに興味を持っていなかったとしたら...笑)

  • Moveは、移動に関する詳細と、それぞれの値(関数によって割り当てられた値)を含む単純なクラスevalです。

  • HASHMAKE移動- UNHASHMAKE(非)作成と移動-(非)ハッシュの2つのマクロであり、大きな違いはありません。

  • MAXMOVEこのように定義されます:#define MAXMOVE(A,B) (((A)->value>=(B)->value)?(A):(B))

  • MINMOVEこのように定義されます:#define MINMOVE(A,B) (((A)->value<=(B)->value)?(A):(B))