2019年2月27日水曜日

NetLogo関連のブログ記事

ある必要に迫られて、小生がNetLogo(エージェントベーストモデリング向け)の利用に関して、これまでに書いたブログの記事をまとめてみました。

他の方にはほとんど役に立たないかも知れませんが、小生自身が再度エージェント指向モデリングをやる場合の資料的価値はありそうです。

ブログ記事は、一般的に言って、他の人に迷惑にならなければ、参考になる場合があるかも知れません。



「このブログ(sparse-dense byFoYo)」に掲載の記事

◎卒研のレベルを高める手がかり:Multi-level Models In NetLogo 6(その2)
  http://sparse-dense.blogspot.com/2017/02/multi-level-models-in-netlogo-6_22.html
◎クリスマスプレゼントか、NetLogo 6.0リリース(日本語に恩恵)
  https://sparse-dense.blogspot.com/2016/12/netlogo-60.html
◎スマホでマルチエージェントモデリング!
  https://sparse-dense.blogspot.com/2017/07/blog-post.html
◎卒研のレベルを高める手がかり:Multi-level Models In NetLogo 6
  https://sparse-dense.blogspot.com/2017/02/multi-level-models-in-netlogo-6.html
◎Deep Learningのビジュアライゼーション
  https://sparse-dense.blogspot.com/2016/11/deep-learning_18.html
◎マルチエージェントでDeep Learningの基礎
  https://sparse-dense.blogspot.com/2016/12/deep-learning.html
◎Construct a neural network (multilayer perceptrons) using micro:bit
  https://sparse-dense.blogspot.com/2018/06/microbittwo-layer-perceptronxor.html
◎Java 8 ラムダ式の初歩(続き1)
  https://sparse-dense.blogspot.com/2017/05/java-8_81.html  
◎NetLogo
  https://sparse-dense.blogspot.com/2016/11/netlogo.html
◎マルチエージェントシステム NetLogo3D
  https://sparse-dense.blogspot.com/2017/03/netlogo3d.html
◎KAITシンポジウム2016で「現実感のある」エージェント指向モデリングを展示
  https://sparse-dense.blogspot.com/2016/12/kait2016.html

「神奈川工科大学 情報工学科 ブログ」に掲載の記事

◎NetLogoのネットワーク(社会的/電子的)
  http://blog.cs.kanagawa-it.ac.jp/2013/02/netlogo.html
◎Android端末をリモコンとして活用!
  http://blog.cs.kanagawa-it.ac.jp/2012/06/android.html
◎ホタルの季節です
  http://blog.cs.kanagawa-it.ac.jp/2015/06/blog-post_21.html
◎NetLogoの3D機能で再びサボテンを観察する
  http://blog.cs.kanagawa-it.ac.jp/2013/02/netlogod.html
◎情報学部棟(12階建て)からの階段による避難
  http://blog.cs.kanagawa-it.ac.jp/2012/06/blog-post_16.html
◎平成27年度第1回のi-Androidの会が開催されました[5/27]
  http://blog.cs.kanagawa-it.ac.jp/2015/05/271i-android527.html
◎春休みにWebでお勉強(複雑系)
  http://blog.cs.kanagawa-it.ac.jp/2014/03/web.html
◎百円ショップで買ったサボテンにフィボナッチ数列を見る
  http://blog.cs.kanagawa-it.ac.jp/2013/01/blog-post_14.html
◎(続)NetLogoプログラミングのススメ
  http://blog.cs.kanagawa-it.ac.jp/2012/06/netlogo.html
◎NetLogoプログラミングのススメ
  http://blog.cs.kanagawa-it.ac.jp/2012/05/netlogo.html
◎多忙にも余裕を、硬派にも癒しを
  http://blog.cs.kanagawa-it.ac.jp/2012/05/blog-post_04.html
◎i-Androidの会が開催されました(12/24)
  http://blog.cs.kanagawa-it.ac.jp/2015/01/i-android1224.html
