SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|

2016-01-06(Wed) 今はさらばと言わせてくれ

  一年ちょっと前、久々にイイと思える「ピュアモルトホワイト」というウイスキーを見つけた。

  もう何年もタリスカーを主力に据えていたが、そればかりではつまらないし、少々割高ということもあり、いわゆる「ハイローミックス」体制の「ロー」側を担ってもらうのにちょうどいいと思っていた。んが、どうも入手性が悪い。一旦ニッカオフィシャルサイトの在庫が復活したので、2本ほど購入したのだが、それが最後。

  どうも、例の朝ドラ「マッサン」の影響で、完全にラインナップから外れたらしい……ったく、長らくウイスキーを愛飲している者からしたら迷惑な話だ。

  ここのところ「タラモアデュー」というアイリッシュを「ロー」に据えていた。コレ、まったくスモーキーさがない。ある意味、逆張りを試すような心づもりだったのだが、やはりというか、どうも物足りない。ガツンとくる感じがないとなぁ。

  そんなことを考えていた年の瀬、リカーマウンテンから郵便でチラシが。なんでも、ウイスキー会員に昇格させてくれるらしい。昇格しても特別よいことはないのだが、ウイスキーの在庫が尽きかけてところで、チラシの中の「フロム・ザ・バレル」が気になりはじめてしまった。そういえば、前からやってみたかったんだよな。ということで、ちょっと離れたリカマンまで買いに出かけてみた。

  ところが「フロム・ザ・バレル」は欠品……んが、その横にあるのは「ピュアモルトホワイト」じゃねぇか!? 思わず、すぐ横で店員と話し込んでいるイカにもニワカという感じの客を押しのけ、瞬時に確保に走ってしまった。タリスカーと併せてお買い上げ。

  画像の説明

  しかしなんだ。一応は手には入ったものの、もう手に入れられないものをやるのは気分がよくない。如何にうまくたって、もう呑めないのだから楽しい気分になれるはずもない。オイラにとって、ウイスキーは特別なイベントではなく、生活の一部なのだ。

  気づけば、値段も3千円弱だった。よく考えたら、タリスカーより単価が高い。なんだかバカバカしくなってきた。

  というわけで「もったいぶった」というよりは「なんだか納得がいかない」という理由で今になってしまったのだが、今日から成敗してくれよう。短い付き合いだったな。今、万感の思いを込めて封を切る。さらばホワイト。さらばピュアモルト。さらば少年の日々。


2016-01-07(Thu) 石取りゲームのAIを作ってみる

  ひょんなことから、いわゆる「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を作ったのは、実はこの布石だったりする。「石取り」にもかかわらず「布石」とはこれ如何に。なんちて。

  実は、いきなり「どうぶつしょうぎ」のAIを作ろうとして、盤面クラスから作り始めたのだが、イザAIを実装しようとしたところで、混乱をきたし、まったく実装が進まず、一度は撃沈していたのであった。

  やはり「設計」は大事ということか。オイラの場合、紙の上でも、頭の中でもなく、全体を表現するような試作品が「設計」に当たるようだ。事実「石取りゲーム」の設計をそのままに、単にルールを追加していったら、いつのまにか「どうぶつしょうぎ」になっていた感じだ。

  遅ればせながら「どうぶつしょうぎ」とは、本将棋のサブセットのようなゲーム。以前から興味はあったものの、駄菓子屋で「どうぶつしょうぎガム」を購入したのがトリガになった。多少なりとも、ウチの小学生のガキが興味を持ったのも大きい。短時間で勝負がつくこともあり、我が家ではプチブームなのである。

  遂には、駄菓子屋を再訪し、追加で10セット入りの商品を「箱買い」した挙句、ガキの友達や、実家に配って布教しだす始末。でも、優にそれくらいのポテンシャルを持ったゲームだと思う。

  画像の説明

  しかし、今回のプログラミングは楽しかった。なんだか、コードが書かれるべき場所に、コードを書いてくれと呼びかけられるような感覚を味わった。なんだろう。時々、小説家や漫画家が、作中の登場人物が勝手に動き出した、などというコメントをするが、まさにそんな感じ。コードが勝手に成長したというか。

  そんなコードはRubyで500行ちょっと。思考部分は、純粋なミニマックス法の実装で、例によって「αβの枝刈り」は含まれていない。思考の深さを4手読みにしたら、オイラはサッサと勝てなくなってしまった。

  ちなみに、思考に与えているパラメータは、駒の価値だけ。「将棋盤の駒」も「持ち駒」も同価値とし、単に「自分の駒の価値の合計」から「相手の駒の価値の合計」を引いたものを「優勢度」とし、それが最も高くなる状態を目標にミニマックスする。

@weight = {
    Lion => 1000,
    Graf =>   60,
    Elep =>   50,
    Baby =>   30,
    Cock =>   70,
}

  実際に対戦してみると「将棋盤の駒」と「持ち駒」を同価値としている都合か、駒を溜め込む傾向があるので、多少、持ち駒の評価点を下げたほうがいいかもしれない。

  実際に作ってみてわかったのだが、持ち駒は任意の場所に打てるため、想定される盤面が爆発的に増え、持ち駒が多くなると極端に思考速度が落ちてしまう。チェスに比べ、将棋は持ち駒のルールがあるせいで、コンピュータが人間を負かす時期が遅れた、というが、なるほど確かに実感できる話だ。

  今回のAIの製作が一段落してから、ふとBonanzaのWikipediaの記事を読んでみたが、棋譜の学習により駒の評価値を最適化する、という以外、意外と素直な戦略のプログラムというように読めた。今回の製作を通じて、電王戦に挑戦するプログラマに共感できたような気がしたのは、なかなか有益だったと思う。

  画像の説明

  さて、そもそも、今回AIを作ってみたくなったきっかけは、ガキと対戦させてみたかったからだったっけ。次は、coffeeスクリプトに移植して、ちゃんとGUIで遊べるようにしてみようかな。

  まずは、Ruby版のコードを置いておく。