パスタそばの雑記帳

思ったことや学んだことを少しばかりフレンドリーに書いていく予定です

【所感】python製エージェントベースドライブラリ mesa を使ってみたよ

この記事の立ち位置

mesaを使用してみた体感と感想を織り交ぜた記事です。mesaの使い方については全く触れていませんのでご注意ください。

mesaって何?

mesa(Mesa: Agent-based modeling in Python 3+ — Mesa .1 documentation)とはpythonで作られたエージェントベースドライブラリです。

私もまだよくわかっていませんが、*1エージェントベースドシステムとは、複数のエージェントを動かし、全体としてどのような動作が創発されるかを調べるための手法だと思います。(wikipediaの方が絶対丁寧な説明をしているはずです。)

最近、大学の授業に関連してエージェントベースドシステムを組む必要が出てきたので、自分にとって扱いやすいpython*2でエージェントベースドシステムを組むことができるライブラリを探していたら現れたので使い始めた感じです。

他の要因としてはmesaの日本語記事が少なく、python+マルチエージェントで検索したらこのブログが上位に現れてくれそうだったことも挙げられます(挙げられません)

使ってみた感想?教訓?

作成したプログラム

作成したのは以下の論文で紹介されている、「モジホコリ(粘菌の一種)をマルチエージェントシステムで再現したモデルを改良したよ」という旨のプログラムです。

Wu Y., Zhang Z., Deng Y., Zhou H., Qian T. (2012) An Enhanced Multi-Agent System with Evolution Mechanism to Approximate Physarum Transport Networks. In: Thielscher M., Zhang D. (eds) AI 2012: Advances in Artificial Intelligence. AI 2012. Lecture Notes in Computer Science, vol 7691. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-642-35101-3_3

実は、以前にmesaではない別の非python製ライブラリで、以上の改良モデルのもととなったモデルを作成しようとしたことがあったのですが、動作速度が遅かったり論文の理解が浅くて失敗しています。

作成してみた感想

公式サイト・公式チュートリアル・mesaのソースコード のいずれも他人気ライブラリに比べて分量が少なく、習得しやすいライブラリだなという印象を持ちました。特に、ソースコードについてはエージェントの可視化部分でjavascript・HTMLを利用している以外は python製 で読みやすいものとなっていました。この経験を通してとてもソースコードを読む力が高まった気がします。

ただし、以下のようなクラスごとの役割分けの理解に少し時間がかかりました。

Model (モデルを取り仕切るクラス。このモデルにSpaceやScheduleを紐つけていく)
|-- Agent (モデルの中で動くエージェント)
|-- Space(座標を定義する)
|-- Schedule(時間を定義する)

Modelに紐つけた Space や Scheduleに Agentのインスタンスを紐つけていくことで、ステップごとに各エージェントを動かしたり、座標の指定とかができるようになるという感じです。

また、変数名 space や schedule がライブラリのソースコード内に埋め込まれており、実質予約語のようなものになっていることに気づくのにも時間がかかりました。(間違っていたらごめんなさい)これで lattice_space と agt_space の2種類のspaceを用意したいという私の希望が失われてしまいました、悲しいですね。

さらに、動作速度について、今回作成したプログラムは、「サイズ 200*200 のSpace上で1ステップあたり約10000個のエージェントが蠢き、Space自体も拡散格子を実現するための計算を1000ステップにわたって行う」という規模のものでした。
当初は”拡散格子自体をエージェントとする”方向性で実装していましたが、実行速度が遅かったので numpy を利用する必要がありました。

こんな感じで、mesaの哲学を理解しているわけではありませんが、おそらくmesaの立ち位置はライブラリというよりは"便利になるソースコード群"という捉え方がよいと思います。
ライブラリのソースコードと格闘して、不満な部分は自分で直しながら組み上げていくという感じですね。きっとpython力が大いに上がること間違いなしです。

少なくともこれまでライブラリのソースコードを満足に読めたことがなかった人にとっては、とてもいい勉強材料となるはずです。

*1:いわゆる"つよつよ"の人による「ちょっとだけできる」という謙遜人狼には日々戦々恐々としています・・・

*2:とはいっても、クラス内変数のselfがいまいちよく分かっていなかった

最近勉強したこととか

最近やったこと

やりたいこと

  • Go To キャンペーン
  • 院試の勉強
  • CourseraのSimulation and modeling of natural processes(再開)
  • プロダクトづくり

買いたいもの

  • 無線マウス(手にやさしい形がありがたいです)
  • カニカルキーボード(ピカピカ光る必要はない)

最近勉強したもの

以下の記事を読んだり、実際に手を動かして勉強してみました。

ニューラルネットワーク関係

qiita.com

qiita.com

spjai.com

インフラ?関係

www.slideshare.net

www.slideshare.net

【挑戦記】スケジュール管理をがんばってみた感想

大丈夫です、予定空いてます。

でも、この日○○あるよね?

こんな感じで大学2年くらいまで、まともにスケジュールを立てずに生き、ダブルブッキングをぶちかましまくる恥の多い人生でした。

どうして、義務教育でスケジュールの立て方を教えてくれないのでしょうか(怒)

しかし、そういえば小学生時代には連絡帳・連絡ノートとかに予定とか宿題とかを書いていた記憶があります。おそらく、当時の僕は文科省のモデルケース通りの立派な義務教育生でした。

夏休みの最終日に、何らかの形で宿題が消滅することを願いましたが。

はたして、模範的な義務教育履修生の一員だった私はどうしてこうなったんでしょう?

多分高校時代が原因だと思います

高校時代、「成績さえよければ好きに勉強していいよね」みたいな思想に染まっていました。以下に一例を挙げます。

  • 数学? 宿題なんかより青チャート回したほうがいいじゃん
  • 物理? 宿題なんかより名門の森回したほうがいいじゃん
  • 科学? 問題集より福間の無機化学のほうが分かりやすいよ

イキってますね。

こんな思想のもと3年間過ごしていりゃ、スケジュール管理なんていりませんね。でも、そのせいで受験勉強のスケジュールがごちゃごちゃしました。

(大学)生後1年目、スケジュール管理イヤイヤ期

じゃあ大学1年でスケジュール管理始めろよ

ごめんなさい。無理でした。

というのもいくつか理由があります。

  1. 連絡手段が増えた(先生の話 → メール/SNS/サイト)

  2. "同期"の概念が生まれた(手帳 → PC/スマホ/手帳)

  3. 自分の気分の波が大きい("○○やりたい!"と"○○どうでもいいや"が2,3か月ごとに変わる)

  4. 痛い目を見るまで必要性を感じなかった

特に、3, 4のメンタル面の理由は大きいものでした。スケジュール管理をすること自体が3日坊主になってしまっては元も子もないです。

完璧主義を患っているので、1日サボると「もう捨て~」になったり、少しでも使いずらいと「なら初めからやらなければいいじゃん」になるんですね。

スケジュール管理、イヤ

精神的に退化してない?

夏休み、時間はたっぷりあったよね?

ごめんなさいごめんなさいごめんなさいごめんなさい。何にもしてないです。1日の記憶がないです。起きて食べてゲームしてネットして食べて寝てました。本当にごめんなさい。え、もう何週間も経ったんですか?ごめんなさいごめんなさいごめんなさいごめんなさい。僕は悪い子です。

哀れですね。

スケジュール管理というか自己管理の問題でもありますが、大学の長期休暇をフイにしました。

もともと、小学生時代から「長期休みになんにもしない問題」に気づいていたものの、特に気にも留めていませんでした。

しかし、世はまさに大学生時代。有意義な時間を過ごさなければいけません。

じゃあ現在はどうなのさ

現在は何とかいくつかのツールを使用用途をガッチガチに固め、自分に甘くなることでスケジュール管理を行うようになりました。

「国家公務員総合職とか東大院とかに行きたい!でも、研究もちゃんとしたいしインターンも行ってみたい!」って希望があると、どうしてもスケジュール管理が必要ですからね。

少々やりたいことが多すぎる気もしますが。

そんな感じで現在のスケジュール管理体制を晒します。誇れるものではないです。

入力

  • Gm○il、大学のメール
  • Sl○ck、L○ne
  • 口約束
  • やりたいこと

中間処理(タスク管理)

  • Tr○llo(期限までの時間でタスクを分けています)

出力(スケジュール管理)

  • Go○gleカレンダー(PC版、スマホ版しっかり入れました)

そんでもって、スケジュールの記入や見直しは日曜の夜くらいに一括して行うようにしました。

こうすることで、毎日のしんどさから解放されます。たぶんね。

スケジュール管理道の黒帯を目指して

スケジュール管理、タスク管理のコツがあったら教えてください。飽きっぽい人でもできるようなものなら最高です。

みなさんもスケジュール管理を頑張っていきましょうね。

【日々思うこと】近未来SFは孤独なんじゃないか説

この文章はSF作品にお世辞にもたくさん触れたとはいえない私が、独断と偏見が混ざることを覚悟しながら書いた文章です。もし、「お前の見識せめぇよ!」と思いましたら、おすすめのSF作品を投げつけてください!

