English
作ったもの 虹の原理 軍人将棋 ラグランジュ点 3D地震活動 モンテカルロ木探索

作ったもの

興味本位で作ったものを載せるページです。特に研究に関係するものとは限りません。

基本的にはPythonが大好きですが、Javascriptも好きな言語で、特にCanvasを使った可視化に興味があります。

コードについては、 githubに挙げていくつもりです。

虹の原理を調べてみた

雨の時になんで虹が出来るのかというのを目で見て分かりたいと思ったので作りました。

(ソースコードはこちら

可視光は、波長ごとに屈折率が異なります。可視光の波長より十分大きいサイズの水滴に入射した可視光のうち、何回か水滴内で反射してから外に出てくるものが存在します。水滴に対する入射時と反射時に、異なる屈折率で屈折された可視光は異なる方向に散乱されることになります。

一つの光線が入射しただけではそれほど分光されているようには感じませんが、ある特定の方向に散乱される光が強め合い、それが虹色の光となって出てきます。

このコードでは、左遠方から平行に入射した白色光(様々な波長を含む光)が、水滴に入射する際に屈折され、一度水滴内で反射され、再び水滴外に出ていくようすを可視化しました。

前方に入射する白色光は、斜め後ろ方向に強く散乱されて、虹色となることを確かめてみてください。

【操作方法】上下にマウスを動かすだけ。ゆっくり動かすと分かりやすいかも。

スマホの方はここをタップ

こだわりポイント

白色光には様々な波長の光が含まれています。これらの光線を一つ一つオブジェクトとして扱い、水滴と光線との交点を計算するメソッドを作っています。可視化するにあたっては、屈折率とRGBの対応を調べ、実際の見え方に近いように工夫はしました。

ネット対戦できる軍人将棋

2015年夏から2ヶ月くらいかけて、Websocketを使って、ネット対戦できる軍人将棋を友達と作りました。

動機としては、軍人将棋は二人のプレーヤーの他に必ず審判が必要となるため、現実でやろうとすると面倒くさいという点と、ネット上の軍人将棋のオンライン対戦サイトのルールが気に食わなかったという点です。

Herokuを無料で借りてnodejsでサーバを動かしています。ソースコードも公開していますが、非常に分かりにくくなっているため、参考にするのはおすすめできません。今振り返ると、全然オブジェクト指向出来てなくてひどいコードになっているため、保守が面倒です。全く整備してなかったこともあって完全に過疎っていますが、友達同士で対戦する分には十分な機能が備わっています。

こだわりポイント

Websocketをとりあえず使ってみたかったので、インデックスページから意味もなくソケットを繋いで対局部屋の状況を取得しています。それのせいでちょっと遅いのが難点です。対戦申込をすると、ソケット情報がサーバに保管されて対戦相手が見つかるとゲームを開始します。軍人将棋は互いに相手の駒が分からないので、サーバ側で駒を裏返してから対局者に送信したり、対局後は駒を見た状態で感想戦が出来るように棋譜を保存しておき、表向きのまま全部送信するとか、色々工夫はしました。駒を動かすUIでjquery UIを使ってアニメーションを付けたり、駒を全部canvasで扱ってドラッグやスワイプ可能にしています。もうちょっと賢いやり方があるはずなのですが、作り始めたときの知識だとこのぐらいの発想しか出ませんでした。また、スマホプレイにも一応対応したやつを作りました。jquery UIのいいところで、ドラッグとスワイプをほとんど同列に扱うことが出来ました。本当は、ログイン機能だとか、ローカルルールを設定してみんなが自由に部屋を作れるようにするとか、やりたいことはあるのですが、とりあえずはここまでです。

軍人将棋のページを開く

イメージ画像

ラグランジュ点の安定性を調べてみた

こだわりポイント

PythonのNumpyを使って書いています。時間発展は4次ルンゲクッタ法を使っているので精度はまあまあいいです。無次元化しているのでスケール依存性がありません。1000点の小天体をばらまいているのですが、各小天体は変数として、位置2個、速度2個合わせて4個の変数を持っているので、4×1000の行列の時間発展を解くという感じになっています。行列はNumpyの得意分野なので計算自体は一瞬で終わります。(mp4を出力するほうがよっぽど時間がかかる)

地震活動を3D可視化してみた

PythonのライブラリであるPlotlyを使って、日本の地下で起こっている地震を3次元にプロットし、ブラウザ上でインタラクティブに眺めることが出来るアプリケーションを作りました。特別なソフトは必要なく、ブラウザが頑張って動かしてくれますが、PCにそこそこ負担がかかるのでご了承ください。2002年1月~2016年12月までのマグニチュード3.0の地震を16161個プロットしています。

【謝辞】 震源カタログは、国立大学、防災科研等の地震観測データを気象庁がまとめた気象庁一元化処理震源要素を使用しています。感謝申し上げます。

表示する(5MBあります)

イメージ画像

オセロのモンテカルロ木探索AIを作った

Alpha碁に触発されて、モンテカルロ木探索でオセロをするAIを作ってみました。

CPUは全てモンテカルロ木探索で動いています。素人の自分相手には、そこそこ勝ってくれるものになりました。素人の自分では、プレイアウト数を増やすと太刀打ちできなくなりました。たまにレベル3に勝つくらいです。

原始モンテカルロでは、各候補手に対してプレイアウト(ランダムプレイヤーによって勝敗がつくまで対局を行うこと)をたくさん行い、勝率の高い候補手を出力します。モンテカルロ木探索は、勝率の高い候補手に多くのプレイアウトを割り当てることで、効率的にプレイアウトを行うアルゴリズムとなっています。良い手だと思えば、その先の展開を深く読んでいきます。深く読むとそんなに良くないときは、反省して別の手を読みます。最終的にプレイアウト数が最も大きい手を出力します。

最大プレイアウト数を上げていくと、読みの正確性が増すため、それだけ強くなりますが、計算時間も増えます。

レベル4,5について、自分では全く勝てないため、どのくらい強いかが分からないので、強い人は感想を教えてください。

コードは、githubに上げています(MyOthello)。

オセロのページを開く

イメージ画像