2016-01-01から1年間の記事一覧

pyvenvをactivateすると"parameter not set"とか言われる場合の対処

zshからpyvenvをactivateしようとすると $ source bin/activate deactivate:2: _OLD_VIRTUAL_PATH: parameter not set というエラーになることがあります。これはzshでno_unsetオプションを設定していると起こります。no_unsetオプションを設定したままこれ…

OpenAI GymのPong-ram用資料

OpenAI GymのPong-ram環境用のメモ。 とりあえずメモリアドレスを軽く調べました(趣旨的には解析とか一切なしで解くことが求められているのでしょうけど)。なお、Atari2600は $80-$FF の128 バイトがRAMとなっています(参考: Atari 2600 Specifications)。 a…

Atari2600 Pong 風にぬるっと動いてみるテスト

OpenAI GymのAtariゲーム環境の中にPong-ramというのがあって、ゲーム画面ではなくメモリ内容を直接見られるようなので、Stellaで動かしながらメモリアドレスなどを調べています。 幸いAtari 2600はNESと同じでCPUが6502(正確には機能削減版の6507)なので、…

多層パーセプトロンを書いてみる

前回は単純パーセプトロン(SLP)でAND, ORを学習し、XORは学習に失敗することを確認しました。今回は多層パーセプトロン(Multi Layer Perceptron, MLP)を使ってXORも含めて学習してみます。内容的には高卒でもわかる機械学習の第3回以降に相当します。 相変わ…

単純パーセプトロンを書いてみる

