プログラミングの課題。幅優先探索と動的計画法

今日は某プログラミング訓練サイトでアルゴリズムとそれをプログラムしてみた。なにかと苦戦して一日中格闘していた。難しかったけど解けた。アルゴリズムに対する理解と実践がようやく身についてきたような気がする。

 どういう問題だったかというと、「縦Rマス、横Cマスの迷路がある。これの最短手数を求めよ。条件は1<=R<=50, 1<=C<=50,通れるマスは . で通れないマスは#とする。」みたいな問題。問題は下図のような感じ。今回はコードの方は面倒なので載せません。違う機会があったら乗せると思う。

f:id:wanntinntyann:20160724212333p:plain迷路で最短手数を求めるのに有効なのが、「幅優先探索」というのはポンコツの俺もずっと考えてたから理解できるようになった。しかし厄介なのが探索の範囲が広すぎると後半あたりでメモリが激増するところ。上の条件のC,Rの最大値が50までとれてそれに対応するにはメモリが増えすぎないようにしないといけない。最初は幅優先探索だけで解こうとしてそのメモリの問題に苦戦した。そこで「動的計画法」とセットでやれば高速化できてメモリがあまり必要なくなると思たった。

  上の迷路は文字なのでchar型の二次元配列を用意した。それとは別にint型の同じサイズの2次元配列を用意して、探索するごとにどれだけ進んだかをそのint型の配列に記憶していく。コード上ではこんな感じで宣言した。

const int N = 50;

char MAP[N + 1][N + 1];

int MAP2[N + 1][N + 1];

このMAP2配列に答えを逐一記録していく。

MAP2[y][x] = MAP2[一つ前のマスのy座標][一つ前のマスのx座標] + 1;

こういう感じで一つ前の座標の値を再利用してMAP2に記憶していけばかなり高速化できて幅優先探索のメモリも少なくて済んだ。これで解けましたとさ。

2046年の神の国の相続者と滅びゆく者。

最近は大学の勉強も重なり何かと多忙だ。勉強に疲れたら聖書を読んでいる。まだ旧約、新約全部読んでいないので少しづつ読んでる。前置きはこれぐらいにして本題に入りたいと思う。

俺は科学技術の加速度的進歩と聖書の関係性について考えている。科学技術の加速度的進歩について考えてる人はtwitterのフォロー、フォロワーに少なからずいる。けど宗教と絡めて考える人が皆無なのでちょっとつまらない。

今日の記事のタイトルはこの先激しく変化する社会の中でおそらく滅んでいくかもしれない人とそうでない人を考えてみたいと思う。最近Twitterで見るのは「新しい物や技術、価値観を受け入れる人は柔軟でこの先適応して生きていける」というもの。この手の考えはフォロー、フォロワーは賛同してる人が多いように見える。しかし俺は否定する。

何故否定するかというと、道具、娯楽、こういったものは基本的に姿形が変わっていくものだ。目に見える道具や娯楽に熱狂する。逆にこの生き方は自滅の道を歩むことになると確信に近づいてる。悪いと言ってる訳じゃない。俺もゲームは楽しんでるし。ただ軸をそこに置いていると自滅しかねないという事。ではなぜ自滅するか?

 例えば加速度的に道具、娯楽がアップグレードされていく中で、すぐに移り変われるだろうか。一か月前に買ったゲームを諦められるだろうか?その時間はどんどん短くなりいずれ限界が来る。新しいものを受け入れる暇もなくなる。現れては消えていく道具やゲームに熱狂する人間はおそらく自滅するかもしれない。永遠に変わらないものを信仰している人間は逆にそういう世界では幸せに暮らせるんではないだろうか?その一例が神やその口から出る言葉だ。

 スマホはあと何年使われ続けるだろうか。後5年もしたら相当廃れると思う。じゃあ2000年以上前からある聖書の言葉はどうだろうか。5年後になくなると考えられない。10年後、100年後は?俺はなくなるとは思えない。「神の言葉は永遠」というのはあながち間違ってないのかも。今後シンギュラリティに近づくにつれ永遠の幸せを享受するにはなにかしらの「信仰を持つ事」がかなり重要なキーワードになってくる気がする。しかしその信仰は「永遠」の保証ができるかどうかによって全然違うと思う。

聖書の一部を抜粋して終わりにしたいと思う。

