Mar 25, 2012

Mac間のデータ移行

物書き用に使っていた白いMacBook MB402J/Aは、使い心地も外見もとても気に入っていたのだが、半年くらい前から、トラックパッドのボタンが固くなって、クリックする度に、引っ掛かった金属片が弾かれたようなガチッガチッという音がするようになり、さらに、たまに固くて押せない(押す位置を変えると押せる、押せないのはどの位置でも起こる)こともあり、ストレスを感じるようになってしまった。
MacBookのバッテリーパックが膨らんで、真上にあるトラックパッドを押し上げて異常が出るというのはよくあることらしく(参考リンク [1] [2] [3] [4])、筆者のMacBookもそれが原因のようで、バッテリーを外して使うと問題が起こらなかったのだが、MacBookは安全設計で電源プラグが軽く外れるようになっているので、バッテリー無しで使うのは危険すぎる。かといって、トラックパッドでクリックしにくい問題だけのために1万円以上かけてバッテリーを交換する気にはなれない。デスクトップ用の外付けのトラックパッドであるMagicTrackpadを購入するという方法もあるが、6,800円するし、もう少しバッテリーが膨らむと全くクリックできなくなるらしいので、そうなったらMagicTrackpadを購入したことを後悔するだろう。マウスを買うのも同じリスクがあるし、筆者は元々マウスというデバイスが苦手なのである。

半年悩んだ末、悩む時間が勿体なく思うようになったので、携帯性を高めるため、自分への誕生日プレゼントと自分に言い訳して、ついにMacBook Air MC969J/Aを買ってしまった。本当はMC968J/Aを買おうとしたのだが、誕生日の前日に慌てて買いに行った日本橋のどこにも在庫が無かった。

新しいMacの電源を入れたら、セットアップウィザードの数画面先で、別のMacからのデータ移行のメニューが出てきた。ネットワーク経由で別のMacから直接コピーするか、外付けHDDのTimeMachineバックアップから取り込むかを選択できたが、ネットワーク経由でコピーし始めると「残り8時間」とか出てきたので、中断してTimeMachineバックアップから取り込んだ。30分くらいで終わった。すると、アプリケーションからDashboardやDockメニューの配置からFinderのショートカットから「最近使ったフォルダ」に至るまで、前のMacの環境が完璧に再現された。起動したら、多用しているスティッキーズのメモが前のMacと全く同じ位置に現れて、感動した。暫くEmacsやらEclipseやらを触っていたが、キーボードとトラックパッドの違い以外、全く違和感を感じなかった。

しかし、1つだけ問題が起こった。iTunesを起動すると、データも設定も全く引き継がれていなかった。DRM(著作権管理)か何かの都合で、パソコン間で自動的にコピーされるのは問題があるのだろうか、と思ったが、ネットで調べてもそんな情報は見つからない。むしろ、どこを見ても、iTunesライブラリもiPodの設定も全て自動的に引き継がれた、「移行アシスタント」完璧すぎる、と書いてある。最初のネットワーク経由の移行アシスタントを電源断で中断したのが悪かったのだろうか、と、Command+Rを押しながら電源ONでMacOSXユーティリティを起動してTimeMachineバックアップからのリストアをやり直したり、Lionの再インストールをやり直したりしたが、同じだった。

5回目の移行アシスタントにはネットワーク経由でユーザーアカウントを移行させたら、iTunesのデータが完璧に引き継がれた。とりあえず全て移行できたので、そういうもんか、と思って、それ以上追究するのを止めたが、数日後、同じ外付けHDDを新しいMacのTimeMachineバックアップにしようとして、原因がわかった。外付けHDDの容量が少ないので、前のMacでも、~/Music/iTunesをTimeMachineバックアップの対象外にしていたのだった。

See more ...

Posted at 21:34 in PC一般 | WriteBacks (0)
WriteBacks

Mar 21, 2012

αβ探索だけのオセロの思考ルーチン作成

前回作りかけだったオセロの思考ルーチンの核として、とりあえず、最も基本的なゲーム木の探索アルゴリズムであるαβ探索を実装してみた。
正確に書くと、前回もαβ探索をしていたつもりだったのだが、バグが取れず、うまく動かなかった。

今日、このページのコードのような形に書き直したら、一発できちんと動いた。
すると、それだけで、特にオセロが得意でない筆者は全くコンピューターに勝てなくなってしまった。

Swingオセロの起動ページ

ソースコード
OthelloApplet.java
State.java
GameTreeNode.java
Evaluator.java

単純なゲーム木の探索ではまともな結果は得られないと思っていたので、局面の良し悪しを決める評価関数をうまく作る取り組みが次に必要だと覚悟していたのだが、今回の目的は強いプログラムを作ることではなくきちんと動く思考ルーチンを作ることであり、筆者にはこれ以上コンピューターの手の良し悪しが分からないので、これで良しとする。

一応、この後評価関数の改良として取り組む予定だった内容をメモしておく。今は隅が取れてたら点数が高いだけの評価関数である。


  • 辺の評価
    "□□●●●●□□"や"□●●●●●●□"は良くて"□●●●●●□□"や"□□□○□□●□"は良くない(最後のは黒の左側に白を置かれると必ず隅を取られる)とかいうやつである。
    辺の攻防で優勢になることを狙う思考ルーチンにしたかったので、辺の状態について細かく評価値を設定したかったが、計算式で書くと結構複雑なので、今回は見送った。
    辺の状態は3^8=6561種類しかないので、事前にテーブル化しておくことが可能であり、計算するのに時間がかからないのである。
  • 序盤と終盤とで思考ルーチンを分ける
    終盤は勝ち負けを読み切ればいいだけなので、細かい評価は要らないのである。
  • 着手可能な選択肢が少なければ評価を下げる
    強い人は相手にパスさせようとすると聞いたような気がする。
  • 「偶数理論」
    よく調べてないが、最後の石を打てると有利という発想によるもので、自分の手番で残りマス数が偶数だったら評価を下げるとか、連続する空きスペースが偶数だったら評価を下げるとかいうことではないかと推測している。
  • 「開放度理論」
    周囲に空きスペースが多い石は、ひっくり返される確率が高いので、評価を下げるという考え方だったと思う。
  • 乱数を加える
    どうせそんなに強くならないだろうから、たまたまいい手を打つ確率が0でないように、おまじないを掛けようと思った。
  • コンピューター同士の対戦
    評価関数の良し悪しを決める方法は、2つの評価関数を対戦させることしか思い付かない。
    乱数の要素も加えて、いくつかの変化可能なパラメーターを用意して、何通りかのパラメーターのセットを用意して、総当たりで何回か(先後入れ替え含め)対戦させて、弱かったセットを捨てて、強かったセットに乱数を少し加えたものを新たな候補として用意し、また総当たりさせる、というのを繰り返していいパラメーターを探す、GA的な方法を考えた。
  • 展開しながらの探索中に全てのノードを残さない
    あまり探索木を広げるとメモリ不足で落ちるので、今はノード数がある程度に達したら計算を打ち切っているが、全体的に評価の悪い部分木は取り払うとか、途中のノードは評価値だけ残して盤面は消すとかして、メモリを節約する方が良い。
  • 未評価の盤面の扱い
    今は評価値の初期値を0にしてるので、評価した局面の評価値が全て負の値だと、反復深化で読み直す時に未評価の手を優先してしまう、怪しい動作になっている。

See more ...

Posted at 22:14 in Java | WriteBacks (0)
WriteBacks