はじめに
本連載の第1回と第2回では、S4本体の機能を中心にコーディング上のノウハウをお伝えし、第3回からは「S4プロジェクトを思い通りにカスタマイズする」ために、具体的なプロジェクトを通じてテクニックをご紹介しています。今回は分岐について見ていきます。
分岐の概要
S4では部品を2つ以上の異なるリンクに出力するよう設定することができます。このような設定を本記事では分岐と呼びます。
部品の左右にある、リンクの端点となる丸い点をポートと呼びます。部品の「共通設定」タブでは「出力」の右隣にある「+」ボタンでポートを増やすことができます。部品の設定で、アイテムをどのポートに出力するかを選択することでアイテムの分岐を実現できます。また、個々のポートにも複数のリンクを接続することが可能であり、ポートごとに存在する「選択方式」で「どのリンクから出力するか」の設定を施すことが可能です。
今回扱うプロジェクトは以下になります。
- 判断部品の応用
- クラスを用いた判断
- ストアからあるだけ取得
- ストア待ち時間
今回紹介するプロジェクトはいずれも「判断」部品を利用するものになります。「判断」部品は受け取ったアイテムについて何らかの判断を行い、複数用意した出力からアイテムを出力する部品です。配置時は出力が1つしかないため、編集画面の「共通設定」タブにある「出力」の右隣にある「+」ボタンで増やす必要があります。

判断部品の応用
判断部品では、アイテムの分岐先を決めるための条件式を入力する欄があります。ここにはPythonの式を書き込むことが可能であり、通常は部品の属性をその場で参照して条件式を記述します。「判断部品の応用」ではそれを発展させ、カスタムコードで定義した関数に条件判断を任せるという設定を行っています。
まずプロジェクトを開きます。S4のメニュー「プロジェクト」→「プロジェクトのインポート」でファイルダイアログを開き、(S4のインストールフォルダ (通常は C:\Program Files\Mathematical Systems Inc\S-Quattro Simulation System V6))\samples\離散-ミニマル\判断部品の応用.s4 を選択し、OKします。S4画面左側の「ワークスペース」には開いたプロジェクトが置かれています。「+」をクリックし「モデル」をダブルクリックすることでプロジェクトを開きます。

アイテムが分岐して流れた先にそれぞれ記録部品を置くことで、実際にどのアイテムがどちらに流れたのかを観察することができます。
クラスを用いた判断
「判断部品の応用」では2通りに分岐する場合を扱いました。選択肢が3つ以上ある場合、条件式も2つ以上に増えています。その際、置かれているのが似たような条件式ですと同じ計算を複数回行う形になります。この計算が重い場合は1回で済ませたくなります。ここではクラスを用いてそれを実現します。
まずプロジェクトを開きます。S4のメニュー「プロジェクト」→「プロジェクトのインポート」でファイルダイアログを開き、(S4のインストールフォルダ (通常は C:\Program Files\Mathematical Systems Inc\S-Quattro Simulation System V6))\samples\離散-ミニマル\クラスを用いた判断.s4 を選択し、OKします。S4画面左側の「ワークスペース」には開いたプロジェクトが置かれています。「+」をクリックし「モデル」をダブルクリックすることでプロジェクトを開きます。

モデル画面では3つの分岐があり、判断部品の編集画面を開くと2つの条件式が確認できます。最初の条件式は
dcmk.make_decision(item) == 1
であり、2番目の条件式は
dcmk.get_decision() == 2
となっています。最初の条件式で make_decision
の呼び出しにより条件判断で用いる値を計算し、それを返り値にするとともに内部の属性に代入しています。2番目の条件式では計算済みの値を返しています。(条件式が上から順番に実行されるという仕様も活用しています) dcmk
はクラス DecisionMaker
のインスタンスであり、いずれもカスタムコードで定義しています。
シミュレーションの内容としてはアイテムに付与された番号を3で割った余りで分岐させており、それぞれほぼ同数のアイテムが流れていることが「記録」部品から確認できます。
ストアからあるだけ取得
これまでは「判断」部品で2つ以上の出力ポートを扱ってきましたが、他にも2つ以上の出力ポートを持つことに意味がある部品があります。ここでは「ストアから取得」部品を例として取得ができた場合とできなかった場合で分岐する例を示します。
まずプロジェクトを開きます。S4のメニュー「プロジェクト」→「プロジェクトのインポート」でファイルダイアログを開き、(S4のインストールフォルダ (通常は C:\Program Files\Mathematical Systems Inc\S-Quattro Simulation System V6))\samples\離散-ミニマル\ストアからあるだけ取得.s4 を選択し、OKします。S4画面左側の「ワークスペース」には開いたプロジェクトが置かれています。「+」をクリックし「モデル」をダブルクリックすることでプロジェクトを開きます。