今更感漂うネタですが簡単なパーセプトロンのコードを書いてみたいと思います。高卒でもわかる機械学習というシリーズが非常にわかりやすかったのですが、動くコードがなかったのでそこだけ補完してみようという感じです。 今回は単純パーセプトロン(Single …

ゲームの自動プレイAIに関する妄想

別に上手くなくていいので普通プレイができるAIがあるとTAS制作が色々捗るんだろうなぁと思ったりしてます(まぁ、それが難しいんでしょうけど)。AIだけで人間が作ったTASを超えるのは(ゲームにもよるでしょうが)難しいんじゃないかなと思いますが、逆にテク…

OpenAI GymのFrozenLakeをQ学習で解く

前回はFrozenLakeを自前のアルゴリズムで解いてみました。今回はQ学習をやってみようと思います。 その前に、前回変な結論を出してたので訂正しておきます。前回8x8が通らなかったのは明らかに試行回数不足だと思います。1エピソードあたりの成功報酬が1なの…

OpenAI Gym を触ってみる

OpenAI Gymなる強化学習用プラットフォームを触ってみました(参考: PyConJPのプレゼンテーション)。 インストール自体はpip install gymで一発です(Atariゲームなどを扱いたい場合はpip install gym[atari]のようにサブパッケージをインストールする必要があ…

エミュレータのフレーム境界

NES

FCEUXではフレーム境界がline240(post-render)となっていますが、この理由がよくわかりませんでした。しかし考えてみると、入力更新タイミングとしてはここが適切なのではないかと思いました。 NESゲームの入力処理はNMIルーチン(line241で呼び出される)内で…

SMB1などのムービーがsyncした

NES

まだgithubには反映されてませんが、手元のブランチで主にPPUをFCEUXと一致させる作業中です。とりあえず以下のムービーはsyncするようになりました: HappyLee's NES Super Mario Bros "warped" in 04:57.31 t3h Icy's NES Urban Champion in 00:26.97 アス…

pysdl2でオーディオ再生(コールバック方式)

以前SDL2でのコールバック方式オーディオ再生について書きましたが、同様のコードをpysdl2で試してみました(全コードを置いておきます)。 スレッド間のやりとりには標準のqueue.Queueを使っていますが、これが最適かどうかはよくわかりません。 動かしてみる…

一応APU実装完了

NES

どうにか全チャネルがそれなりに鳴ってくれるようになりました(DMCは以前作ったPCM再生ROMでテストしましたが、本来の使い方であるDelta PCMについてはまだテストしてません)。ただ、ほとんどFCEUXのパクリなので理解度は半分以下です。 NesDevWikiの記述通…

NESエミュレータ(未完成)のリポジトリ作成

NES

とりあえず矩形波と三角波はそれっぽく鳴るようになったので一応リポジトリを作ってみました。ノイズとDMCは未実装です。 まだエミュレーション精度はガバガバです。最終的にはFCEUX互換にしたいですが…。 なお、このプロジェクトはとにかくシンプルでわかり…

SDL2のオーディオ再生

NESエミュレータはどうにか三角波がまともに鳴るようになりました。どうもSDL_QueueAudio()を使っていたのが良くなかったようで、従来のコールバック方式にしたら改善しました。そこで一応コールバック方式での再生について書いてみます(知識ゼロから調べた…

はてなダイアリーから移転しました

いきなりですがMarkdownを使いたかったので移転してみました。なんか横幅の狭いデザインばっかりなのが気になりますが…。スマホの影響なんですかね?

APUむずい

NES

とりあえず三角波だけ実装してみたけど音がおかしい(;´Д`) 音のタイミング自体は正しそうなんだけど凄く耳障りな感じになる…。エミュレーションがおかしいのかWAVEへの変換がおかしいのかよくわからないんですよねー。固定周波数の正弦波を出力する仮想チャ…

bjneのビルドが通らないのを修正

NES

元リポジトリのソースはそのままだとDebian stableでビルドが通らなかったので、一応修正版を置いておきます。ビルドシステムをwafからsconsに変更した*1ので、sconsのインストールが必要です。まあLinuxならパッケージがあるでしょうから許してくださいとい…

APUメモ

NES

APUが1割くらい理解できた(NesDevWikiを読んだだけですが)ので、既存のエミュレータの実装も合わせて少し書いてみます。まずAPUはフレームカウンタを内蔵しており、フレームカウンタはCPUサイクルに連動するシーケンサを持ちます。このシーケンサの動作サイ…

bitfield templateでハマった件

C++

C++ではテンプレートを使ってビットフィールドを実現するというテクニックがあるようです(検索すると色々出てきます)。しかしこれは注意して実装しないとハマるであろう落とし穴があった(私もハマりました)のでメモしておきます(gcc 4.9.2, clang 3.5.0で検…

FC『チャレンジャー』の乱数について

$EA-$EC が乱数、$87D9 が乱数生成器のようです。 $87D9 は乱数更新後に1Pおよび2P入力($10, $11)を加えた値を結果として返すので、適切に2P入力を行うことでかなり自由に乱数調整ができると思われます。ただし乱数が1Fで複数消費される場合は完璧とまではい…

GB『ルクル』testrun

なぜかYouTubeの一覧に出なかったので一応こっちに貼り。超適当プレイです。 地味に良ゲーだけどTASだとどうにも段差の待ち時間がダレるんですよね…。あと最適化を真面目に考えると氏ねそう\(^o^)/たまにスクロールが追いつかなくなって画面ズレが発生する…

ミニパットやってみた

submission movie: nicovideo | youtube4-2はHIO無理でした\(^o^)/ エンコードについて 今回はL-SMASHでmuxしましたが、FPSを手で指定する必要があったり、ストリーミング向けの場合 --optimize-pd を付けた方がいいという話があったり少々ややこしいです(…

FC『内藤九段将棋秘伝』の思考ログをとってみた

この局面のCOM玉の詰み判定がおかしい件について調べ中です(再現用ムービーと棋譜を置いておきます)。まだ思考ルーチンの評価ロジックまでは完全にはわかってませんが、コード自体は大体読めたのでLuaスクリプトでこの局面の思考ログをとってみました。ログ…

FC『内藤九段将棋秘伝』解析中

思考ルーチンを少しずつ読んでます。以下の要素はだいたい読めた感じです: 局面の特徴量計算 候補手生成(1手読み) PLAYER玉詰み判定 後は評価部だけと思われますが、結構いろいろな要素を評価してるのでもう少しかかりそうです。以前COM玉の詰み判定がおかし…

FC『スターソルジャー』のちょっと気になるコード

以前アップされた8面までのスコアアタックTASを引き継ごうかと思って色々調べ中です。今のところコードを読んでるだけですが、気になった点について少しメモ。 CHRバンク切り替え ; マッパー3 CHRバンク切り替え 9F88 : BD 44 D0 lda $D044,x 9F8B : 9D 44 D…

ミニパットのTASが来てる

http://tasvideos.org/5083S.html これ1-5と1-9でHIOが取れなくて投げたんですよね…。やっぱりこのムービーでもできてないようです。 1-5は頑張ればギリギリ近くまでは行けるんですが無理でした。1-9は以前手でプレイしたとき壁と遮断機の間に打ち込むことで…