SVX日記
2016-01-06(Wed) 今はさらばと言わせてくれ
一年ちょっと前、久々にイイと思える「ピュアモルトホワイト」というウイスキーを見つけた。
もう何年もタリスカーを主力に据えていたが、そればかりではつまらないし、少々割高ということもあり、いわゆる「ハイローミックス」体制の「ロー」側を担ってもらうのにちょうどいいと思っていた。んが、どうも入手性が悪い。一旦ニッカオフィシャルサイトの在庫が復活したので、2本ほど購入したのだが、それが最後。
ここのところ「タラモアデュー」というアイリッシュを「ロー」に据えていた。コレ、まったくスモーキーさがない。ある意味、逆張りを試すような心づもりだったのだが、やはりというか、どうも物足りない。ガツンとくる感じがないとなぁ。
そんなことを考えていた年の瀬、リカーマウンテンから郵便でチラシが。なんでも、ウイスキー会員に昇格させてくれるらしい。昇格しても特別よいことはないのだが、ウイスキーの在庫が尽きかけてところで、チラシの中の「フロム・ザ・バレル」が気になりはじめてしまった。そういえば、前からやってみたかったんだよな。ということで、ちょっと離れたリカマンまで買いに出かけてみた。
ところが「フロム・ザ・バレル」は欠品……んが、その横にあるのは「ピュアモルトホワイト」じゃねぇか!? 思わず、すぐ横で店員と話し込んでいるイカにもニワカという感じの客を押しのけ、瞬時に確保に走ってしまった。タリスカーと併せてお買い上げ。
2016-01-07(Thu) 石取りゲームのAIを作ってみる
で、とりあえず、習作として「石取りゲーム」を作ってみることにした。ルールは簡単で、まとめて置いてある数十個の石ころから「1~3個の石を順に取り合い、最後の1個を取った(取らされた)ら負け」というルールである。
単純なルールなので、容易に必勝法に思い至るが、そのロジックをプログラミングしても発展性がない。ここは「ミニマックス法」を採用するべき状況なのである。というわけで、秘蔵のインデックスを検索し「Oh!X1990年4月号」を引っ張り出し、故祝一平氏の連載「C調言語講座PRO-68K」から「第21回 思考よ~ん(その4)」の記事を参照するのであった。ホンマOh!Xは一生もんでっせ。
当記事では「ミニマックス法」よりは「αβの枝刈り」の説明を主としつつも、成果物(コード)には実装しない、というある意味で潔い(?)内容になっているが、内容的には十分に参考になるものだ。とりあえず、記事を参考に「ミニマックス法」をRubyで実装してみた。「αβの枝刈り」は、まぁ、余裕があったらやるということで。
いざ対戦してみると、ゲームのルールがシンプルなだけに、ゲーム開始時の石数が十数個であれば、容易に読み切れてしまうことがわかった。「読み切り」とは、勝負の完了に至るすべてのパターンの把握をいう。それには、えらく複雑な処理が必要かと言えばさほどでもなく、評価関数に至ってはルールをそのまま表した、以下のコードだけ。
149 def evaluate(game)
150 point = 50 # 標準の評価点
151 game.stones == 1 and point = 99999 # 手番後に石の残りを 1 にしたら勝ち
152 point
153 end
コードを置いておく。
2016-01-16(Sat) ラガードのラガードによるラガードのためのレグザ購入
2016年が明けたところで、愛用してきたブラウン管ハイビジョンテレビTH-28D30が微妙な挙動を示し始めた。具体的に言うと、スプラトゥーンを遊んでいる時に、画像が上下にズレたり流れたりするようになってきた。
数年前、実家から液晶テレビを譲り受けたので、TH-28D30は表示遅延ゼロの特性を生かし、ゲーム専用として活躍していたのだが、さすがに限界というトコロか。未だに画質は最高レベルなのだが、8年使えば、まぁいいか、という感じ。テレビ事情について思い返せば、エコポイントとか、ゲームにおける遅延問題とか、Wiiによるテレビ破壊ブームとか、シャープの隆盛と凋落とか、地デジのクソ画質以外の、様々な問題が「すぅ〜っかり全部片付いて」「すぅ〜っかり機能も価格も落ち着いた」ところでのテレビの買い替えということになる。しかも、出始めの4Kを避けてREGZA 43J10をチョイスだ。ある意味、最高の性能を、最低の価格で手に入れられたといえよう。
早速、スプラトゥーンで遊んでみる。極端に遅延が少ないというだけあって、違和感はゼロ。ヘボな腕がそれ以上にヘボにならずに済んでいる。そして、レトロゲーをやれば、すばらしくドットがクッキリと表示されるのである。
実に、ドット絵が起こせるレベルである。ちょっとボケるくらいが味があるという向きもあろうが、個人的にはこのガビガビにドットが見える状態が好きだ。昔からココムったりとか、クレマったりとか、不正会計したりとか、会社としては最低だが、テレビは最高だぞ。ナイスレグザ!
取扱説明書を見ると、中身がLinuxらしいのも気分がいい。ブラウザも付いているので、試しにこのサイトを表示してみたところで、例のゲームが動くか試してみたら……
さて、録画用のハードディスクでも注文するか。気づかないうちに便利な世の中になったもんだなぁ。
2016-01-21(Thu) どうぶつしょうぎのAIを作ってみる
というわけで「どうぶつしょうぎ」のAIを作ってみた。先日「石取りゲーム」のAIを作ったのは、実はこの布石だったりする。「石取り」にもかかわらず「布石」とはこれ如何に。なんちて。
やはり「設計」は大事ということか。オイラの場合、紙の上でも、頭の中でもなく、全体を表現するような試作品が「設計」に当たるようだ。事実「石取りゲーム」の設計をそのままに、単にルールを追加していったら、いつのまにか「どうぶつしょうぎ」になっていた感じだ。
遅ればせながら「どうぶつしょうぎ」とは、本将棋のサブセットのようなゲーム。以前から興味はあったものの、駄菓子屋で「どうぶつしょうぎガム」を購入したのがトリガになった。多少なりとも、ウチの小学生のガキが興味を持ったのも大きい。短時間で勝負がつくこともあり、我が家ではプチブームなのである。
しかし、今回のプログラミングは楽しかった。なんだか、コードが書かれるべき場所に、コードを書いてくれと呼びかけられるような感覚を味わった。なんだろう。時々、小説家や漫画家が、作中の登場人物が勝手に動き出した、などというコメントをするが、まさにそんな感じ。コードが勝手に成長したというか。
ちなみに、思考に与えているパラメータは、駒の価値だけ。「将棋盤の駒」も「持ち駒」も同価値とし、単に「自分の駒の価値の合計」から「相手の駒の価値の合計」を引いたものを「優勢度」とし、それが最も高くなる状態を目標にミニマックスする。
@weight = {
Lion => 1000,
Graf => 60,
Elep => 50,
Baby => 30,
Cock => 70,
}
実際に作ってみてわかったのだが、持ち駒は任意の場所に打てるため、想定される盤面が爆発的に増え、持ち駒が多くなると極端に思考速度が落ちてしまう。チェスに比べ、将棋は持ち駒のルールがあるせいで、コンピュータが人間を負かす時期が遅れた、というが、なるほど確かに実感できる話だ。
今回のAIの製作が一段落してから、ふとBonanzaのWikipediaの記事を読んでみたが、棋譜の学習により駒の評価値を最適化する、という以外、意外と素直な戦略のプログラムというように読めた。今回の製作を通じて、電王戦に挑戦するプログラマに共感できたような気がしたのは、なかなか有益だったと思う。
まずは、Ruby版のコードを置いておく。