本連載でストアを扱うのは初めてであるため、最初に説明いたします。ストアは0個以上のオブジェクトを保持できる資源です。「ストアから取得」でオブジェクトを取り出したり、「ストアへ追加」でオブジェクトを格納したりできます。重要な機能として、「ストアから取得」しようとしたとき、ストアが取り出したい個数未満のオブジェクトしか持たない場合にpsimの意味での待ち受けが発生します。「ストアへ追加」でストアが既に満杯の場合にも待ち受けが発生します。
本プロジェクトは、ストアから取得する処理で不足が発生した場合に、単に待ち受けるのではなくその場で残っているものは引き取って先に進むような処理の実装になります。
ストアには予め500個のオブジェクトが置かれていて、それらを取り出していく流れになっています。「アイテム」では demand という属性を設定しており、アイテムごとにランダムな需要を持ち、「ストアから取得」では demand 個だけ取り出そうとします。シミュレーションが進むとストアの内容量が減って取り出せなくなりますが、そこで通常の待ち受けを行う際に「最大待ち時間」と「タイムアウト時出力ポート」を設定しています。「最大待ち時間」は0ですので、不足が発生したらただちに別の出力ポートからの出力になります。
第二の出力ポートの先には判断部品があり、ストアにアイテムが残っているか否かで分岐しています。残っている場合はその残りを取り出す処理へ向かいます。分岐は最終的には3つのルートに分かれ、各アイテムがどの分岐に進んだのかは3つの記録部品を見ることで確認できます。
ストア待ち時間
本プロジェクトでは、さらなる分岐のバリエーションとして任意の部品の出力ポートに複数のリンクをつなげる場合をご紹介します。
まずプロジェクトを開きます。S4のメニュー「プロジェクト」→「プロジェクトのインポート」でファイルダイアログを開き、(S4のインストールフォルダ (通常は C:\Program Files\Mathematical Systems Inc\S-Quattro Simulation System V6))\samples\離散-ミニマル\ストア待ち時間.s4 を選択し、OKします。S4画面左側の「ワークスペース」には開いたプロジェクトが置かれています。「+」をクリックし「モデル」をダブルクリックすることでプロジェクトを開きます。

「通過」部品は、それ自身は何もせずアイテムを通過させますが、出力ポートに2つのリンクが接続されており、「共通設定」タブでこれらのうち1つを「一様ランダム」に選んでアイテムを流すよう設定しています。
プロジェクト全体の流れを説明します。本プロジェクトは100個のアイテムが通過する中でストアへのオブジェクトの出し入れが発生する事象を扱います。2つのストアにはそれぞれ3個のオブジェクトが置かれており、「ストアから取得」「ストアから取得2」ではそれぞれ1個取り出そうとします。取り出せなければ即座に取り出せなかった場合の分岐に進みます。オブジェクトをストアから取り出せた場合、「遅延」「遅延2」で固定時間の待ちを発生させます。これらの入力は「共通設定」でキューサイズを無限大にしているため、アイテムが詰まって手前の記録部品などの挙動がおかしくなることはありません。
その後、何もしない「通過」部品を通り、出力側のリンク2本のうち一様ランダムに選んだ方に行きます。その先は「ストアへ追加」「ストアへ追加2」になっていますから、実質的に追加するストアの決定を意味します。「ストアへ追加」「ストアへ追加2」の編集画面では、「追加する離散量資源」としてデフォルトの「アイテムを追加する」ではなく「アイテム属性を追加する」を指定しています。「アイテムを追加する」の場合、出力からは空のアイテムが現れ、itemidといった属性の参照ができなくなるためです。
おわりに
第4回となる今回は3種類のサンプルプロジェクト「判断部品の応用」「クラスを用いた判断」「ストアからあるだけ取得」「ストア待ち時間」についてご紹介しました。ミニマルと付いている「離散-ミニマル」に属するサンプルプロジェクトは単一の課題に注目して組み立てたプロジェクトであり、「S4プロジェクトを思い通りにカスタマイズする」ための直接的なアイデアを与える可能性が高いものになっています。今後の記事でも「離散-ミニマル」のプロジェクトを見て参ります。