Pietのルール

Pietでは、カラーブロックという同一色の塊からの脱出を繰り返し、その際の色変化で命令を実行する。

どこから脱出するかは、DPとうパラメータで決まる。

DPは上下左右のどれかであって、基本的には最もDP方向に遠い画素から脱出する。

 

候補の画素が複数あることもあるので、その際は、CCというパラメータを参照する。

CCは左か右のどちらかでDP方向を基準に左が右を指す。

候補が複数ある時は最もCC方向に遠い画素を選択する。

 

脱出の際はDP方向に進む。

 

画像の端および黒の画素からは脱出できないことになっているので、こういう場合はDPの回転とCCの反転を繰り返して脱出を試みる。

試行の順番はもちろん定義されているがここでは省略。

 

ここまでで大雑把な挙動については終わり。

 

例外的なカラーブロックとして白いブロックがある。

白いブロックではひたすらDP方向に直進する。DP方向に遠いとか、CCとかは無関係。

白ブロックから出入りするときは命令は実行されない。

白ブロックから脱出できないときはまたDPとCCをいじって脱出を試みる。

 

カラーブロックからどうしても出られなければそこで終了。

 

push命令の際はカラーブロックの面積を参照してpushするようなことが行われるので、インタプリタの実装は若干画像処理的な要素が入ってくる。

ちょっとめんどくさい。

 

Qiitaに記事を投稿した。

Pietインタプリタを自作する

ジャジャガッチ | コンピュータ | 22:36 | comments(0) | - |

難解プログラミング言語Piet

難解プログラミング言語Pietをご存じだろうか。

普通、プログラムのソースコードはテキストファイルだ。

 

Pietは違う。

Pietのソースコードは画像で表現される。

用いる色は全部で20色と決められており、画像中をあるルールで走査する。

その際の色変化に応じてpushやaddなどの命令が割り振られている。

 

そのルール自体はそれほど難しくないので、インタプリタを自作できそうである。

”Piet入門”などとググれば参考になるサイトがいくつも出てくる。

 

実は9割がたインタプリタは出来ているのだが、完成させるには細かい部分を忘れているので、少し復習してここに記事を上げていく。

最終的にはまとめてQiitaにでも投稿したい。

ジャジャガッチ | コンピュータ | 21:40 | comments(0) | - |

Qiita始めた

プログラマ向けSNSとして有名なQiitaに投稿し始めた。

これまでつまみ食いで済ませていた数理統計学を体系的に勉強するということを最近始めて、数値実験の結果をまとめたいと思ったのがきっかけだ。

現在7記事。統計ばっか。

みてちょ。

 

標本平均の期待値が母平均となることを数値実験で確認する

標本平均の分散が母分散/標本サイズとなることを数値実験で確認する

標本分散の期待値が母分散×(標本サイズ-1)/標本サイズとなることを数値実験で確認する

確率分布を特徴づけるパラメータは平均と分散だけではない

標本分散の分散から急に正規分布の話になる理由

標準正規分布の下での2次モーメントの標本分布がカイ二乗分布となることを数値実験で確かめる

十分統計量の値をリサンプリングして母分布の概形を得る

ジャジャガッチ | コンピュータ | 23:27 | comments(0) | trackbacks(0) |

Windows Subsystem for Linux (WSL)

WSLインストールしてみた。

バッチファイル調べながら書くのが面倒すぎて。

 

sudo apt update

sudo apt upgrade -y

sudo apt install build-essential -y

 

これでgccなどが使えるようになる。

ジャジャガッチ | コンピュータ | 23:03 | comments(0) | trackbacks(0) |

Design Spark Mechanical

3DCADを乗り換えた。

これまではPTC Creo Elements。

初めて使った3DCADで、特に問題なく使えていたのだが、少し前から72時間おきのアクティベーションが必須となってしまった。

ちょっとモデル作るか、と思い立ってからのアクティベーション手続きはかなり面倒。

後継の3DCADは30日試用版しかないし、他のを探してみた。

 

Fusion360はかなり評判がいいが、会社で使うのは有償ライセンスが必要っぽい。

会社ではかなりお高い3DCADのライセンスがあるので、わざわざFusion360のライセンスを購入するのは無理。

 

そこでDesign Spark Mechanical。

商用利用も無償で可能らしい。

試しに使ってみた。↓Φ30で直方体をくりぬいてる。なかなか使いやすい。

Creo Elementsより僕には使いやすいかも。

ジャジャガッチ | コンピュータ | 22:58 | comments(0) | trackbacks(0) |

ディープラーニング、1週間ほどいじってみた感想

子どもが生まれる前は自由研究と称して夏休みにしょうもないことをしていたが、流石に幼い二児の父となると自由研究なんてしている余裕はない。

