2015年01月13日

ウディタリバーシA

tohさん主催のウディタリバーシ企画には気軽に参加できるよ、と前回書きました。
本当にウディタの上級者でなくてもオセロの思考ルーチンを作れるのです。
そのための環境が用意されています。
もちろん大会で好成績を目指すには高い技術も必要かもしれないですが。

今回の記事ではそんな「必ずしもウディタの扱いに熟達していない方」(もちろんぼくもそうです)にむけて、思考ルーチンの作り方やぼくの考えたこと、やったことを書きます。
(昨夜の大会で戦ったような方はお恥ずかしいのであまり見ないでほしいような気もしますが。)

興味のある方はまずtohさんの企画特設ページからゲームデータをダウンロードして下さい。
ウディタの本体も同梱されているので簡単に制作開始できます。

その中のコモンに思考ルーチンサンプルというのがありますね。
それをまず改変しましょう。
これは置く石の位置を決めるコモンです。
自分の番が回ってきたらここで置く位置を決定し、位置番号で返します。

これを開いてもらえれば分かる人はわかると思いますが、意外とシンプルです。
64あるマス全てそれぞれの現状に対して、自分の色の石を置けば何枚ひっくりかえせるかを判定します。(0枚、つまりひっくり返せない時は置けないということです)
それが置けるなら可変DB内の上から順に詰めてに置ける位置番号を記憶させています。
DBが完成したらDBの項目数から0の間のランダムな数をを選び、そこに格納されている位置番号を返す、それだけです。

もちろんランダムだから強くはないですが。
でもたったこれだけの処理で置けない場所に置いてしまったりその他いろいろややこしいことを解決してくれてるんだから素敵ですね。

そこでこれを改造するわけですが。
いちばん簡単なのは64か所を判定する時に条件を付け、特定位置ならそこに即決してしまうことでしょうね。
64回のループの中に
「判定位置が角(を示す番号)の時、置ける石の数が1以上だったら置く位置はそこ!そしてこのイベントは終了!」
そんな処理を挟み込むだけで、角に置けるなら有無を言わさず置いてしまう、あなただけの思考ルーチンが出来上がりです。(角に置けなければランダムに置く)
どうです?意外と簡単じゃないでしょうか?
(今回の記事はウディタのすごく初心者の方は対象でないので、すいませんがご了承ください。)

自分のオリジナル思考ルーチンができたら、それを元からあるランダムに置くルーチンと対決させられます。
4隅に置ける時だけ置く、それだけでも勝率に影響はあるはずです。
統計の好きな方にとってこれって身震いするほど興味深いことだと思いますよ。
自分が好きに設定した思考ルーチンがどれほど戦績に影響するか。
角を取ったら有利と言われますが、ではそれ以外の、例えば左上から右に3下に3(3-cとかいうらしい)ならどうでしょう?ランダムに比べたらやはり負けやすくなるか勝ちやすくなるか、かすかな影響はあるでしょう。
おもしろいですよねー。おもしろくないですかー?

さて、位置によって条件分岐する方法は一番簡単で、角を取れるなら取ろうというのはおそらく戦略としてそんなに間違っていなさそうな気がします。
けれどもその次、さてどうするかという時に技術以前に大きな問題がありました。
オセロのいい手とはどういうものかということ自体がぼくはわかってないんですよね。

正直に言うとこれまでぼくは、常に最大枚数ひっくりかえせる位置に置けばいいのかなくらいに思ってました。
けれども検索して調べたら全然そんなことはないんですね。
むしろ序盤は取りすぎないくらいがいいと書いてあったりする。
そして自分の石が相手の色に囲まれるほどいいという。
そんなこんなをぼくは初めて知りました。
それと、角の隣はやはり置きたくない。

それらに考慮した思考ルーチンをぼくは作りました。
使った要素としては、
・角か、角の隣接マスか、そうでないか
・置く位置に隣接する石はいくつあるか
・石を置くのは何手目か
・何枚ひっくりかえせるか
です。
それに加えて、それらの要素をどう加味して最終決定するかという仕組みも作りました。
だって角の隣に置きたくないとはいえ、他に置けないなら置くしかないのに、もしいつまでも置かなかったら失格になりますもんね。
そのために各要素で加点減点させて最終決定するようにしました。
プログラム用語でそういうのをどう言うのかは知りません。
それらについて上から順に、どうやったかをざっと書きますね。

・角か、角の隣接マスか、そうでないか
愚直に全部条件分岐で済ませました。
角およびその周囲は16マスありますが。
16回の分岐を作り、「もし判定位置がそれに該当したら〜」としました。
もっとスマートな方法もあるんでしょうけどね。
まあコマンドが長くなろうが自分にとって分かりやすいのが一番です。

・置く位置に隣接する石はいくつあるか
位置番号は連番なのにDBにある盤面記録は左から何番目、上から何番目と座標形式になってます。
その値は位置番号を割ったり、%を使って割った余りを求めたりで出せます。
これまた愚直に、その石の隣接位置を示す座標を8回設定し、石があるかを判定しました。
主催者tohさんはそんな時の為に判定座標が盤面から出ていないかを調べるコモンまで作ってくれているのです!その親切設計には感激しました。
周囲8か所に石があるかを判定した結果の合計が隣接石数です。