◎蝶の山越え:3年セミナーの一場面
  http://blog.cs.kanagawa-it.ac.jp/2014/01/blog-post_30.html
◎(続)6月9日オープンキャンパス研究室公開
  http://blog.cs.kanagawa-it.ac.jp/2013/06/blog-post_10.html
◎通算20回目の情報工学科アンドロイドの会が行われました
  http://blog.cs.kanagawa-it.ac.jp/2013/06/blog-post_5.html
◎段階的に「交通シミュレータ」
  http://blog.cs.kanagawa-it.ac.jp/2013/05/blog-post_24.html

追記:小生による「NetLogoのチュートリアル」は以下にあります:

https://sites.google.com/site/yamlabnetlogo/home


2019年2月20日水曜日

JavaのCompletableFutureによる並行処理

 Javaでは当初から、平行プログラミングが重視されてきました。近年のコンピュータはマルチコア化(メニコア化)が進んでいるので、マルチスレッドによる並列化はさらに重要性を増しています。最近のJavaは、強固なコンカレントパッケージを提供していて、高レベルで、スレッドセーフなコレクションや、スレッドプールを利用できます。これによって、ユーザは、明示的にスレッドを開始することもなく、またロックを使用することもなく、並列プログラムを書くことができるようになってきました。

 ここでは、これらのうちで、FutureクラスとCompletableFutureクラスを取り上げます。下記のJava書籍[1]の第12章には、「マルチスレッドと平行処理」が詳しく解説されています。その中にある例題を参考にして検討します。例えば、以下の図1ような図を描くとします。まず、5角形と8角形をそれぞれ別のスレッドで並行してして描きます。それら両方の描画が完了するのを待って、次に外側に4角形を描きます。この四角形の一辺の長さは、図に示したように、5角形と8角形を描き終わった後に決まるとしています。(短いビデオもご覧ください。)


図1 5角形と8角形を並列に描いた後に、外側に四角形を描く

これらの多角形を描くメソッドpolyDとpolyVを以下のように定義します。
 double polyD(int x, int y, int n, int s)
 void polyV(int x, int y, int n, int s)
  x, yは多角形描画の開始点の座標
  nは頂点の数
  sは一辺の長さ
  polyDは、n * sの値を返します。

 まず、ExecutorとFutureを使ったプログラム(リスト1)を以下に示します。ExecutorService(スレッドプール)を使って、2つの多角形の描画を別々のスレッドへsubmitします。(line 21-23)すると、Futureオプジェクトx1, x2が直ちに返ってきます。したがって、描画を待たずに、両方の多角形の周の長さの和を求める計算(line 25)の開始に向かいます。しかし、ここで、x1.get()とx2.get()が呼び出されていることに注意しましょう。すなわち、このget()は、それぞれの多角形の描画の完了を待つことを意味します。それが終わった後に、外側の四角形が描かれます。(line 26)

リスト1 ExecutorとFutureによる、並列描画+逐次描画

 次に、文献[2]などを参考にして、CompletableFutureを使ったプログラム(リスト2)を以下に示します。これは、上記のExecutorとFutureを使ったプログラムと完全に同じ動作をします。しかし、注目すべきは、これが1ステートメントで完結していることです。Threadプールの利用も、2つの多角形描画の待ちも明示されていません。5角形と8角形の描画のための2つのCompletableFutureが、.thenCombineAsynによって連結され、さらにその後に起こる、四角形の描画も.thenAcceptで連結されています。並行処理部分があるのに、すべてが一気にパイプライン連結されています。なお、line 34は、両方の多角形描画の後に得られる、周の長さの和を計算するラムダ式です。

