前回に引き続き、うきでんポーカー(テキサスホールデム・リミットルール)の評価関数について解説していきたいと思います。
今回は、フロップの評価関数についてです。
評価関数とは
評価関数(ひょうかかんすう、英: evaluation function)とは、コンピュータにゲームをプレーさせるソフトウェアを開発する際に使われるプログラミング技術のひとつで、ゲームの局面の状態を静的に評価し数値に変換する関数のこと。
Wikipedia より引用
Wikipedia には上記のように記されており、うきでんポーカーでは、コンピューターに適切なベット額やコール額を伝えるために使用しています。
フロップの評価関数
フロップからは、前ラウンドの状況なども考慮しなくてはいけなくなるため、評価関数の場合分けが非常に増えます。
また、ボードに増えるカードが一気に3枚であることに加え、リーチのドローだけでなく、2枚追加で完成のバックドアドローも考慮しなくてはいけないため、ハンドの場合分けも、このラウンドが一番多いです。
まずハンド別に場合分け
まず、ボードの種類(ペアボード、2ギャップボードなど)によって場合分けし、更にその中でできたハンドによって場合分けします。
そこからそれぞれに合った評価関数を呼び出し、ベットラウンドで使用します。
評価関数の構成
“4主チ” :[400,400,0],
“4主” :[400,400,0],
“4ア3Bチチ” :[400,400,0],
“4ア3Bチ” :[400,400,0],
“4ア3B” :[400,400,0],
“4ア4Bチチ” :[400,400,0],
“4ア4Bチ” :[400,400,0],
“4ア4B” :[400,400,0],
“4レ無チ” :[400,400,0],
“4レ無” :[400,400,0],
“4レ無PB” :[400,400,0],
“4主無2Bチチ”:[400,400,0],
“4主無2Bチ” :[400,400,0],
“4主無2B” :[400,400,0],
“4主無2BCB” :[400,400,0],
“4主無3Bチチ”:[400,400,0],
“4主無3Bチ” :[400,400,0],
“4主無3B” :[400,400,0],
“4主無4Bチ3”:[400,400,0],
“4主無4Bチチ”:[400,400,0],
“4主無4Bチ” :[400,400,0],
“4主無4B” :[400,400,0],
“3主チ” :[400,400,0],
“3主” :[400,400,0],
“3ア3Bチ” :[400,400,0],
“3ア3B” :[400,400,0],
“3ア4Bチチ” :[400,400,0],
“3ア4Bチ” :[400,400,0],
“3ア4B” :[400,400,0],
“3レ無チ” :[400,400,0],
“3レ無” :[400,400,0],
“3レ無PB” :[400,400,0],
“3主無2Bチ” :[400,400,0],
“3主無2B” :[400,400,0],
“3主無2BCB” :[400,400,0],
“3主無3Bチチ”:[400,400,0],
“3主無3Bチ” :[400,400,0],
“3主無3B” :[400,400,0],
“3主無4Bチチ”:[400,400,0],
“3主無4Bチ2B”:[400,400,0],
“3主無4Bチ3B”:[400,400,0],
“3主無4B” :[400,400,0],
“2主” :[400,400,0],
“2ア3Bチ” :[400,400,0],
“2ア3B” :[400,400,0],
“2ア4Bチ” :[400,400,0],
“2ア4B” :[400,400,0],
“2レ無” :[400,400,0],
“2主無2Bチ” :[400,400,0],
“2主無2B” :[400,400,0],
“2主無2BCB” :[400,400,0],
“2主無3Bチ” :[400,400,0],
“2主無3B” :[400,400,0],
“2主無4Bチ” :[400,400,0],
“2主無4B” :[400,400,0]
};
各ハンドを上のような連想配列で評価すると分かりやすくなります。
各添字と数字の意味に関してはこのあと説明します。
また、上の数字はモンスター評価の場合ですので、ハンドによって変える必要があります。
左の添字
“4主チ”などの添字は、前回および今回のベットラウンド状況を説明して場合分けしています。
場合分けの要素は以下の通り。
今ラウンド開始時点の残り人数
左端の数字は、今ラウンド開始時点での残り人数を意味します。
- 4 = 4人以上
- 3 = 3人
- 2 = 2人
主導権の状況
前ラウンドで主導権を握ったかどうかは、非常に重要な要素ですので細かく分けます。
- 主 = オリジナルレイザーの主導権有り
- ア3B = 3ベットアグレッサー主導権有り
- ア4B = 4ベットアグレッサー主導権有り
- レ無 = レイズが無かった
- 主無2B = 2ベットされて主導権無し
- 主無3B = 3ベットされて主導権無し
- 主無4B = 4ベットされて主導権無し
今ラウンドのチェック状況
今ラウンドにおいてどこまでチェックで回ったか、また、前ラウンドのレイザーはチェック済みかなどを考慮します。
「チ」が付いてるものは、チェック済みの意味です。
1巡目に無ベットで回ってくるのが最低条件で、その他条件はそれぞれにより異なります。
ポジションベット
一部のポジションベットについては考慮します。
- PB = ベット順が最後の人からベット
- CB = ベット順が最後の人からコンティニュエーションベット
配列左の数字
この金額までベットまたはレイズします。
配列真ん中の数字
追加する金額がこの額までならコールします。
配列右の数字
- 0 の場合
考慮しません。 - 1 ~ 99 の場合
ポットオッズが数字以上あれば、真ん中の数字の1ベット上までコールします。 - 100以上の場合
数字の額までコールします。
個性を付けるかどうか
キャラクター別に評価関数を用意すれば、個性を付けることもできますが、膨大な行数になってしまうため、やめておいた方がいいでしょう。
付けるとしても、味付け程度にとどめておきましょう。
まとめ
今回は、1例を紹介しただけなので、すっきりしているように見えますが、まじめに強いコンピューターを作るなら、1万行は超えてきます。
将棋 AI のような評価関数なら、もうちょっと少なくて済むのかもしれませんが、総当たりでやるとこんなものです。
これをヒントに、より良いアイデアが浮かんだ方は、ぜひチャレンジしてください。
その他ラウンドの評価関数は、こちらの記事を参照してください。
コメント