【Excelでできる!】ブラックジャックの方策評価をモンテカルロ法で行ってみた

2021年10月26日

ブラックジャックはカジノの中でも従属事象のゲームと呼ばれていて、うまくやるための必勝法らしきものが存在します。

本記事では独立事象のゲームとして簡略化しています。

従属事象のゲームとして捉えて必勝法を検証することもいずれはやろうと思いますが、今回はやりません。

ですので、必勝法を探していた方は退出した方がよいと思います。^^

 

単純戦略を評価することの意義

ご存知の方も多いと思いますが、ブラックジャックのルールは以下の通りです。

  1. ディーラーは自分とプレーヤ全員にカードを2枚ずつ配る
  2. ディーラーは手持ちのカードのうち、1枚をプレーヤー全員に見せる。従って、プレーヤーは自分の2枚とディーラーの1枚の情報を持っている
  3. プレーヤーはカードの合計が21に近づくよう、カードを追加(ヒット)したり、追加しない(ステイ)よう決める
  4. プレーヤーは好きなだけカードを追加できるが、合計値が21を超えてしまった時点で負けが確定する(バスト
  5. プレーヤー全員がステイしたら、ディーラーはもう1枚のカードも公開し、合計値が17以上になるまでカードを追加する
  6. ディーラーのカードの合計値が21を越えたらバストでプレーヤーの勝ち。越えなかったらプレーヤーのカードの合計値がディーラーのそれを越えればプレーヤーの勝ち。同じなら引き分け

 

他にも「ダブル」、「スプリット」、「インシュランス」等のオプションがありますが、今回は簡単のため使わないことにします。

尚、Aは1点か11点のうち自分に都合の良い方で、2~9はそのまま、10、J、Q、Kはすべて10点としてカウントします。

 

このゲームの面白いところは、ディーラーはカードの合計値が17以上になるまで自動的に追加し続けないといけないところです。

合計値が16の場合は自動的に追加しないといけません。

これは結構な自殺行為なのです。

なぜなら、追加するカードの期待値は7以上だからです。

つまり、合計値が16の時に追加すると、平均で23以上になってしまいバストしてしまう危険性が高いのです。

 

このようにディーラーには選択権がありませんが、プレーヤーにはあるためプレーヤーの方が有利かと思いますが、勿論そんなことはありません。

そんなことしたらカジノが赤字になってしまいます。

プレーヤーに不利な条件は、プレーヤーが全員ステイしない限り、ディーラーは上のような無謀な試みをしなくて済むことです。

プレーヤーは余りに保守的にステイしてしまうと、ディーラーの合計値に負けてしまう可能性が高まりますので冒険しないといけません。

そうすると、先にバスト(21を超えてしまう)してくれる可能性が結構あります。

後攻めのディーラーはその点有利です。

 

このようなことを考えながら、プレーヤーはヒットするか(カードを追加する)、ステイするか(カードを追加しない)を決めます。

決め手となる情報は自分の手持ちのカードと、ディーラーの1枚のカードです。

ブラックジャックの必勝法とは、この2つの情報からヒットするか、ステイするかを決める虎の巻のことです。

(正確には、ある範囲の数字のカードがあと何枚残っているかを推測するカウンティングという手法も存在しますが、今回は独立事象のゲームと仮定しますので考慮しません)

 

強化学習を使ってこの虎の巻を作ることができますが、今回はまず単純戦略を採った場合についてのシミュレーションをしてみます。

単純戦略とは、例えば自分の手持ちカードの合計が18を超えるまでヒットし続けるというような戦略です。

でも、このような単純戦略を馬鹿にしてはいけません。

本格的な虎の巻では幾通りもの組み合わせがあるため、凡人には覚えきれません。

単純戦略が多くの人にとっては現実的でしょう。

 

状態価値の見積り方

今回のシミュレーションの目的は、単純戦略を採った場合に、各状態において勝つ確率がどれくらいあるかを見積もることです。

これは言い方を変えれば、各状態における価値を見積もることです。

 

例えば、手持ちカードの合計値が20の場合、この状態価値は相当高いといえます。

余程のチャレンジャーでない限りはステイするでしょうから、そうすれば負ける可能性はほとんどありません。

でも、合計値が12の場合は分かりませんね。

普通はヒットするでしょうが、出たカードによってはもう何度かヒットするかもしれないので、その結果合計値がいくつになるかなんて分かりません。

これは何度も何度もやってみて、平均値を取って見積もるしかないでしょう。

 

この「何度も何度も繰り返して平均を取って見積る」というのは正にモンテカルロ法です。

じゃあ、どのように各状態での価値を見積もるんだという話しになりますね。

それは次のようにします。

プレーヤーは18を超えるまでヒットし続けるという戦略を採ることにします。

プレーヤーに配られたカードは3とJ、ディーラーのカードの1枚は8でした。

この時、プレーヤーのカード合計値は13です。

下図ではディーラーのカードを3枚描いていますが、配られたカードは8と5です。

合計は13で、いずれ追加でカードを引かないといけませんので、追加されたカード7も描いています。

この7が追加されるのはプレーヤーがステイしてからなので先の話しですが、どの道追加されるので最初から描いています。

但し、プレーヤーがヒットかステイかを判断する時には8しか見えていませんので、それ以外の2枚は見えていないことを示すために隠してあります。

 

さて、この状態ではプレーヤーはヒットしますね。

合計が18に達していませんので。

すると、次のように5が出ました。

 

これで合計が18に達しましたので、プレーヤーはステイします。

そして、ディーラーは追加のカード7を引いて合計が20になります。

プレーヤーの負けです。

前回の記事で紹介した累積報酬Gを計算してみましょう。

>> 【強化学習をわかりやすく】モンテカルロ法をExcelに実装して迷路問題を解いてみた

 

勝った時の報酬は1,負けると-1、引き分けでゼロとします。

また、割引率は0.9、学習率は0.2とします。

ステップ1の段階では報酬が確定していませんが、ステップ2で負けが確定したため報酬は-1です。

この報酬は割引率を掛けて前に遡って伝播していくため、ステップ1の報酬は-0.9になります。

これらに学習率を掛けるとステップ1のG1は-0.2、ステップ2のG2は-0.18になります。

そして、ステップ2ではG2がそのまま状態価値になりますが、ステップ1の状態価値はG1とG2を足した値になりますので-0.38になります。

 

一方、それぞれのステップでの状態がどうなっているかというと、ステップ1ではプレーヤー13,ディーラー8です。

ステップ2ではプレーヤー18、ディーラー8です。

なぜそうなるかというと、このゲームをするエージェントはプレーヤーですが、このプレーヤーが認識している状態がそうだからです。

ディーラーが伏せているカードの数は分かりませんし、17に満たない場合にこれから追加するカードの数も勿論分かりませんので。

 

これで2つの状態における累積報酬Gが求まりました。

プレーヤー:13 & ディーラー:8⇒-0.38

プレーヤー:18 & ディーラー:8⇒-0.2

 

後は、これを次式に従ってQテーブルに反映していくだけです。

(今回はGの中に学習率を反映させましたので、αは掛けなくていいです)

 

このゲームを多数回繰り返せば、18までヒットし続けるという戦略を採用する場合の各状態における価値を見積もることができます。

 

Excelに実装する

そこで、まずは状態価値をまとめたQテーブルを作っておきましょう。

縦にプレーヤーの状態、横にディーラーの状態を採ります。

 

プレーヤーの状態を12から21までしか考えなくてよい理由は、11以下だと自動的にヒットすることになるからです。

ヒットして追加される一番大きなカードはAですが、これを11としてカウントすると22となってバストしてしまいますが、1としてカウントすればよい話しなので、11以下では考える余地なくヒットなのです。

 

次にプレーヤーのカードをシミュレーションするために乱数を生成します。

大抵は3回以内でステイすると思いますが、念のため9回分を生成しておきます。

ディーラーのカードは確定的です。

合計17以上になるまで追加するので、誰がディーラーでも同じだからです。

ですので、これも乱数を生成した上で確定しておきます。

 

ここまで用意したら、報酬を計算していきます。

L列にプレーヤーの合計点が出ていますので、これを見て勝負がつく回を調べます。

プレーヤーは18までヒットしますので、18以上になった回が決着回です。

但し、22以上でバストしてしまうと、ディーラーが手持ちのカードを披露する前に負けが確定しますので、バストの前の回に負けが確定し報酬が決定します。

このように勝負が付く回を「決着回」、報酬が確定する回を「決算回」として区別しています。

 

後は、下記のようにして累積報酬Gを計算します。

 

すると、この勝負では次のようにQ値を更新できます。

すべての状態のQ値の初期値はゼロとしています。

累積報酬G

プレーヤー:12 & ディーラー:9⇒-1.9

プレーヤー:17 & ディーラー:9⇒-1

 

更新Q(学習率:0.2)

プレーヤー:12 & ディーラー:9⇒(1-0.2)×0+0.2×(-1.9)=-0.38

プレーヤー:17 & ディーラー:9⇒(1-0.2)×0+0.2×(-1)=-0.2

 

従って、初期のQテーブルは次のように更新されます。

 

以上を1つのエピソードとし、VBAを使って何度も繰り返します。

10万回繰り返した後のQテーブル(状態価値表)は、次のように更新されました。

 

グラフにしてみるとこうなります。

 

青色のエリアがQ値の期待値がマイナス、つまり負ける確率の方が高い状態です。

概ねプレーヤーの合計値が18未満の状態では、ディーラーの手持ちカードに拘わらず負ける確率の方が高くなっています。

一方、プレーヤーの合計値が18以上であれば、勝つ確率の方が高くなっています。

18以上になればステイするためバストするリスクはなくなり、ディーラーがバストせずに18以上になる確率も高くないため、このようになることは納得できます。

但し、全体のQ値を合計するとマイナスになりますので、「18以上になるまでヒットする」という戦略を多数回繰り返すとプレーヤーは損します。

 

では、この「18」を変えたらどうなるか気になりますね。

15から20まで変えてやってみたところ、一番勝つ確率が高いのは「16」になりました。

 

シミュレーションに時間がかかるため、1万回しか繰り返していません。

そのため先ほどのグラフより粗くなっていますが、傾向は掴めます。

16になるまでヒットし続けますので、16ではステイしますが、16ではQ値はマイナス、つまり負ける確率の方が高くなっています。

これはバストするリスクはゼロですが、余りにも消極的すぎてディーラーの方が大きい数になる確率が高まってしまうためです。

それでも全体的には、この戦略が最も勝つ確率が高くなりました。

 

でも、この戦略は真似しないで下さい。

なぜなら、このシミュレーションではAを11として固定的にカウントしているからです。

本来、Aは1または11のうち、都合の良い数え方ができます。

例えば、手持ちのカードがAと7の場合、Aを11としてカウントすれば合計は18です。

ここでヒットして4が出たとすると22になってバストしてしまいますが、Aを1としてカウントすれば12ですのでバストしません。

このようにAが手元にあれば、合計が大きくてもヒットして冒険できるため、「18以上になるまでヒットする」がセオリーになっています。

今回のシミュレーションでは簡単のため、Aを11として固定的にカウントしているため、より保守的な結果になっています。

 

さて、これまで「??以上になるまでヒットし続ける」という単純戦略について考察してきましたが、各状態によって??を変える戦略の方が勝つ確率が高いのは明らかです。

次回はこれについて強化学習を使ってシミュレーションしてみます。

 

ブラックジャックの必勝法をExcelモンテカルロ法で強化学習したらこうなった