読者です 読者をやめる 読者になる 読者になる

いものやま。

雑多な知識の寄せ集め

ポーカーのオッズとアウツの話。(その2)

昨日はサイコロの賭けを題材にオッズの基本的な話をした。 今日はポーカー(テキサスホールデム)でのアウツの話と、オッズとの関係について。 アウツ 昨日はサイコロの賭けを題材にしていたけど、実際に考えたいのはポーカーでのオッズについて。 そのとき…

CodeIQ「ディビジョン・ナイン」問題を解いてみた。

CodeIQで出題された「ディビジョン・ナイン」問題。 Rubyで解いてみたので、コードを公開してみる。 問題 問題は以下のとおり: 1から4の数字を使って 桁の整数を作ります。 このとき、9の倍数となるものを考えましょう。 例えば であれば、234、333、441、…

Curses for Ruby。(まとめ)

これまでの各記事は以下から。 インストールと動作確認 Curses for Ruby。(その1) - いものやま。 cursesライブラリの初期化・終了と、構成要素 Curses for Ruby。(その2) - いものやま。 ウィンドウの描画について Curses for Ruby。(その3) - いもの…

Curses for Ruby。(その6)

昨日は文字の入力について説明した。 基本的な内容はこれで終わりなんだけど、出力する文字を修飾したり、色をつけたい場合もあるかと思うので、今日は出力する文字の修飾について説明していく。 出力文字の修飾 出力する文字に修飾をつけたい場合、属性を指…

Curses for Ruby。(その5)

昨日はウィンドウの位置と移動について説明した。 今日は文字の入力について。 文字の入力と入力モード 通常、文字の入力はバッファリングされ、Enterキーを押された時点で初めてユーザプログラムにはデータが渡される。 しかし、それではCUIアプリケーショ…

Curses for Ruby。(その4)

昨日はウィンドウの生成・削除と描画について説明した。 今日はウィンドウの位置と移動について説明する。 ウィンドウの位置と移動 ウィンドウは、位置を変えたりサイズを変更したりすることが可能。 まず、ウィンドウの位置を取得するには、以下のメソッド…

Curses for Ruby。(その3)

昨日はcursesライブラリの基本的な内容について説明した。 今日はウィンドウの生成・削除と描画について。 ウィンドウの生成・削除 ウィンドウは、画面に出力する文字情報を持った矩形の領域。 Cursesでは、ウィンドウに対して文字を追加・削除する操作を行…

Curses for Ruby。(その2)

昨日はcursesライブラリの動作確認まで行った。 今日はcursesライブラリの基本的な内容について。 cursesライブラリの初期化・終了処理 cursesライブラリを使う場合、まず初期化が必要となる。 cursesライブラリを初期化するには、次のモジュール関数を呼び…

Curses for Ruby。(その1)

以前、noteに書いた記事だけど、こちらにも。 CUIのアプリケーションを作るときによく利用されるのが、Cursesというライブラリ。 Rubyの場合、準標準ともいえるcursesライブラリがあり(※1.9.3までは標準添付ライブラリ)、これを使うのが一般的だと思う。 …

Rubyはいいぞ。

昔ブログに書いた記事から。 当時のタイトルは『Rubyとは・・・。』で、書いたのは2005年10月23日。 当時のことを補足しておくと、自分はもっぱらPerlでプログラムを書いてて、Perlのオブジェクト指向機能も知ってた。 で、他に使ってた言語はCとJavaという…

CodeIQ「ロング・ロング・ストリング」問題を解いてみた。

CodeIQで出題された「ロング・ロング・ストリング」問題。 自分もRubyで解いたので、コードを公開してみる。 問題 問題は、以下のとおり: 自然数 に対して、関数 を、( の 乗)を 10 進数で表したときの桁数と定義します。 例えば、 ですので、 です。同様…

強化学習とニューラルネットワークを組合せてみた。(その15)

昨日は関数近似にHMEを使ったSarsa()法の実装を行った。 今日はそれを使って実際に学習を行ってみる。 HMEの構成 学習を行うにあたって、HMEの構成は、TD Learning of Game Evaluation Functions with Hierarchical Neural Architecturesとほぼ同じ構成にし…

強化学習とニューラルネットワークを組合せてみた。(その14)