ガラテヤの信徒への手紙5章17節~22節

「肉の望むところは、霊に反し、霊の望むところは、肉に反するからです。肉と礼とが対立し合っているので、あなた方は、自分のしたいと思うことができないのです。しかし、霊に導かれているなら、あなた方は、律法のもとにはいません。肉の業は明らかです。それは、姦淫、わいせつ、好色、偶像礼拝、魔術、敵意、争い、そねみ、怒り、利己心、不和、仲間争い、ねたみ、泥酔、酒宴、、その他この類のものです。以前言っておいたように、ここでも前もって言いますが、このようなことを行う者は、神の国を受け継ぐことはできません。

 これに対して、霊の結ぶ身は愛であり、喜び、平和、寛容、親切、善意、誠実、柔和、節制です。これらを禁じる掟はありません。」

数学を使った即席妄想をしてみる。

俺は結構妄想癖が激しい。自分で無くしたものを他人がパクったと仮定して攻撃する妄想、存在しない恋人と一緒に寝る妄想。となりにアインシュタインがいると仮定してナイフでめった刺しにする妄想。したいからするというより連想してて気づいたら妄想してましたみたいな感じ。

 そして今回は数学を使った妄想をしてみたいと思う。断っとくけどこれは妄想なので細かい理論は抜きにしてね。うーん結構難しいんだよね。今日やった数学は複素変数関数の「ローラン展開、留数」をやった。なにか使えないかなー。こうやってぐだぐだブログ書いていくうちに連想していくから安心して。

 ナイフでめった刺し、前にブログで言った「閉曲線C内部にもう一つ閉曲線Aがある。正則関数zが正則なら閉曲線に沿って積分すると両者は等しい」というのがあった。

じゃあこうしよう。

 

アインシュタインを閉曲線Aとしよう。その次にアインシュタインの胴体に閉曲線B,C,D,E,F,Gという大きな風穴を開けてあげよう。たぶんこれで死ぬと思う。でもこれだと面倒だからアインシュタインの中で正則な関数zを持ってきてアインシュタインに沿って積分してあげればアインシュタインのライフは0になって死ぬことになる。今日はもう寝るおやすみ。

f:id:wanntinntyann:20160624010513p:plain

ガウスの発散定理とLTL教会レポート

今日はガウスの発散定理を勉強した。まず数式を書くと

f:id:wanntinntyann:20160619230807p:plain 

という式になる。これを言葉に直すと「体積V内部にあるベクトル場Aの発散をすべて足し合わせたものと、Vの表面Sで観測されるベクトルをすべて足し合わせたものは等しい」という意味になる。数式を文章に直すって結構大変だな。ちょっと変かもしれない。「積分=細かく区切ってすべて足し合わせる」ってイメージでいいと思う。この定理は難しいように見えて当たり前の事なんだって。例えば

「ある湯船の中で三人がおしっこをした時に三人のちんこを網で覆う。その時網から出ていったおしっこの量は三人が出したおしっこの量を足したものと同じ」

って感じになる。この話を聞けば当たり前に感じると思う。それを数式で定義したのが上の式になる。

 

そしてこっちも重要。今日はLTL教会の礼拝に初めて参加してきた。Qちゃん牧師やレイチェルさん竹本さんも結構キャラが濃い人だけど話すと楽しかった。皆優しくていい人たちだった。最近人付き合いが減って精神的にも滅入ってたところがあったけど元気をもらえた。「隣人を愛しなさい」、「低くするものは高くされ、高くするものは低くされる」、「赦し合いなさい」。良い言葉いっぱいあるけどこれを忘れずに日々を歩んでいきたいと思う。攻撃的で獣の俺とはもうそろそろお別れにしないとな。これがLTLの今日の礼拝ライブ。タイムシフトで見れると思うので興味のある人は見てみるといいと思う。「新しい人」ってのが俺。そしてオレンジの服着てるのが俺です。

live.nicovideo.jp

 

ベクトル場の発散(電磁気学)とその他

f:id:wanntinntyann:20160619004545p:plain

今日は数学と電磁気学を勉強した。Cのアルゴリズムとかプログラミングの勉強もしてるけど最近は数学と電磁気学の方が面白い。今日、電磁気学でやったのがベクトル場の発散。次にガウスの発散定理に入るのでその前準備のような感じだった。以前に解析学の本を読んだときに発散の計算法と軽い意味だけは覚えた。意味は「湧き出し」で計算法は

 