リスト2 CompletableFutureによる、並列描画+逐次描画
(全体が1ステートメントで完結)

 リスト1も十分明快ではありますが、このリスト2の方が、さらに洗練されたエレガントなプログラムであると言えるのではないでしょうか!別の言い方をすると、リスト1は、「ここで待て。そこで計算して、その結果を使って次の描画をせよ。」という命令的なのに比べて、リスト2は「2つの並行処理が終ったらその結果を使って次の描画を行う。」という仕様的記述だとも言えます。もちろん、状況により、使い分けることになるでしょう。

 リスト1とリスト2の両方に言えることですが、Java8で導入されたLambda Expressionsが重要な役割を果たしていることも再認識できると思います。

 さらに複雑な図2のような並列描画プログラムも、このCompletableFutureを使って書いてみます。これは、図1の描画を2つ横に並べて同時に描かせます。すなわち、さらに多重の並列プログラムになっています。

図2 上記の図1の並列描画をさらに2つ同時に描く

具体的なやり方は色々あるでしょうが、ここではリスト3のように、図1相当のものを2つ、.thenCombineAsyncで連結しました。なお、図1の描画に相当するプログラムは、メソッドCPF(ss)として設定しました。ここで、引数ssは、各図の描画を開始位置を決めるためのシフト量です。(なお、line 43のラムダ式(x,y)->y-xは、念のため、外側の図の開始位置の差を確認し、その値をline 44で表示していますが、特別な意味はありません。)

リスト3 図2を描くためのCompletableFutureを使ったプログラム
リスト3 図2を描くためのCompletableFutureを使ったプログラム(続)

■参考書籍
[1]立木秀樹、有賀妙子著「すべての人のためのJavaプログラミング 第3版」、共立出版
[2]C.S. Horstmann(柴田芳樹訳)「Java SE 8 実戦プログラミング」、インプレス

2019年2月15日金曜日

Reactive Programming with Java 9

In Java 9 and later, a function called Flow API is provided. With this, it is possible to perform Reactive Programming with only the Java JDK. As a result, it is possible to appropriately control events occurring asynchronously in a distributed system or multithreadwithout performing low level programming. I found a nice commentary on this. It is as follows:

“The Reactive Magazine Publisher” by Moisés Macero

This is an easy-to-understand explanation using meaningful examples that actually operate, and there are many values ​​to learn. For example, consider a magazine delivery system consisting of Publisher and Customers (Subscribers, Consumers). There, some customers receive magazines very slowly. Then, since the delivery box of Publisher overflows, the next magazine will need to be dropped from that box. In this way, Publisher will react according to the Subscriber's situation.

There are several ways to create such a system or simulator. However, here it is meaningful to high level programming using the Publisher-Subscriber pattern in the above Java JDK. This example allows you to observe the behavior of the system when parameters such as Subscribers' receipt speed, Publisher's box capacity, etc. are changed. If the subscriber is slower than the publisher, it functions like a pull-based system. Conversely, if the subscriber is fast it will be like a push-based system.

I made a visualization to make the behavior of this example easier to understand. The results are shown below. One turtle shown in the figure means one magazine. Please see the execution progress by matching the output text with the figure!
(also see the short video below.)



Please enlarge and see the diagram.






As a conclusion of this article, the author says:
“You shouldn’t be in a rush of applying this pattern in a real project, but it’s great when you know it since it might happen in future that you find a problem for which Reactive Programming fits perfectly: then you’ll gain a lot. “

I agree with this. Thanks again to Moisés Macero!

2019年2月7日木曜日

週刊誌に掲載された 「数学する」歓び

滅多に買わない週刊紙であるが、先日、あることから、一冊の週刊誌(週刊新潮 2019年2月14日梅見増大号)を近くのコンビニで購入した。その中に、ちょっと目を疑うようなタイトルの記事が掲載されていた。"「数学する」歓び"という題の特別読物である。若き独立(数学)研究者による4ページの随筆である。

大衆向け週刊誌で、タイトルに"数学"という用語が含まれる記事は、これは滅多に出現しないであろう。だから驚いた。その記事は、「機械を使った人間の知能の模倣」と「人間の思考を機械に似せること」、そして、「無意味の世界」と「意味を見出そうとすること」などについて一定の説得力で書かれていた。「人工知能」がこれだけ注目されているこの現代に、もっと深く考えさせられることがあるのかも。