オセロのアルゴリズム比較 Part1

おはようございます!にわこまです。今回はpythonでつくった4×4のオセロでアルゴリズムの比較を行いました。

何かご指摘があればご連絡ください!

 

 

スポンサードサーチ


アルゴリズム比較 Part1

pythonで4×4のオセロをつくってみたのは良いけど、これで終わりじゃつまらない。

オセロなどのボードゲームでは結局どのようなアルゴリズムが強いのか?逆にどのようなアルゴリズムが弱いのか?疑問に思いました。

みなさんも1回くらい、どうやったら勝てるのか調べませんでしたか?

 

まずは簡単なアルゴリズムから比較していきます。

 

今回比較したのは以下のアルゴリズムです。

・「ひっくり返す石を多くする」
・「ひっくり返す石を少なくする」
・「自分が打った手に対して相手の打つ手を多くなする」
・「自分が打った手に対して相手の打つ手を少なくする」

これらの比較を行いました。

今回は4つのアルゴリズムですが、これからもっといろんなアルゴリズムを比較していきたいと思います。

pythonで作った(4×4)のオセロの作り方やコードはこちら

 

 

比較しようと思ったきっかけ

この記事を書いたころは、「最弱のオセロ」がニュースに取り上げられていました。

今では「強い」だけでなく「弱い」までにも注目されていることに驚きました。

 

そこで、いろんなアルゴリズムを比較していきたいと思い、検証しました。

 

今回検証した結果がみなさまの役に立てたら幸いです。

 

 

スポンサードサーチ


4つのアルゴリズムを比較

改めてアルゴリズムを紹介します。

・「ひっくり返す石を多くする」
・「ひっくり返す石を少なくする」
・「自分が打った手に対して相手の打つ手を多くする」
・「自分が打った手に対して相手の打つ手を少なくする」

 

上2つのアルゴリズムは、まず現状の盤面で打つことのできるマスを導き出します。そのマス、1つひとつに石を打ったと仮定し、ひっくり返した石の数を数えます。これの結果に応じて手を選びます。

 

下2つのアルゴリズムは、まず現状の盤面で打つことのできるマスを導き出します。そのマス、1つひとつに石を打ったと仮定します。更新された盤面において相手の打つことのできる手の数を数えます。

 

注意
・ひっくり返す石の数や打つことのできる手の数が同数の場合は、配列上1番若いものを選びます。
・よって、同じ組み合わせのアルゴリズムを何回対局させても結果が変わりません。
例:「ひっくり返す石を多くする」VS「ひっくり返す石を少なくする」の対局を行っても、最終盤面や棋譜は全く変わりません。

 

 

対局の組み合わせを紹介します。(1つの組み合わせで先手後手を入れ替えます。)

・「ひっくり返す石を多くする」VS「ひっくり返す石を少なくする」
・「自分が打った手に対して相手の打つ手を少なくする」VS「自分が打った手に対して相手の打つ手を多くする」
・「ひっくり返す石を多くする」VS「自分が打った手に対して相手の打つ手を多くする」
・「ひっくり返す石を多くする」VS「自分が打った手に対して相手の打つ手を少なくする」
・「ひっくり返す石を少なくする」VS「自分が打った手に対して相手の打つ手を多くする」
・「ひっくり返す石を少なくする」VS自分が打った手に対して相手の打つ手を少なくする」

 

6つの組み合わせで、先手後手を入れ替えて計12回の対局の比較を行います。 組み合わせと最終盤面を書いていきます。

・先手「ひっくり返す石を多くする」VS 後手「ひっくり返す石を少なくする」

 

 

・後手「ひっくり返す石を多くする」VS 先手「ひっくり返す石を少なくする」

 

 

・先手「自分が打った手に対して相手の打つ手を少なくする」VS 後手「自分が打った手に対して相手の打つ手を多くする」

 

 

・後手「自分が打った手に対して相手の打つ手を少なくする」VS 先手「自分が打った手に対して相手の打つ手を多くする」

 

 

・先手「ひっくり返す石を多くする」VS 後手「自分が打った手に対して相手の打つ手を多くする」

 

 

・後手「ひっくり返す石を多くする」VS 先手「自分が打った手に対して相手の打つ手を多くする」

 

 

・先手「ひっくり返す石を多くする」VS 後手「自分が打った手に対して相手の打つ手を少なくする」

 

 

・後手「ひっくり返す石を多くする」VS 先手「自分が打った手に対して相手の打つ手を少なくする」

 

 

・先手「ひっくり返す石を少なくする」VS 後手「自分が打った手に対して相手の打つ手を多くする」

 

 

・後手「ひっくり返す石を少なくする」VS 先手「自分が打った手に対して相手の打つ手を多くする」

 

 

・先手「ひっくり返す石を少なくする」VS 後手「自分が打った手に対して相手の打つ手を少なくする」

 

 

・後手「ひっくり返す石を少なくする」VS先手「自分が打った手に対して相手の打つ手を少なくする」

 

 

結果まとめ

A. 「ひっくり返す石を多くする」
B. 「ひっくり返す石を少なくする」
C. 「自分が打った手に対して相手の打つ手を多くする」
D. 「自分が打った手に対して相手の打つ手を少なくする」

A 後手B 後手C 後手D 後手
A 先手×5-112-11(pass)7-9
B 先手11-5 × 7-92-11(pass)
C 先手1-10(pass)5-11 × 2-11(pass)
D 先手5-111-10(pass)7-9 ×

 

私的には、両者passにより2回勝っている4のアルゴリズムが1番強いのではないかなと思います。

 

 

4×4じゃ後手有利

お気づきかもしれませんが、4×4のオセロにおいては後手がめちゃくちゃ有利です。

先手が勝てることはめったにありません。

 

ゆえに、4×4のでは意味がないのではないかと思われるかもしれません。

しかし、圧倒的後手有利の場面で石の差が少ないのは弱いと言えるのではないでしょうか?

また、これが8×8に変わった時どのように勝ち負けが変わるのか興味がわきませんか?

 

 

スポンサードサーチ


まとめ

今回は、pythonでつくった4×4のオセロでどのアルゴリズムが強いか弱いか検証してみました。

アルゴリズムの数が少なくて参考にならなかったかもしれませんが、次をご期待してください。

また、アルゴリズムを組み合わせたり他のアルゴリズムをつくったり検証を続けていきたいと思います。

 

最後までお読みいただきありがとうございます。


スポンサードサーチ