という式で計算できる。ベクトル場Fのx,y,z成分をそれぞれx,y,zで偏微分したものを足し合わせるという事。実際の定義式は違うけどxyz座標上ではこれで計算できるらしい。「湧き出し」というのはある場所からどれだけの何か(水とか)が湧き出てるかの流量を表すものと考えていいみたい。風呂を沸かすときとか蛇口とかああいうのが湧き出しと考えていいのかな。イメージしやすいように簡単にペイントで書いてみた。

一番上のイラストの矢印はベクトルね。湧き出しが0でない値を持つときは入ったベクトルと出るベクトルが変わってる。上のイラストの場合向きは同じで大きくなってるで右を正とすれば正の値を持つことになる。湧き出してるって言える。こんな解釈でいいのかな?7割本に書いてあることを言ってるだけだけど。

これからもこつこつ頑張ります。

コーシーの積分表示、繰り返す罪と終わる自分

タイトル通り数学の複素変数関数でその部分を今日大学で勉強した。「領域D内で正則関数zと単一閉曲線Cがあり、その閉曲線内に任意の点aがあると」

f:id:wanntinntyann:20160618020859p:plain

上の式のようになる。」上の式の画像は適当にネットから拾ってきた。これは結構すごい式なのかな?閉曲線内部に点aがありさえすれば左辺の面倒くさい分数の積分をしなくていいから(これはあってるよね)。今はその程度にしか捉えられないけど。これがこの先の数学や物理で役に立つかもしれない。コツコツ頑張ろう。

 

もうひとつ話題。明後日俺は一人暮らしを始める。両親はなんだかんだで俺の事を考えているので家賃分の仕送りはしてくれる事になった。俺は本当に卑怯者だ。詳しい事は言えないけどDVやいろいろ悪い事を子供の頃からやってきた。それでも仕送りしてくれるのは感謝しなくちゃいけないか。母親への暴力や家の物壊したり母親をゆすったりした事は結局謝ってない。このブログに書いてるのも卑怯者だね。結局俺は何度も罪を繰り返す。子供の頃からキリスト教と縁があったのでニコ生でQちゃん牧師の配信をみながら聖書を読んでる。今度の日曜日LTL教会に行くと思う。俺が本当の意味で謙虚に生きていくには十字架等の絶対的な存在の前にひれ伏すしかないのかもしれない。でなきゃ俺は永遠に自分を誇り続け他人を攻撃し続ける。

 

 

複素数のお勉強(とその復習)ついでに少し哲学

今日は数学をやった。難しいねやっぱり。復習も兼ねていうと、コーシーの定理とかいうのをやった。どうやら複素平面上の単一閉曲線に囲まれた正則な関数を積分すると0になる。そしてもう一つの定理が単一閉曲線C1を積分した値と、C1に囲まれたもう一つの閉曲線C2を積分した値は等しいというもの。もしかしたら理解が間違ってるかもしれない。数学は俺が読みたい量子力学の本で道具としてガッツリ使うみたいなのでしっかりやらないといけない。

 そんで話は変わるけどプログラミングをやって数学と物理もやってコンピュータ系の会社にバイトに行く。息抜きにゲームをしたりアニメを見たりする。たまにMADとかの創作もやる。

 そこで正直なところ自分がどこに向かっているのかよくわからない。最近寝る前によく考えるのが、自分が向かってる未来とこの先の俺の人生とどんな夢を叶えるか。そして俺は一体何者でどんな人間か。考えれば考えるほどわからなくなる。

  一応理系の勉強をやってるけど正直プログラマーなりたいとか研究者になりたいとか思ってない。やりたい事をやるって感じかな?その時にやりたいと思った事が研究で対象がはっきりしてればやると思う。けどあくまでその時やりたい事なので研究である必要性は感じない。ゲームやスポーツでもいい。

 おまけ。アイデンティティについて。「自分は何者なんだろう」って考えたときに多くの人はもしかしたら職業や属してる集団なんかを軸にして考えるかもしれない。けどそれって皆時間がたてば変わるものだよね。そこで「どう生きてきたか」ならどうか。それが「俺は何者なのか?」に対する割と的を得た答えなのかなって思った。