昨日は関数近似のためのHMEの実装を行った。 今日はいよいよHMEを関数近似に使ったSarsa()法の実装。 ファイルの整理 ただ、いざ実装しようと思うと、違ってくるのは関数近似の部分だけで、それ以外はまったく同じ。 なので、ちょっとバカらしい感じが。 そ…

強化学習とニューラルネットワークを組合せてみた。(その13)

昨日はゲートネットワークの実装を行った。 今日はそれを使って関数近似のためのHMEの実装を行う。 ValueHMEクラス 関数近似のためのHMEをValueHMEクラスとして実装していく。 #==================== # value_hme.rb #-------------------- # 価値ベクトルを…

強化学習とニューラルネットワークを組合せてみた。(その12)

昨日はHMEを強化学習の関数近似に使うときの勾配計算について説明した。 今日からは実際にRubyで実装を進めていく。 まずはゲートネットワークの実装から。 GateNNクラス ゲートネットワークをGateNNクラスとして実装していく。 #==================== # gat…

強化学習とニューラルネットワークを組合せてみた。(その10)

昨日はドロップアウトの実装を行った。 今日はそれで実際に学習を行ってみた。 中間層のユニット数: 128、ドロップさせるユニット数: 32 まず、中間層のユニット数を128、ドロップさせるユニット数を32にして、1,000,000回、2,000,000回、3,000,000回、学習…

強化学習とニューラルネットワークを組合せてみた。(その9)

昨日は複数のインスタンスを同時に学習するということを試してみた。 これ自体は有効に思われ、あとは複数のインスタンスの出す結果をどうやって統合するのかが課題になった。 その方法の一つとして考えられる、ドロップアウトの実装を行ってみた。 なお、ド…

強化学習とニューラルネットワークを組合せてみた。(その8)

昨日は中間層のユニット数を増やす実験をしてみた。 大体うまく動いていたけど、そこで出た課題として、自己対戦だと局所的な戦略に特化してしまって、他の場面に出くわしたときにうまく動けないことが多いようだった。 そこで、複数のインスタンスを用意し…

強化学習とニューラルネットワークを組合せてみた。(その7)

昨日はパラメータをいろいろ変える実験をやってみた。 結論から言えば、そもそも学習がうまくいっていない感じだった。 そして、論文をちょっと調べてみると、○×ゲームに対して関数近似にニューラルネットワーク(+α)を使うものだと、中間層のユニット数に8…

強化学習とニューラルネットワークを組合せてみた。(その6)

昨日は関数近似にニューラルネットワークを使ったSarsa()法を実装してみた。 けど、うまくいかなかったので、いろいろパラメータを変えてみるということをやってみた。 パラメータテスト パラメータとして調整しないといけないものは、次の4つ: 中間層のユ…

強化学習とニューラルネットワークを組合せてみた。(その5)

昨日はテーブル型のSarsa()法の実装を行った。 今日はいよいよ関数近似にニューラルネットワークを使ったSarsa()法の実装してみる。 NNSarsaComクラス 関数近似にニューラルネットワークを使ったSarsa()法のクラスは、NNSarsaComクラスとした。 #===========…

強化学習とニューラルネットワークを組合せてみた。(その4)

昨日は○×ゲームを人がプレイできるようにするところまで実装した。 今日はテーブル型のSarsa()法を実装する。 SarsaComクラス ということで、さっそく。 #==================== # sarsa_com.rb #-------------------- # テーブル型のSarsa(λ) AI #==========…

強化学習とニューラルネットワークを組合せてみた。(その3)

昨日は強化学習の関数近似として使うニューラルネットワークの実装を行った。 さっそくSarsa()法と組合せたいところなんだけど、その前にいろいろ実装。 Markモジュール まずはマーク(○、×、空白)を表すためのMarkモジュールから。 #==================== …

強化学習とニューラルネットワークを組合せてみた。(その2)

昨日は強化学習の関数近似としてニューラルネットワークを使うときの勾配計算について書いた。 今日はそのニューラルネットワークを実際にRubyで実装してみる。 ニューラルネットワークの仕様 まず、ざっとした仕様を。 構造 3層ニューラルネットワーク 入力…

強化学習について学んでみた。(その22)

昨日はSarsa法によるAIの実装を行った。 今日はQ学習によるAIの実装を行っていく。 QLearningCom さっそくQ学習によるAIの実装を。 #!/usr/bin/env ruby require './tic_tac_toe' require './state' require './value' module TicTacToe class QLearningCom …

強化学習について学んでみた。(その21)

昨日は○×ゲームをプレイできるようにするところまで実装した。 今日はSarsa法を使ったAIを実装していく。 Valueクラス まずは行動価値を表すValueクラスから。 #==================== # value.rb #==================== require './state' module TicTacToe …

強化学習について学んでみた。(その20)

昨日はSarsa法とQ学習の説明をした。 今日からは実際にこれらのアルゴリズムを使って○×ゲームのAIを作ってみる。 ○×ゲーム まぁ、○×ゲームの説明は不要だよね・・・ とりあえずは、○×ゲームをCUIで遊べるようにするところから。 モジュールと定数の定義 とり…

強化学習について学んでみた。(その17)

昨日は方策オン型モンテカルロ制御と方策オフ型モンテカルロ制御について説明した。 今日は、実際にこれらのアルゴリズムを使ったプログラムを書いてみる。 レーストラック 本で練習問題とされているレーストラックの問題を、方策オン型モンテカルロ制御、方…

強化学習について学んでみた。(その15)

昨日はモンテカルロ-ES法による方策の評価と改善を説明した。 今日は、モンテカルロ-ES法で実際にプログラムを書いてみる。 ブラックジャック 本で例として挙げられているブラックシャックのAIをモンテカルロ-ES法で実装してみる。 ブラックシャックはカジノ…

強化学習について学んでみた。(その13)

昨日は方策反復について説明し、実際にプログラムも書いてみた。 今日はもう一つのアルゴリズムについて説明する。 価値反復 方策反復の場合、方策評価の中で何度もスイープを行うので、方策改善が行われるまでに時間がかかる。 なら、1回スイープを行うごと…

強化学習について学んでみた。(その12)

昨日は方策改善について説明した。 今日は、方策評価と方策改善を使って実際に学習を進めていく方法について。 方策反復 方策評価でまず方策の評価を行ったら、次に方策改善で方策の改善を行う。 そしたら、今度は改善された方策で再び方策評価を行い、さら…

強化学習について学んでみた。(その8)

昨日はグリーディ法とグリーディ法を扱った。 強化学習について学んでみた。(その7) - いものやま。 今日はn本腕バンディット問題に対する別のアルゴリズムを考えていく。 ソフトマックス法 グリーディ法では、探査を行うために、の確率でランダムに行動を…

強化学習について学んでみた。(その7)

昨日はn本腕バンディット問題の行動の価値について考えた。 強化学習について学んでみた。(その6) - いものやま。 今日は、それを使って具体的なアルゴリズムを考えていく。 グリーディ法 一番最初に思いつく方法は、現在の推定される行動の価値の中で、最…

強化学習について学んでみた。(その5)

昨日は、n本腕バンディット問題と、「知識利用」と「探査」のバランスの問題について説明した。 強化学習について学んでみた。(その4) - いものやま。 今日はn本腕バンディット問題をプログラム(Ruby)で実際に動かしてみる。 正規分布に従う乱数生成器 …

変種オセロの思考ルーチンを作ってみた。(まとめ)

これまでの各記事は、以下から。 変種オセロの思考ルーチンを作ってみた。(その1) - いものやま。 変種オセロの思考ルーチンを作ってみた。(その2) - いものやま。 変種オセロの思考ルーチンを作ってみた。(その3) - いものやま。 変種オセロの思考ル…

変種オセロの思考ルーチンを作ってみた。(その6)

昨日の記事は、以下から。 変種オセロの思考ルーチンを作ってみた。(その5) - いものやま。 今日は、ミニマックスAIのさらなる高速化を目指す。 アルファベータ法 アルファベータ法の基本的な考え方は、ミニマックス法と同様、「相手が自分にとって一番都…

変種オセロの思考ルーチンを作ってみた。(その5)

昨日は、パフォーマンスを改善して、ミニマックスAIがそれなりのスピードで動くようにした。 変種オセロの思考ルーチンを作ってみた。(その4) - いものやま。 今日はちょっと話題を変えて、千日手の話。 千日手 将棋の場合、何度も同じ局面になってしまっ…

変種オセロの思考ルーチンを作ってみた。(その4)

昨日はミニマックス法を実装したけど、処理が遅いという問題が。 変種オセロの思考ルーチンを作ってみた。(その3) - いものやま。 そこで、今日はパフォーマンスの改善を行っていく。 プロファイル パフォーマンスの改善を考えるときに、まず最初にやらな…

変種オセロの思考ルーチンを作ってみた。(その3)

昨日は貪欲法のAIを作成。 変種オセロの思考ルーチンを作ってみた。(その2) - いものやま。 今日はミニマックス法のAIを作成する。 ミニマックス法 昨日の貪欲法は、「1手読んで、その中で一番いいと思われる手を選ぶ」というもの。 ただ、実際には1手読む…

変種オセロの思考ルーチンを作ってみた。(その2)

昨日はランダムAIを作った。 変種オセロの思考ルーチンを作ってみた。(その1) - いものやま。 今日はもうちょいマシな思考ルーチンを作る。 貪欲AI すぐに思いつくのは、可能な手をそれぞれ実行してみて、その中で一番よさそうな手を選ぶというもの。 「選…

変種オセロの思考ルーチンを作ってみた。(その1)

変種オセロ「良い子悪い子普通の子」については、以下を参照。 変種オセロを考えてみた。(まとめ) - いものやま。 今回は、この変種オセロの思考ルーチンを作っていく。 ランラムAI もっとも簡単なAIは、これ。 実行可能な手からランダムに返すだけのもの…

変種オセロを考えてみた。(まとめ)

とりあえず、まとめ。 これまでの各記事は、以下から。 変種オセロを考えてみた。(その1) - いものやま。 変種オセロを考えてみた。(その2) - いものやま。 変種オセロを考えてみた。(その3) - いものやま。 変種オセロを考えてみた。(その4) - いも…

変種オセロを考えてみた。(その4)

ボードの実装が出来たので、今日は人同士が実際にこのゲームを遊べるようにしてみる。 CUIだけどw 変種オセロを考えてみた。(その3) - いものやま。 ボードの表示 まずは、ボードを表示するためのモジュールを実装。 module YWF module BoardViewer COL_IN…

変種オセロを考えてみた。(その3)

昨日の続き。 変種オセロを考えてみた。(その2) - いものやま。 今日は残りの詳細な処理について。 ボードの実装(続き) 走査メソッド まずおさえておきたいのが、走査メソッド。 # 続き private def traverse_to(row, col, direction, &block) # NOTE: #…

変種オセロを考えてみた。(その2)

ルールは昨日書いた通り。 変種オセロを考えてみた。(その1) - いものやま。 さっそくSwiftで書き始めてもいいんだけど、いきなり書き始めるのも大変なので、まずは書き慣れたRubyで書いてみて、感触を確かめてみようかなと。 ボードの実装 まずはボードの…

ニコニコ動画のダウンロードツールを改良してみた。(まとめ)

これまでの各記事は、以下から。 ニコニコ動画のダウンロードツールを改良してみた。(その1) - いものやま。 ニコニコ動画のダウンロードツールを改良してみた。(その2) - いものやま。 ということで、最終的なコードは、以下。 実のところ、ここまで来…

ニコニコ動画のダウンロードツールを改良してみた。(その2)

昨日の続き。 ニコニコ動画のダウンロードツールを改良してみた。(その1) - いものやま。 今日は、アプリケーション側のコードを実装していく。 中断ファイルの処理 中断ファイルから中断時の情報を取り出す必要があるので、それに関するコードをまず用意…

ニコニコ動画のダウンロードツールを改良してみた。(その1)

ということで、以前作ったニコニコ動画のダウンロードツールを改良し、RTMPで配信されている動画をダウンロードするときにも進捗度合いがわかるようにしてみた。 まず、ニコニコ動画のダウンロードツールをRubyで書いた話は、以下から。 ニコニコ動画のダウ…

Ruby-FFIについて調べてみた。(まとめ)

これまでの各記事は、以下から。 Ruby-FFIについて調べてみた。(その1) - いものやま。 Ruby-FFIについて調べてみた。(その2) - いものやま。 Ruby-FFIについて調べてみた。(その3) - いものやま。 Ruby-FFIについて調べてみた。(その4) - いものや…

Ruby-FFIについて調べてみた。(その4)

残すはFFI::MemoryPointerの話のみ。 Ruby-FFIについて調べてみた。(その3) - いものやま。 OUT引数 Cのインタフェースを設計するときに、関数にポインタを渡し、ポインタを介することで関数の出力を受け取るようにするということがよくある。 例えば、次…