ミニマックスのようなアルゴリズムを使用して完璧なゲームをプレイする方法を知っています(この場合、私はTic-Tac-Toeに似たゲームを探しています)
ただし、人間のプレイヤーが実際に敗北する可能性がある、不完全なアルゴリズム、またはさまざまな「スキルレベル」(Easy、Medium、Hardなど)のAIを作成するにはどうすればよいのでしょうか。
ミニマックスのようなアルゴリズムを使用して完璧なゲームをプレイする方法を知っています(この場合、私はTic-Tac-Toeに似たゲームを探しています)
ただし、人間のプレイヤーが実際に敗北する可能性がある、不完全なアルゴリズム、またはさまざまな「スキルレベル」(Easy、Medium、Hardなど)のAIを作成するにはどうすればよいのでしょうか。
コンピュータのスキルを制限するために、さまざまな深さで検索を遮断します。評価関数を変更して、コンピューターがさまざまな戦略を優先するようにします。
専門家ではない人間のプレイヤーは、次善の戦略と限られた戦術で遊んでいます。これらはおおまかに言って、ゲームの状態の評価が低く、先を見据える能力が限られていることに対応しています。
ランダム性に関しては、コンピュータが常に同じ間違いを犯すとは限らず、場合によっては通常よりもうまくいくことも悪くなることもあるように、少しが望まれます。このため、常に最良のパスを選択するのではなく、スコアで重み付けされたパスを選択してください。ゲームの結果に基づいて評価関数を改良する、つまり重み付けを更新することで、AIをさらに面白くすることができます。このようにして、人間と同じように、プレイを通じて限られた検索深度でより良い評価関数を学習できます。
ゲームで使用する1つの方法は、ランダムな値を利用することです。ゲームのレベルを簡単にするために、人間のプレイヤーに有利なように乱数を選択する確率を上げます。例:
Easy level: only beat the human if you can randomly select a value less than 10 from the range of 1 to 100
Medium level: beat the human if you can select a random value which is less than 50 from a range of 1 to 100
Hard level: beat the human if you can randomly select a value less than 90 from a range of 1 to 100
もっと良い方法があると思いますが、これはあなたにアイデアを与えるかもしれません
「最も簡単な」方法は、minmaxの結果とともにしきい値を使用し、しきい値を超える結果からセットを作成してから、プログラムが選択するパスをランダムに選択することです。しきい値を低くすると、対戦相手が簡単になる可能性があります。
たぶん、純粋な運が悪かったとしても、最高の動きを選択できたからだと思います。つまり、「初心者の幸運」です。
基本的に、考えられる結果のエントロピー(ランダム性)を増やすことを目指しています。コンピュータの対戦相手を具体的に唖然とさせたい場合は、minmaxアルゴリズムが通過するレベルを制限するか、アルゴリズムの一部のポイントを切り下げます。
エンジンが人間のミスを犯すことは容易ではありません。検索深度を減らすことは簡単なアプローチですが、限界があります。たとえば、1プライに削減されたチェスエンジンは、1つの貴重なピースがまだ攻撃されている間にチェックを行うことがよくあります。相手が反撃で小切手を守ったとき、両方の駒が賞賛されます。経験の浅い人間でさえ、この間違いに陥る可能性は低いです。
たぶん、ファランクスと呼ばれるチェスエンジンからのいくつかのアイデアを使用することができます:http: //phalanx.sourceforge.net/index.html
これは、高度な難易度(-eオプション)を備えた数少ないオープンソースエンジンの1つです。私が間違っていなければ、通常の検索を実行しますが、自明でない動きを無視することがあります。evaluate.c
と呼ばれる関数が含まれています。この関数はblunder
、人間が動きを見落とす可能性があるかどうかを評価します。