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

前回の記事では手持ちカードの合計が??までヒットするという戦法を採る場合、??はいくつになるかを見つけるためにモンテカルロシミュレーションしました。

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

結果は16でしたが、これはAを11として固定的に数えているためです。

Aが手元にあり、かつ11として数えている場合は、バストしそうになったら1として数えればいいのでバストしません。

このようにAを柔軟にカウントするなら、18までヒットすべしというのが良く知られたセオリーです。

(但し、プレーヤーは一人だけで、ディーラーとの差しの勝負の場合)

 

今回は、このような固定的な戦法を採るのではなく、手持ちのカードの合計がいくつで、ディーラーが表にしているカードがいくつの時に、ヒットするのが得か?ステイするのが得か?を強化学習モンテカルロ法により最適解を求めてみます。

但し、カジノのプロを目指すことは目的としていませんので、ルールを簡略化します。

今回もAは11として固定的にカウントしますので、本番では使えない戦法であることをご容赦下さい。

 

前回のシミュレーションとの違い

今回の目的を簡単に言うと次のようになります。

前回は手持ちカードの合計が16とか18になるまでヒットし続けるという方策が決まっていました。

その上で、各状態の価値を何万回もモンテカルロシミュレーションをして見積もりました。

例えば、合計が20の状態は12にくらべて格段に価値が高いことはすぐに分かります。

20だとステイすればほぼ勝ちが見えているからです。

 

それに対して、今回は方策が決まっていません。

従って、各状態でどういう行動をとればどれくらいの価値になるのかを見積ります。

つまり、状態+行動の価値を見積もるのです。

 

上の例で言うと、合計が13の時にステイしてしまうと、ディーラーの数の方が大きくなる可能性が高いので、ヒットする方が勝つ確率が上がりますね。

つまり、この場合は状態が13&8の時には、ヒットする行動の方が価値が高いと言えます。

勿論、ヒットしたらバストして負けてしまう可能性もありますので、何万回も乱数でシミュレーションして、何回勝っていくら報酬を得られるかを調べます。

このようにすれば、各状態+行動の価値を見積もることができるだろうというわけです。

 

これは強化学習の中のモンテカルロ法というアルゴリズムです。

Q学習との違いは、Q学習がステップごとにQ値を更新するのに対して、モンテカルロ法では1つのエピソードが終わるまでQ値の更新を行わないことです。

【はじめての強化学習】Q学習の式をExcelに実装して迷路問題を解いてみた

 

Excelに実装する

それではExcelに実装していきましょう。

まず、プレーヤーのカードを乱数を使って9枚目まで作っておきます。

合計を21にするために9枚も必要ないと思いますが、念のためです。

 

次に、各勝負における累積報酬Gを計算します。

プレーヤーのカードを乱数で作ったように、ディーラーのカードも乱数で作っておきます。

ディーラーは合計17以上になるまで自動的に追加しないといけないので、乱数で確定できます。

この時、1枚目のカードは分かるようにしておきます。

後ほど、「状態」として使いますので。

 

「行動」は1:ヒット2:ステイのいずれかになりますが、これの決め方については後ほど触れます。

基本的に報酬が決定するのはステイしてからですが、ヒットでもバストしてしまえばそこでマイナスの報酬が確定します。

従って、バストしたかどうかも表に書き入れておきます。

これはVBAで行いました。

 

ここまですれば報酬が確定するステップが決まりますので、勝てば+1、負ければ-1がそのステップの報酬となります。

上の例で言えば、第2ステップがそれです。

第2ステップの状態は21&9行動は2累積報酬は1です。

 

第1ステップの報酬は割引率で割り引きます。

今回は割引率を0.2としましたので、報酬は0.2となります。

第1ステップからは第2ステップを経由しないと報酬が得られませんので、累積報酬は両者を足して1.2になります。

従って、第1ステップの状態は12&9行動は1累積報酬は1.です。

 

これで2組の(状態、行動、累積報酬)の値が決まりました。

これを強化学習の下式に代入してQ値を更新します。

 

具体的には、次のような表を作っておいてQ値を更新していきます。

 

先ほど飛ばした「行動」の決め方については、次のようにしました。

 

基本的には各状態でQ値が一番高い行動を採りますが、たまにランダムな行動も採るようにします。

「たまに」の程度はεで決めますが、最初は1からスタートし、シミュレーション回数が進むにつれて小さくなるようにします。

 

各状態におけるQ値の初期値は、すべてヒットが1、ステイが2としました。

そして30,000回の強化学習を行ったところ、次のようにQ値が更新されました。

 

 

Q値の大きな行動が勝つ確率の高い行動なので、各状態で打つべき手は次のようにすべしと強化学習は教えてくれます。

1はヒット!、2はステイ!です。

 

ほぼセオリー通りになりましたが、ディーラーの開示カードが11(A)の時だけ20までヒットすべしという結果になりました。

これはプレーヤーにせよ、ディーラーにせよ、ヒットして追加されるカードの期待値が7.くらいであるためだと思われます。

ディーラーの開示カードが11なら、もう1枚のカードを合せた合計の期待値は18.3くらいですので、プレーヤーが勝つには18でもヒットしないといけません。

またディーラーの開示カードが6なら、もう1枚を合せても合計の期待値は13.3なので、自動的にもう1枚引くことになります。

そうすると、期待値が20.6になるので、プレーヤーはもっとヒットしてリスクを負うべしという結果になったのだと思います。

但し、これはAを11として固定的にカウンティングしているからであって、実際はもっと複雑ですので、この戦法で負けても管理人は責任を負いません。^^