・石を置くのは何手目か
序盤中盤と局面に応じて打つ手を変えるにはこれを判定しないといけません。
どうしたらいいかわからなかったのでこのコモンの実行回数を数えたんですけどね。
自分の手番が来る度に呼び出されるんだからその回数を数えれば何手目かわかるはずだ、と。
でもtohさんのツイッターを見てたらなんと大会では連戦するというんですね。
それだとコモン内変数が初期化されない!
そこであわててとりみだしてtohさんにどうしましょーとかお恥ずかしいメールを送ったのですが、ゲーム本体で使用されている「石数を表示するための変数」を参照することでなんとか自己解決しました。

・何枚ひっくり返せるか
これは簡単。tohさんが用意してくれてるコモンが自動的に数値を返してくれます。
これをもし自力で作らないといけなかったらぼくはこの企画には参加できなかったと思います。

そしてこれらの要素を使い、石を置く位置としての適切さを比較・判定する仕組みを作りました。
可変DBに数値を置く欄を作って足したり引いたりしました。
角なら+100点、角の隣ならー50点。
局面が30手までならそれに隣接石数を加点。それ以降は返せる枚数を加点。
そんな風にしてみました。

それ以外の要素として、外枠に接する位置(以下外枠といいます)も判定したのですが。
外枠ってちょっとひっくり返されにくそうじゃないですか。
なので優先的に取るようにしたらどうかと思って試したら・・・全然そんなことはなかったです。
「外枠なら取る、そうでなければランダム」という思考ルーチンを作って「ただのランダム」と対戦させたところ、なんと負けてしまいました。

あれ?今思いついたんですが、それなら「外枠ならポイント減点」という機能をつけたらもうちょっと強くできたのだろうか?
見た目的に返されにくそう、という自分の直感を取るか、統計結果を取るか。ですよね。
統計と言ってもその比較対象がランダムかそれともぼくの考えた似たり寄ったりのシステムしかないというのが、その戦術の有効性を推し量るのに効果があるのかないのかも全くわからないのですが。
でもそれににしたってランダム配置にも負けるって、どれだけ弱いんでしょうね。

置く位置を最終決定するには、DB内にある獲得点数の最大値を持つ位置番号を見つけないといけません。
上から順に現在の最大値が参照中の値以下だったら最大値を更新、そうでなかったら何もせず下の項目の判定に移る、ということをしました。
(プログラムを触り慣れた方にはきっとそういうのはあまりに決まり切った手順なのかもしれませんが、ぼくのような素人はいつも手探り・手作りです。)

また、各要素が決定に与える影響力をどうするかや、序盤中盤の切り替わり時も何手目にするか試行錯誤して悩みました。
隣接石数から返す石数に切り替えるタイミングは30手目(自分の15手目)にしました。
それ以前よりもそれ以後よりも一番勝率が高かったからです。
まあそれだって本当に同時に切り替えがいいのかなんて全然わからないのですが。
ひょっとしたら10手目から返す石数を意識し出した方がいいのかもしれないし、終盤まで隣接石数にこだわった方が強かったのかもしれません。
けれど全部の状況を試すわけにもいきませんもんね。

え?全部の状況を試すわけにいかない?
できないことはないとは思います。このゲームデータを改造し、ある変数を徐々に上げていく異なる思考ルーチンで多様な相手と連戦させデータを取り、最適解を求める。それを自動化する。
実行時間はかかりますが半分放置で、ウディタの機能としてはできると思います。
ぼくの技術でできるだろうか。ぎりぎりできそうな気もします。
けれども、意欲は、ない!!!です。さすがにさすがに、そこまでは。

まあともかく、そんなこんなでできたのを昨夜の大会に提出し、見事2勝5敗の戦績をおさめたわけです。
ぼくの作ったコモンは企画用特設ページから入手できるようにしてもらえると思います、いずれ。

ぼくのコモンは強いか弱いかというとまあ2勝5敗という数字で現れる程度なのですが、この思考ルーチン作成に当たっては比較対象が多く欲しいというのは切実に感じたんですよね。
上にも書きましたが、新しい要素を導入してみてそれが勝率アップにつながるのか判定したい時。
勝ったからと言って、その対戦相手の特性に依存したものかどうかの判定がすごく難しいんです。
難しいというか不可能なので、疑心暗鬼にならざるを得ない。
しかも同じ相手でもボロ勝ち、ボロ負け両方起こることすらあるし、なにがなんだかわからない。
そのなにがなんだかわからない中にも一つの参考材料になればという気持ちを込めて、コモンの公開をtohさんにお願いしたという次第です。

さて、そうして大会本番を迎えました。
これ以上は長くなるので(もう十分に長いけど)、その時の模様や感じたことなどは次の記事に書きます。
posted by じゃ。 at 16:50| Comment(0) | 雑文 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: