シミュレーションメールマガジン第1回の配信内容です。

配信内容

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
  数理システム シミュレーションメールマガジン
                      https://www.msi.co.jp/s4/
                           2020 Vol.1 ( 2020 年  7 月  21 日 発行 )
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

数理システム シミュレーションメールマガジンでは,汎用シミュレーショ
ンシステム S4 Simulation System やシミュレーションに関する最新技術や
ノウハウ、最新の情報を提供していきます.

++++ [目次] ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ■ <トピック>  メールマガジン創刊のご挨拶
 ■ <トピック>  学生研究奨励賞受付開始しています
 ■ <トピック>  YouTubeに動画をアップしました
 ■ <セミナー>  シミュレーションオンラインセミナー 開催中
 ■ <  tips  >  シミュレーション研究
                (第 1 回 シミュレーションと可視化)
 ■ <  tips  >  psim言語講座
                (第 1 回 M/M/1 シミュレーションを書いてみる)
 ■ <  tips  >  Pythonプログラミング講座
                (第 1 回 (本当に誰でも読める!!) Pythonソースコー
                 ドの読み方)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

*****************************************************************
■ <トピック>  メールマガジン創刊のご挨拶
*****************************************************************

株式会社 NTTデータ数理システム S4 Simulation System 開発責任者の
雪島です。
日頃、S4 Simulation System にご関心頂き、ありがとうございます。
S4 Simulation System は、おかげさまで 2009年のリリースから10年が
経ちました。

DLに代表されるAIの台頭やDXの推進などこの10年の間にシミュレーショ
ン(IT?)を取り巻く環境も大きく変化してきました。シミュレーション
は改善すべき要素の取捨選択をしながらモデルを通して起こり得る変化
の可能性を明らかにし、共通認識の元、意思決定を行うことができます。
このように、ミュレーションは今後ますまその重要性が増してくること
が考えられます。そこで、これまでの製品開発や、受託開発で蓄積され
たノウハウを読者の皆様に共有させて頂きたいと考え、この度シミュレ
ーションメールマガジンを創刊することになりました。

より一層、シミュレーション技術に興味を持って頂けるように、シミュ
レーションに関する最新技術、最新のトピックも随時紹介していきます。
S4 Simulation System が皆様の課題解決や研究に役立てるよう、今後
もユーザ様からの声を反映した製品開発、最新技術の組み込みをしてい
きます。

今後とも何卒よろしくお願いいたします。
                                                     (雪島 正敏)

*****************************************************************
■ <トピック>  学生研究奨励賞受付開始しています
*****************************************************************

S4 Simulation System 学生研究奨励賞は、S4 Simulation System を用
いた学生の学術研究の支援・啓蒙および発表の場の提供を目的とした制
度で、 2014年度より開始されました。
2020年度の募集要項詳細、エントリーは下記URLをご参照くださいませ。
https://www.msi.co.jp/userconf/student/index.html

毎年レベルの高い研究が多く提出されています。
過去のS4 Simulation System学生研究奨励賞は下記URLでご紹介しており
ます。アカデミックの方に限らず、一般の方も是非ご覧ください。
https://www.msi.co.jp/s4/event/stuAward/index.html

                                                     (嶋田 佳明)

*****************************************************************
■ <トピック>  YouTubeに動画をアップしました
*****************************************************************

2020年6月にNTTデータ数理システムYouTube公式チャンネルが開設され
ました。機械学習やAIに関する最先端の技術情報、当社パッケージ製
品に関する情報等、最新のトピックを随時、情報発信していく予定です。
チャンネル登録をどうぞよろしくお願いいたします。

シミュレーション関連動画として、

1. 汎用シミュレーションパッケージ S4 Simulation System の紹介
2. S4 Simulation System 3Dアニメーション機能の紹介
3. S4 Simulation System の Logo 動画を作ってみた

の3本を公開しております。
1, 2 はS4 Simulation System のデモ動画で、S4 Simulation System 
の基本操作や機能について知ることができます。
3は、S4 Simulation System の Logoを20万点のパーティクルで表現して
いる動画です。是非ご覧くださいませ。

[NTTデータ数理システム YouTube公式チャンネル]
https://www.youtube.com/channel/UCGQzzQP-nsZkaxDr4XhC00g

                                                     (嶋田 佳明)

*****************************************************************
■ <セミナー>   シミュレーションオンラインセミナー 開催中
*****************************************************************

Zoomを使用したオンラインセミナーを開催しております。
実際にご自身の手で S4 Simulation System を操作しながら、シミュレ
ーションをご体験頂けるセミナーです。

事前にS4 Simualation Systemをインストールして頂いてから受講して頂
きます。もちろん、聴講だけでもOKです。

【Webinar】S4 Simulation System 紹介セミナー

シミュレーションの入門的な解説や、実社会での活用事例もご紹介致し
ますので、シミュレーションに詳しくない方でも安心のセミナー内容と
なっています。

2020年8月19日(水) 13:30-16:30
2020年9月24日(木) 13:30-16:30

(詳細・お申し込み)
https://www.msi.co.jp/s4/seminar/webinarintro.html


【Webinar】エージェントシミュレーション特別紹介セミナー

シミュレーションの中でもエージェントシミュレーションをピックアッ
プしたセミナーです。社会科学のモデルや、人流シミュレーション等
を体験いただきます。

2020年8月20日(木) 13:30-16:30

(詳細・お申し込み)
https://www.msi.co.jp/s4/seminar/webinarAgent.html

                                                     (嶋田 佳明)

*****************************************************************
■  <  tips  > シミュレーション研究
              (第 1 回 シミュレーションと可視化)
*****************************************************************

ここでは、シミュレーションにまつわる様々な研究をご紹介していきま
す。今回はシミュレーションと可視化技術について、紹介していきます。

コンピュータグラフィックスの分野における、エージェントシミュレー
ションの手法を用いた表現でブレークスルーとなったもののひとつとし
て、Reynolds の Boids(Bird-oid)があります(Reynolds, 1987)。
Boidsのそれぞれのエージェントは alignment(整列:ほかのエージェ
ントと向きを合わせる)、cohesion(引き寄せ:ほかのエージェント集
団の中心に向かう)、separation(回避:ほかのエージェントとの衝突
を避ける)の三つのルールに従います。これらのルールが与えられるだ
けで、エージェント同士がまるで本物の鳥の群れのように集団を形成し
ながら空間上を動くふるまいが自然に作られます。

個体に与えられた単純なルールから、全体のユニークなふるまいが作ら
れる過程を自己組織化(または創発)と呼びます。Boids はそれぞれの
ルールの相対的な強弱によって全体の挙動が大きく変わります。
alignment が強ければ、エージェント同士が向きを合わせながら直進す
るような動き、cohesion が強ければ、エージェント同士がドーナツ型
(トーラス形)に回り続けるような動きが生まれます。鳥や魚の群れで
はこれらに似た行動がよく観察されています。

このような自己組織化的な挙動を示すシミュレーションはアニメーショ
ンなどで可視化されることで、とても魅力的なものとなります。Boids
の発表以降、エージェントシミュレーションの手法が映画などの映像
作品の制作現場でさかんに使われるようになっていきました。また、
シミュレーションの可視化によってどの要素が結果を導くのか、といっ
たことが直観的にわかりやすくなるため、モデルが示す挙動を調べる有
効な手がかりになります。

S4 Simulation System にはエージェントシミュレーションの 2D アニ
メーション描画、また、ソーシャルフォースモデルによる人流シミュ
レーションの 3D アニメーション描画機能があります。手軽にシミュ
レーション結果を可視化できれば、モデル構築や分析の過程だけでなく、
プレゼンテーションの場においてもとても役立ちます。ぜひ一度お試し
ください!

〇 S4 Simulation System 3D アニメーション機能の紹介
 https://www.youtube.com/watch?v=9mYnkoJb5v0&feature=youtu.be

                                                    (久保 裕貴)

*****************************************************************
■  <  tips  > psim言語講座
              (第 1 回 M/M/1 シミュレーションを書いてみる)
*****************************************************************

〇 はじめに
この講座では、S4 のシミュレーションエンジンの基盤となっている
psim言語を使ったシミュレーション方法について、紹介していきます。
S4 では基本的には GUI でシミュレーションを組む事ができますが、
psim言語を知っていると、より細かなカスタマイズが可能ですし、スク
リプト化すれば様々な分析も可能になります。

・S4 の psim 言語の概要が知りたい
・psim 言語を使いこなせるようになりたい
・シミュレーションをスクリプト化して自分で分析してみたい
とお考えの方は、是非お読み下さい。

〇 psim 言語
psim 言語とは S4 Simulation System に搭載される、離散イベントシ
ミュレーションを記述するための言語です。Python 言語上のライブラ
リとして提供されます。離散イベントシミュレーションとは、イベント
を起因として状態が変化するようなシステムのシミュレーションの事で
す。なお、シミュレーションには、短い時間ステップごとに全ての対象
物の状態を観測して、状態を変化させる連続型のシミュレーションもあ
ります。psim 言語は双方をサポートしていますが、ここでは、離散イ
ベントシミュレーションに着目します。

〇 M/M/1 モデル
離散イベントシミュレーションの代表例としては、銀行の窓口を想像し
てみて下さい。銀行の窓口には、ランダムにお客様が到着します。窓口
は同時に一人しかサービスを行えないので、窓口には行列が発生します。
窓口でのサービス時間はお客様ごとに異る時間を要します。この時、行
列はどのぐらいの長さになり、お客様は概ねどのぐらい待つのかを見積
る事はサービス提供者にとって、非常に重要です。離散イベントシミュ
レーションは、このようなシステムのシミュレーションを行います。

このような待ち行列モデルは、理論的にも分析されていて、前述のモデ
ルは M/M/1 モデルと呼ばれています。

理論的な説明はここでは省きますが、到着率(単位時間あたりに到着す
る人数)をλ(ラムダ)とし、サービス率(単位時間あたりにサービスを行
える人数)をμ(ミュー)とすると、

ρ = λ / μ ... (平均利用率)
Q = ρ / (1 - ρ) ... (平均待ち行列)
W = Q / μ ... (平均待ち時間)

になります。
例えば、お客様は平均 60 秒ぐらいで到着するなら、到着率(λ) は
1 / 60 になります。サービス時間は平均で 50 秒ぐらいなら、サービ
ス率(μ)は 1 / 50 になります。この値を代入すると、平均待ち時間
(W) は 250 秒になると予想できます。 では、実際にこのような結果
になるかを psim を用いて検証してみようと思います。

〇 スクリプト例
M/M/1 を psim 言語を使って書いた例が、

 https://www.msi.co.jp/s4/download/archives/mm1.zip

からダウンロードできます。
S4 Simulation System がインストールされている PC 上の適当なフ
ォルダに上記 zip をファイルを展開下さい。 zip 内には、

mm1.py
mm1.bat

があります。mm1.py が M/M/1 モデルを psim を使って実装したコー
ド例です。mm1.bat をそれを実行するための bat ファイルです。
mm1.bat をダブルクリックして実行すると、平均到着時間 60 秒、平
均サービス時間 50 秒で、10 万秒(> 27時間) のシミュレーションを
行います。実行すると、例えば、以下のような結果が表示されます。

平均待ち時間: 253.955 (理論値: 250.000)
平均システム内客数: 4.970 (理論値: 5.000)

理論値と書かれているものは、M/M/1 モデルでの予想値です。
何度か実行してみると、10 万秒のシミュレーションを行っても、個
々のシミュレーション結果は、理論値とはかなり食い違う事がお分か
りになるかと思います。理論値はあくまでも期待値です。実際にシミ
ュレーションを行うとこのようなブレを実感する事ができます。

次回、このコードを読んでいきたいと思います。

                                                   (山本 晃成)

*****************************************************************
■  <  tips  > Pythonプログラミング講座
      第 1 回 (本当に誰でも読める!!) Pythonソースコードの読み方
*****************************************************************

S4 Simulation System(S4)はPythonを用いて開発が行われていますが、ユ
ーザ側でもPythonコードを読み書きできることで実現できるシミュレー
ションの幅が大きく広がります。 講座初回はノン・プログラマーの方に
向けて、Pythonの「ソースコードの読み方」を解説したいと思います。 
Pythonはおろか、プログラミング自体の経験が無い方でも「ソースコード
を読むことはできる!」ことがおわかりになると思います。 また、コー
ディング経験のある方でも、このような観点からソースコードを把握しな
おすことは有益と思います。

〇 例文
以下はS4のエージェントシミュレーションで現れるコードの一部になりま
す:

ds = []
vs = []
for v, data in g.nodes_iter(data = True):
    if self.inSight(v, p, r = self.r):
        s = p - data["p"]
        d = numpy.sqrt(s.dot(s)) + paths[v][G]
        ds.append(d)
        vs.append(v)

この時点で理解できなくて全く問題ありません! ただ、ソースコードを
まっさらな気持ちで眺めると、次の要素に分解できるのではないでしょう
か:

・単語: vs, ds, g, selfなど
・単語同士をつなぐピリオド "."
・単語の後ろにつくカギカッコ "[" "]"
・単語の後ろにつくカッコ "(" ")"
・一部の特別な単語: ここでは for, if があります
・コロン ":"
・演算記号 "+", "-", "="など
今回はこれらの「読み方」だけに絞って解説をしたいと思います。

〇 単語 / 単語同士をつなぐピリオド "."
単語はプログラム上で動作する「モノ」を表し、Python上はすべて同じ
「オブジェクト」と呼ばれるものです。正体は分からなくても、とにかく
そういう名前のモノなのだ、と読めば良いです。

単語同士がピリオドで"a.b"のように繋がっている場合、「aが持っている
bというオブジェクト」のように読みます。

もし正体を知りたい場合、先頭の単語("a")はソースコードを上にたどって、
一番最初に現れたところを確認する必要があります。
いっぽうピリオドでつながった後の単語("b")は「aの所有物」なのでaの仕
様をドキュメントなどで確認することで正体を知ることができます。ドキ
ュメントを見ないといけないので、この部分はある意味「わからなくて当
然」です。(英文を読んでいて知らない単語が出てきた、くらいのイメージ
です。)

例文ですとvs, dsは最初に"="を使った文で定義されていることが分かり
ます(空のリスト"[]"というものですがこの詳細は今回は立ち入りません). 
また、"for"から始まる行に現れる "g"についてはこの中では定義されて
いないので、この範囲のソースコードより上をみなくては正体が分かりま
せんが、「"nodes_iter"というオブジェクトを持っている」ということだ
けは分かります。

〇 カギカッコ "[" "]"
"[]" はオブジェクトの中身にアクセスするための手段で、

a[2]

であれば「aの中身の2番目のオブジェクト」(※ インデックスは0始まり
なので、実際には3個目です)

b["dog"]

であれば「bの中身のdogという名前のついたオブジェクト」のように「読
む」ことができます。

〇 カッコ "(" ")"
カッコはオブジェクトに仕事をさせる記号で、仕事をさせるにあたってオ
ブジェクトにはカッコの中身が与えられます。 どんな仕事をしてくれる
かは、オブジェクトを定義したとき(造ったとき)に決められています。
ですので、

d = c("dogfood")

のように書くと「cに"dogfood"を与えて仕事をさせる」「仕事の結果(
「返り値」と言います)をdという名前で保持する」と読めます。 何が起
こるかはcの定義を辿らないとわかりませんが、とにかく「なにかの処理
をしているんだ」と思ってもらえたらよいです。

〇 キーワード
最後に、Pythonにはいくつか特別なキーワードが定められています。これ
らは知識が必要ですが、多くの場合英語から意味を推測することができま
す。

if a == b: # → aとbが等しければ以下を行う
    c(a)

for a in b: # -> bの中のaそれぞれについて以下を行う
    c(a) # cがaを受け取って仕事をする

import a # -> aをインポートする(他所からaの定義を引っ張ってくる)

True # 真
False # 偽
※ ここの "#" 記号は上記のようにコードにコメントを入れるためのも
ので、コードそのものには影響しません。

〇 コロン ":"
前節のif やfor の行の終わりにコロンがついており、次の行がインデン
トされていることに気づかれたかもしれません。
これはPythonの約束事で、このように「コロン+インデント」によって
コードがブロックに分けることで、どのかたまりがifやforの影響範囲
なのかを示しています(インデントが無いとエラーになってしまいます)。

〇 演算記号 "+", "-", "=" など
これらの動作はケースバイケースですが、基本的には四則演算のような
ものをイメージすれば間違いありません。ですので「読め」ます!
"="についてはこれまで説明無しで何度か用いてきましたが、「右辺の
ものを左辺の名前で保持する」という意味になります(「代入」と言い
ます)。再度、例文
以上を組み合わせると最初の例文もスラスラと「読む」ことができます!

ds = [] # dsという名前で空のリストを保持
vs = [] # 同上

# gのnodes_iterというオブジェクトにdata(中身はTrue)を与えて仕事
# をさせた各結果(v, data)について以下を行う
for v, data in g.nodes_iter(data = True): 

    # もしselfのinSightに(中略)を与えて仕事をした結果が真であれ
    # ば以下を行う
    if self.inSight(v, p, r = self.r): 
        # p からdataの中身の"p"という名前の要素を引き算した結果
        # をsという名前で保持
        s = p - data["p"]
        d = numpy.sqrt(s.dot(s)) + paths[v][G]  
        # ↑ path[v][G]のように複数個のカッコをつなげることも出
        # 来ます(path[v]に対して[G]する、と読めばよいです)
        # dsにdを与えてappendという名前の仕事をさせる
        ds.append(d) 
        vs.append(v) 

コードとしてどのように動作するかを理解するにはひとつひとつのオブ
ジェクトを調べる必要がありますが、これはプログラミングそのもの
が難しいのではなく、仕様を把握するのが煩雑、ということです(知ら
ない英単語を調べながら英文を読んでいくイメージです)。

〇 おわりに
きちんと勉強するのであれば文法から丁寧に蓄積していくのが王道です
が、現在は非常に多くの書籍やウェブサイトで情報を得ることができま
す。今回はあえて逆に、「トップダウン」的にどんどんコードを読み進
めてみる、という発想を紹介いたしました。これから勉強を始めるにあ
たって、少しでも抵抗感を和らげることができれば幸いです。

次回以降はPythonの具体的なプログラミング方法について、特に知って
おくとS4を快適に使えるようになるテーマにフォーカスしてお伝えして
いく予定です。今後とも宜しくお願いいたします!

                                                  (豊岡 祥)