近未来SFはいいぞ

 いきなりですが、僕は近未来系のSF作品が好きです。 "近未来系のSF" といっても、これは僕が勝手にカテゴライズしたもので、例えば「電気を操る女子中学生と超能力を無効化する右手を持つ男子高校生が活躍するバトル作品」や「魔法と体術に長けた妹大好き系お兄様のバトル作品」、「デトロイトで生きるアンドロイドが自我をもつゲーム作品」とかがこれに含まれます。

おそらく、

  1. 近未来の乗り物・制度・都市の描写がある
  2. 物にたよらず自分の能力で物語が進む
  3. 人間関係がそんなにギスギスしない

このような要素がある作品が僕好みの "近未来系のSF" になると思っています。(厳密にジャンル分けをすると、サイバーパンクに入るのでしょうか?)

個人的な近未来SFのジャンル分け

 さて、僕好みの "近未来系のSF" からは一旦離れ、近未来SFの個人的なジャンル分けについて書いていこうと思います。近未来SFといっても僕は2パターンのSFがあると思っています。すなわち、

  • ライトな近未来SF (登場人物が死なない、血が流れない、ギスギスしない、代表作:「ドラ■もん」)

  • ダークな近未来SF (登場人物が死ぬ、血が流れる、ギスギスする、代表作:「PSYCH■-PASS」)

この2パターンです。代表作を見ていただけると僕の言いたいことが伝わるかもしれません。あくまで、僕の狭いSF見識ですが、ほとんどのSF作品は作者のメッセージとかを抜きにして、乱暴に作風で分けるとこのパターンのいずれかに収まるんじゃないかと思っています。色的には前者は「白色」「空色」「新緑色」、後者は「黒色」「鉄色」「赤銅色」みたいな感じです。

好きなジャンル

 以上のようにジャンル分けを行いましたが、僕が好きなのはズバリ「ライトな近未来SF」です。やっぱり近未来の描写にワクワクしながら、自分が現実世界で経験することのない豊かな人間関係()を味わいたいんですね。また、登場人物が死んだり、絶望したりする姿を見るのが好きじゃないというのも理由としてあるのかもしれません。もちろん、ダーク近未来SF作品には死をもって極端な視点や考え方を警告したり(華氏451度はいい作品でした)、命や幸福な時間の儚さを伝える作品をたくさんあると思います。でも厳しい現実が嫌いなんですね、僕。やっぱり妄想の中くらい、ぬるま湯の世界にどっぷり浸かってもいいじゃないですか。

画像検索でよく見る絵

 そんなわけで「ライトな近未来SF」の世界を手軽に味わいたいわけですが、その方法は限られます。僕の知る限りでは「画像」「音楽」なら手軽かなと思います。もちろん手軽さを度外視すれば「小説」「アニメ」「映画」なんかがいい方法になるでしょう。ただ、この記事でライトな近未来SFはあくまで「画像」について書いていこうと思います。 さて、go●gle画像検索で「近未来」と検索するとどうなるか・・・はたして僕の好きな「ライトな近未来SF」の絵がずらりと現れてきます。物理法則を無視した建物、山のように積み上がった人工物の森。現実世界では到底お目にかかれないSFそのものです。しかし、そこには何かが足りません。そう、人です。

人がいるはずの場所に誰もいないという恐怖感

僕は一人が好きな性格ですが、それでも世界に僕しかいないという喪失感に耐えることはできません。 僕にとって「人間が誰もor一人しかいない世界」というのは本能的な恐怖感を想起させるものです。さらに、その世界から受ける恐怖感は近未来SF世界特有の風景〈人工物だらけの世界なのに誰もいない〉によって強調されます。もし、スクランブル交差点(勝手に人工物だらけの風景の代表に仕立てあげました)で僕以外の人間が一瞬にして消滅したら・・・いや~キツいです。 だからこそ、画像検索で見かける「誰もいない近未来SF世界」は癒しどころか、より僕の心にダメージを与えてくるんですね。もっとわちゃわちゃした光景が見たい!ですが、そんな画像はなかなか見つからないのが現状です。

近未来でキャラクターがわちゃわちゃしている作品が好き

そんなわけで、「ライトな近未来SF」かつ「キャラクターがわちゃわちゃする」世界にもっと浸かりたいです。近未来の乗り物にみんな仲良く座ってたっていいじゃないですか!謎アトラクションでデートしてたっていいじゃないですか!近未来の住宅とかも見てみたい!

おすすめの作品を教えてください

こんな気持ちを満たしてくれる作品を教えてください!

【ITのお勉強】並列処理?ああ、電圧は同じで電流が分かれるやつだよね

前置き

並行処理と並列処理はお互い対をなす?関係にある概念で、名称が非常に似ているので間違えやすい概念・・・であっているのでしょうか?

とりあえず、現時点で調べて分かったことを忘備録的に書いていこうと思います。つまりこの情報は間違っているかもしれないので、鵜呑みにしないほうがよいですね。(ミスを見つけるつもりでこの記事を読んだほうが絶対理解が深まると思います!(防波堤))

この記事では、

  1. 並行処理と並列処理

  2. プロセスとスレッド

  3. マルチスレッドを使用するときの注意点

についてまとめられればいいなと思います。

並行処理と並列処理

  • 並行処理
    • CPUから見ると、ある時点で1つのプロセッサが1つの仕事をしている。しかし、ずっと1つの仕事をしている訳ではなく、複数の仕事をものすごく高速で切り替えながら処理していくので、人間から見ると、同時に複数の仕事がなされているように見える。
  • 並列処理
    • CPUから見ると、ある時点で複数のプロセッサが複数の仕事をしている。人間から見ても、同時に複数の仕事がなされているように見える。

プロセスとスレッド その1

  • プロセス
    • 1つのプログラム。Windowsなら Ctrl + Shift + Esc の同時押しで動作中のプロセスの一覧を覗ける。作成されたプロセスは他のプロセスのメモリの資源を利用できない。また、新たにプロセスを作成する際のコストは大きい
  • スレッド
    • プロセス内の実行単位。1つのプロセス中に1~複数のスレッドが存在している。作成されたスレッドは親となるプロセスのメモリの資源を共有でき、新たにスレッドを作成する際のコストは小さい

プロセスとスレッド その2

あるプログラムを同時に行いたい場合、次の2つの方法が考えられます

  • 複数のプロセスを作る(マルチプロセス)
  • 1つのプロセスの中に複数のスレッドを作る(マルチスレッド)

ただ、これらの方法には当然のようにメリットとデメリットが存在します。

  1. 複数のプロセスを作る(マルチプロセス)

    • メリット 開発がマルチスレッドに比べればラク
    • デメリット 速度低下、コスト増大、プロセス間通信の複雑化のリスクを抱えている
  2. 1つのプロセスの中に複数のスレッドを作る(マルチスレッド)

    • メリット うまくいけば速度が速くなったり、コストが下がったりする
    • デメリット スレッド間で資源のやり取りをうまく回せるようにすることを考えなければならない
    • 定義
      • NATIONAL INSTRUMENTS 様のページからの引用です *1
      • マルチスレッド処理は、マルチタスク処理の発想をアプリケーションに広げたもので、単一のアプリケーションで特定の操作を個々のスレッドに分割します。各スレッドは並列に実行されます。

マルチスレッドを利用する際の注意点

ここまでの説明の通り、あるプログラムを高速化したいときには

  1. プログラム(プロセス)の中にスレッドをいっぱい作る(マルチスレッド)
  2. たくさん作ったスレッド(仕事)を複数のプロセッサで処理してもらう(並列処理)

をしたいと思うのがプログラマだと思います。

しかし、なかなか思った通りにうまくいかないことが多いらしいです。

その理由として、仕事がそれぞれのプロセッサで打ち合わせなく進んでいることや、共有資源へのアクセスの取り決めが大変なことがあります。また、それらを把握してプログラムを書こうとするとプログラマの負担が大変なことになります。

つまり、基本的には並列処理を控えたほうがプログラムを書くのは楽だということなんですかね?

追記

pythonかなにかで実際に並列処理を実装してみたいですね

参考文献

第1回 マルチスレッドはこんなときに使う (1/2):連載.NETマルチスレッド・プログラミング入門 - @IT

並行処理、並列処理のあれこれ - Qiita

Python高速化 【multiprocessing】【並列処理】 - Qiita

はじめまして

ご挨拶

はじめまして、パスタそばと申します。

この度、まったりと文章を書く機会が欲しいなと思い、ブログをはじめました。

意見の表現場所として有力なのはSNSだと思いましたが、SNSはなんというか現実世界の僕に非常につながりが強くなってしまい、周囲を気にしてしまう性格の僕ではどうしても正直な意見を表明しにくい場所でした。

そんな中、何か思うことを表現する場を探しているうちにブログという媒体にたどり着いたというわけです。

何日継続するか分かりませんが、日々思うこと・やっていることをひっそりとアウトプットしていきたいなと思います。

ホントに借りぐらしの●エッティもびっくりする程ひっそりとしていますね。これも陰キャのなせる業でしょうか。