でも何もしないのも寂しいので、自由研究というには程遠いが前から気になっていたディープラーニングをかじってみることにした。

少し前にニューラルネットをC++で自作して、何となく分かった気になったのでフレームワークを使ってもう少し実践的にやってみることにした。

 

最初にgoogleのTensorFlowを試してみたが、ちょっと敷居が高いので断念。

 

次にH2O.aiというやつがコードなしで使えるという話を聞いたので試してみた。

しかし高次元のベクトル推定のようなことをしようと思うと不便なので、やっぱりコードは必須かな、ということでKerasを試してみることにした。

これが素晴らしい。とっても簡単にネットワークを組むことができる。

 

取り敢えず手書き数字のデータ(MNIST)10000個を使って、オートエンコーダ、ディープでないニューラルネット、ディープなニューラルネット(畳み込みニューラルネット)を試してみた。

ディープでないニューラルネットでは正答率64%程度だったものがディープラーニングでは98%以上まで改善した。

色々出来そうな準備は出来たので、ハイパーパラメータをいじったりして遊びたい。

 

勉強していて思ったことをいくつか挙げておく。ただし一週間いじっただけのにわかなので間違ったことを書いているかもしれない。

 

* 手書き数字認識(MNIST)は初めの一歩には敷居が高い

→手書き数字認識はディープラーニングではHello world的な位置付けらしく、どんなフレームワークでも大抵初めの一歩として取り上げられている。ただ、フレームワークのチュートリアルを効率的に進めるためか、学習データを拾ってきて一次元ベクトルにしてみたいな泥臭い作業は単純なメソッドで隠蔽されていたりする。泥臭い作業が隠蔽されているため、どういう形でデータがやりとりされているのがピンと来なかった。これでは実際に使う時困るだろうということで、学習データのダウンロード、画像化、ベクトル化を自分の手で行った。最初の一歩としては手書き数字のような高等な例ではなく、ふたつの正規分布から数値を乱数で取り出し、分類するような例の方がわかりやすいと思った。H2O.aiではまず始めにこれをやった。

 

* 畳み込みニューラルネットの説明がわかりづらい

→単純な全結合ネットのときはニューロン同士の接続の重みを最適化するという話だったのに、次に出て来る畳み込みニューラルネットでは急にフィルタを最適化するみたいな話になっていてわかりづらかった。フィルタとか畳み込みとかいうのはちょっと高等な理解の仕方で、低級な理解の仕方としてはある層のニューロンと次の層のニューロンを距離に依存する形で重み付けするという感じになると思う。その後にフィルタとか畳み込みという話が来ていればわかりやすい気がする。全結合ネットから話が飛びすぎている感があった。

 

* 学習データの用意が大変

→全く未知の問題を学習データなしで解くのは無理で、解きたい問題があったとき、既に解けているパターンを大量に用意できないと正しく学習できない。例えば、自分の好みの女の子かどうかを判定したいと思ったら、あらかじめ自分の好みの女の子とそうでない女の子の画像を大量に用意し、それぞれを好き/嫌いで分類しておく必要がある。これがキツい。シミュレーションで生成出来るようなものならいいんだけど。

 

*何故Python

→何故かディープラーニングではpythonが主流。普通数値計算はC/C++ or Fortranなので戸惑った。仕方ないのでpythonを勉強しながらやることにした。vim scryptもpythonで書けるらしいし覚えても損はないか。

 

ディープラーニングは今のところほぼブラックボックスでなんかふわふわしている技術な感じがする。ブラックボックスというのは、問題が解けたとしても何故解けたかどのようにして解いたかがわからないということだ。文字認識ならどういうところに注目すればよいのかというところが結局よくわからないまま。わからないけど分類できるという。まさに人工知能、目の前に機械仕掛けの脳があり、こちらから質問をして答えてもらうというイメージを持っている。ここが将来改善されることを期待する。今のままディープラーニングに傾倒しすぎると、地に足のついた技術が疎かになり、ディープラーニングの限界が見えてきた時に後悔することになりそう。僕はディープラーニングを研究する予定はないので、あくまでツールとして補助的に使っていければと考えている。

ディープラーニング自体の勉強はほそぼそと継続予定だが、同寺並行でビッグデータ収集の方法についても検討する予定。

 

ジャジャガッチ | コンピュータ | 22:52 | comments(0) | trackbacks(0) |

FightCode

FightCodeというブラウザゲームをやってみた。

javascriptでロボットの行動をプログラムして戦うゲーム。

そうそう、僕がイメージしてたのはこういうやつ!昔あったカルネージハートというゲームもこういう感じらしくて気になる。

 

たとえばこのコードは砲塔を一度ずつ回しながら索敵して視線上に敵がいたら射撃、再度砲塔回転に戻るというもの。


//FightCode can only understand your robot
//if its class is called Robot
var Robot = function(robot) {

};
var n = 1;
Robot.prototype.onIdle = function(ev) //アイドル時
{
    var robot = ev.robot;
     robot.rotateCannon(n);
 };

 

Robot.prototype.onScannedRobot = function(ev) //視線上に敵がいたとき
{
    var robot = ev.robot;
    robot.fire();
};
 

次のように変えると

 

Robot.prototype.onScannedRobot = function(ev) //視線上に敵がいたとき
{
    var robot = ev.robot;
    robot.fire();

    n = 0;
};
 

敵がみつかったら砲塔回転完全にやめて連射する。でもたぶんその後敵見失ったら絶望。

 

これ面白いぞ。

ジャジャガッチ | コンピュータ | 23:13 | comments(0) | trackbacks(0) |

unityで最速降下曲線

unityでサイクロイド曲線にボール転がしてみた。

 

まずサイクロイド曲線のパラメータを決める必要がある。

θ=0で(x,y)=(0,0)とすると

x=A(θ-sinθ)

y=A(1-cosθ)

という式で表される。(0,0)と(x0,x0)を結ぶことにすると

A(θ0-sinθ0)=A(1-cosθ0)

となる。θ0について解けばθ0≒2.41201となる。あとは具体的にx0の値を決めればAも決まる。

x0=-10として次のコードでサイクロイドの座標を生成した。

 

#include <stdio.h>
#include <math.h>

int main()
{
    double theta0 = 2.41201;
    double x0 = -10, y0 = -10;
    double A = y0 / (1 - cos(theta0));

    for (double theta=0; theta<=theta0; theta+=0.05)
    {
        double x = A*(theta - sin(theta));
        double y = A*(1 - cos(theta));
        printf("%e %e¥n", x, y);
    }

    return 0;
}

 

座標データをjwcadに取り込んでdxfファイルに変換し、creo elementsに取り込んで坂を作成した。生成したstlファイルをblenderに取り込んでobjファイルをエクスポートすればunityにインポートできる。

creo elementsに取り込むときの注意としては、ちゃんと坂をワールド原点付近にとらないと、unityで配置するとき苦労する。

スタートゲートは上キーで開くようにした。

    void Update () {
       // Destroy(gameObject);
        if (Input.GetAxis("Vertical")!=0) Destroy(gameObject);
    }

ジャジャガッチ | コンピュータ | 22:56 | comments(0) | trackbacks(0) |

unityに任意曲面データを取り込む

任意曲面でボール転がしてみたいのでまずは3dデータを作りましょう。

まずは3次元の数値データを用意します。

z = √x^2+y^2としました。

 

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

int main() {
    for (double x = -10; x <= 10; x += 0.1)
        for (double y = -10; y <= 10; y += 0.1)
        {
            printf("%f %f %f¥n", x, y, sqrt(x*x + y*y));

        }
}

 

これをMeshで読み込ませた後、

 

Filters/Pointset/Compute nomals for point seets/

 

を実行。次に

 

Filters/Remeshing simpleification and Reconstruction/Surface Reconstruction : Ball Pivoting/

 

を実行してメッシュにします。最後にスムージング。

 

Filters/Smooth ,Fairing and Deformation/Laplacian Smooth/

 

あとは適当な形式で保存すればOK。

 

このままunityに取り込めばいけるかなと思ったが、どうもうまくいかない。

厚みがゼロなのが悪いのかな。

3dプリンタも視野に入れて厚みをつけとくか。

 

blenderにMeshLabから出力したファイルを読み込ませます。

 

左下のボタンでモード変更してエディットモードにします。

aキーを押すと全選択されます。Ctrl-F=>Solidifyで厚みがつきます。

左側にThicknessというウィンドウが表示されるのでここで厚みを変えれます。

あとはobjとかでエクスポートすればOK。

 

あとはunityで取り込んでdefault_MeshPart*のMeshColiderにチェックを入れればOK。テンション上がる!

副産物として3Dプリンタで任意曲面作れるようになった。

次はサイクロイド取り込む?

ジャジャガッチ | コンピュータ | 14:48 | comments(0) | trackbacks(0) |

unityおもろいな

久しぶりにゲーム作りたくなったので、かなり前から話題のunityに手を出してみた。

C#はよく知らないがきっと大丈夫。

とりあえず玉転がしのチュートリアルを飛ばし飛ばしなんとなくやってみた。

すげえ、簡単にゲーム作れそう。

ジャジャガッチ | コンピュータ | 14:07 | comments(0) | trackbacks(0) |
1/6PAGES | >> |

03
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH