えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

最弱AIに負ける方法を接待オセロのプロが解説します!

追記:より弱いオセロAIがあります。こちらはこの記事の戦法が通じないので、間違いなく強い(弱い)です。

皆さんこんにちは。自称「接待オセロのプロ」です。

この記事では、数ある手から最も弱い手を選択し必ず相手を勝たせてしまう最弱AIから負けを奪取するために心がけていることを解説したいと思います。

オセロの実力がなくて困っている?大丈夫です!

この記事を読んだあなたなら、オセロの実力を問われたらこう返せばいいのです。

「私は誰にも負けることができます。接待のプロです」

注)これはあくまでこうやったら負けられますよーという記事であって、オセロの戦術解説には全く役に立たないので、ネタとして楽しんでもらえると嬉しいです。私に「~したほうが手数絞れていいですよ~」などと言われても素人なので分かりません。

「最弱オセロAI」とは

最弱オセロAIとは、「にゃにゃん」こと山名琢翔氏が作成したオセロAI「egaroucid」のレベル-1のことです。

彼は、スピードキューバー兼メイカーの大学生で、ものづくりを始めたら2週間程度で一般工学大学生が1年かけて完成させるクオリティの作品を完成させてしまういわゆる「超人」です。

残念ながら公開されているプロフィールだけで記事1本分の分量に到達してしまうため、これ以上は書きませんがぜひプロフィールページにアクセスしてみてください。

Twitterはこちらから↓

twitter.com

GitHubはこちらから(プロフィールページのGitHub.io)↓

github.com

このオセロAIはオセロAI界のランキング戦で世界10位に到達したことのあるつよつよアルゴリズムとその判断の速さが特徴です。

アルゴリズムはサイトで説明されています。以下引用です。

このAIはminimax系ゲーム木探索アルゴリズムであるNegascout法を主体に、葉ノード付近ではNegaalpha法に切り替えて高速化しています。move orderingを行う場合は開放度のようなものを用いています。

オセロの状態管理には完全インデックス化を用いています。完全インデックス化は配列やビットボードよりも高速に処理できます。

評価関数には、列や行のパターン、石数、着手可能数、各マスの重み、確定石数、潜在的着手可能数を正規化したものの重みつけ和を使っています。

そして、レベル「-1」とは探索アルゴリズムの最悪手(=最低評価値)を採用するモードのことで、できる限り負けようとします。むしろ負けるほうが難しいレベルです。

2021年8月23日現在、以下のサイトから遊ぶことができます。ちなみに、レベル1からなかなか強いので勝つことがなかなかできません…

www.egaroucid.nyanyan.dev

最弱オセロAIの「必敗法」とは?

最弱オセロAIに負ける方法…「必ず負ける立ち回りをする」といえばシンプルかもしれませんが、表現があいまいですよね。(必ず勝つ立ち回りとあまり変わりません…)

そこで、最弱AIの立ち回りを研究する必要があります。

ゲーム画面の簡単な説明

ここでゲーム画面の簡単な説明図を示します。実際、数回やってみればすぐ分かるくらいには簡単です。

(間違っていたら、本人がマジレスするはず)

ここでは、黒の石がプレイヤー、白の石がAI側とします。

f:id:Ray_ar:20210823193418p:plain

相手の様子を観察

先ほどの説明図を見て、G4に黒を置きましょう。すると…?

f:id:Ray_ar:20210823194156p:plain

次はH4に置きます。

f:id:Ray_ar:20210823194731p:plain

相手はC3とC5にしか置ける場所がないので、C5を選択します。

この4手を見ると分かりますが、オセロAIはずっと私の置ける場所は多いのに、相手の置ける場所が少なくなるように立ち回っているように見えます。

強いAIは対戦相手の手札を不利な方に絞ってAI側の手札を増やすことで優位に立てるようにしています。その逆の評価をとるということは…

おそらく「相手の有利な手札を増やしてAI側はより不利な手札を引かざるを得ない状況」にしようと立ち回っているのでしょう。(いや本当のことはわからんけど)

どう立ち回るべきか

ここで私はこう考えました。

「負けるようにAI側が手数を絞るのなら、逆転しかできないように立ち回ろう」と。

次は立ち回り方と置いたほうがいい場所・できるだけ置かないほうがいい場所について説明したいと思います。

マークすべき点

相手に逆点させるためには端やAI側が逆転不可能になってしまう手は打ってはいけません。

最弱オセロAIはできる限り逆転しやすい手を避けるために、端に打つことを避けます。そのため、最終局面になってもできる限り端は取らないようにしましょう(右下図)。左下図に示す四隅はもってのほかです。

f:id:Ray_ar:20210823202545p:plain

さて、右上の12-30の場面で打つべき場所はどこでしょうか❓

端は避けるべきなので、できる限り中央に近い位置に置きましょう。

左下図の★の場所に置くとよさそうです。AI側がすぐに逆転できる態勢を維持し続けることがコツです。ただし、▲が示す場所に置くと、D5・E5・F5の石がAIに取られなくなってしまうので、避けるべきです。

また、右下図のように四隅付近に石を置くと、相手の四隅への誘導ができるため終盤になって相手に逆転を強制させることが容易になります。ただし焦りは禁物です!

f:id:Ray_ar:20210823205606p:plain

実際の立ち回り

実際に負けたときの立ち回りを解説します。

1. ルーズベルトを作る

私の序盤の立ち回りはほとんどテンプレ化しています。

まず、横に長く作って相手の手札をより多くするために、相手がすぐに石を取り返しやすい隙の多い布陣を作ります。

棋譜C4E3F4G5G4G3H4C5C6B5E6E7G6G7

これを私はルーズベルトと呼んでいます。(大統領?はぁ、なんのことやら)

f:id:Ray_ar:20210823210122p:plain
ルーズベルト

2. ルーズベルト完成後

ルーズベルト完成後はその隙を消さないように注意しながら相手の石を成長させていきます。もちろんAIは端を取りませんので、負けじと端を取らないように工夫しましょう。

f:id:Ray_ar:20210823211024p:plain

終盤になると端を取らざるを得ない場面多くなりますが、できる限り石を取らずにAIに端を取らせる立ち回りをしましょう。具体的には、

  • AIが置いた端の石の隣に置く
  • AIが端に置いてもメリットが少ないように見える(=評価値が低い)配置をする

の2点です。四隅に置かせるように積極的にAIにちょっかいを出していきましょう。

3. 四隅を取らせた後

AIにちょっかいを出しつづけた結果、AIが観念してとうとう四隅を取るようになりました。

f:id:Ray_ar:20210823211655p:plain

これで安心して端を取ることができるようになります。この付近になると、レベル-1なのに評価値が正の値(AI側優位)になります。

しかし、AI側もすぐに負けようと立ち回るので、油断しないようにしましょう。

勝利(敗北)!

とうとう相手を勝たせることに成功しました(?)

この例では、結構僅差ではありますが、ほぼ同じ立ち回りで15石の大差で負けていることもあったので、比較的安定して立ち回れます。

f:id:Ray_ar:20210823212349p:plain

終わり

レベル-1に大差で負けている人もいるみたいなので、そのコツを聞いてみたいです。世界は広い。

そして、絶対に負けるAIも進化してほしいですね~。