S4コーディング入門(第6回)制限区間について

  • HOME
  • S4コーディング入門(第6回)制限区間について

はじめに

本連載の第1回と第2回では、S4本体の機能を中心にコーディング上のノウハウをお伝えし、第3回からは「S4プロジェクトを思い通りにカスタマイズする」ために、具体的なプロジェクトを通じてテクニックをご紹介しています。今回は制限区間について見ていきます。

制限区間について

制限区間という言葉はS4公式用語ではなく、一部のプロジェクトで利用する概念に名を付けたものになります。制限区間は「始点」と「終点」のアイコンで囲まれた区画で、その間に入り込めるアイテムの数を制限します。

離散イベントシミュレーションで用いるアイコンは、デフォルトではキューサイズが0であるため、アイテムはアイコン上に1個だけ滞在する可能性があります。この仕様は「ファシリティ利用」や「ストアから取得」のようにアイテムが滞在することが明らかであるアイコンだけでなく、「判断」や「記録」のようにシミュレーション時間0秒の間だけ滞在すると想定されるアイコンでも同様です。そして後者は、前方にアイテムが留まっている場合は0秒より長く滞在し、疑似的な入力バッファとして振る舞う可能性があります。これは、大抵の場合ユーザーにとって予想外の振る舞い(想定外のタイミングで「記録」されるなど)を引き起こします。制限区間には、こういった予想外の振る舞いを抑制する狙いがあります。「始点」「終点」で囲まれた区画の中を流れるアイテム数を制限することで、「判断」や「記録」でアイテムが待つことがない状況を作るのです。

今回扱うプロジェクトは以下になります。

  • 制限区間
  • ファシリティ利用開始時間の同期

制限区間

最初に、制限区間の概念を具体的に示すサンプルプロジェクトについて説明いたします。

まずプロジェクトを開きます。S4のメニュー「プロジェクト」→「プロジェクトのインポート」でファイルダイアログを開き、(S4のインストールフォルダ (通常は C:\Program Files\Mathematical Systems Inc\S-Quattro Simulation System V6))\samples\離散-ミニマル\制限区間.s4 を選択し、OKします。S4画面左側の「ワークスペース」には開いたプロジェクトが置かれています。「+」をクリックし「モデル」をダブルクリックすることでプロジェクトを開きます。

本プロジェクトにおける制限区間は「ファシリティ外部要求」で始まり「ファシリティ外部解放」で終わる一連のフローになります。「ファシリティ外部要求」「ファシリティ外部解放」が参照する「ファシリティ外部」は「同時利用容量」が2に設定されています。そのため、シミュレーションが始まり、アイテムが「ファシリティ外部要求」を2度通過すると、それ以上は通れなくなります。その後「ファシリティ外部解放」でファシリティが解放されると、再び「ファシリティ外部要求」を通れるようになります。これにより「ファシリティ外部要求」と「ファシリティ外部解放」の間には高々2個までしかアイテムが存在できないことになります。

制限区間の内側には2種類のファシリティ利用につながる分岐があります。「ファシリティ内部利用1」「ファシリティ内部利用2」はそれぞれ容量1で、異なるファシリティ利用時間が設定されています。分岐では「ファシリティ内部利用1」が空いていればそちらに、利用されていれば「ファシリティ内部利用2」にアイテムを流します。利用時間は「ファシリティ内部利用1」より「ファシリティ内部利用2」の方が2.5倍長いため、「記録内部1」と「記録内部2」の出力を比べると前者の方が後者より多くのアイテムを処理しています。

制限区間が無い場合、2個のアイテムが「ファシリティ内部利用1」「ファシリティ内部利用2」で処理されている間に次のアイテムが「判断」に来て、「ファシリティ内部利用1」が空いていないため「ファシリティ内部利用2」(こちらも空いてはいない)へ行くという処理がされてしまいます。さらにキューサイズはデフォルトの0であるため、「判断」部品上のアイテムは「ファシリティ内部利用2」が空くまで先へ進むこともできません。その間により利用時間が短い「ファシリティ利用1」が空くこともありますが、判断はすでになされているためそちらへは流れません。このような振る舞いはほぼ確実に予想外のものになります。

ファシリティ利用開始時間の同期

工場における2個の工程(ファシリティ1, ファシリティ2)につき、それぞれ開始時間を同期させるサンプルです。これまでの連載の中で最も複雑なサンプルになります。

まずプロジェクトを開きます。S4のメニュー「プロジェクト」→「プロジェクトのインポート」でファイルダイアログを開き、(S4のインストールフォルダ (通常は C:\Program Files\Mathematical Systems Inc\S-Quattro Simulation System V6))\samples\離散-ミニマル\ファシリティ利用開始時間の同期.s4 を選択し、OKします。S4画面左側の「ワークスペース」には開いたプロジェクトが置かれています。「+」をクリックし「モデル」をダブルクリックすることでプロジェクトを開きます。

本プロジェクトにはフローが上下に2種類あり、それぞれに制限区間が置かれています。上側のフローにおける制限区間は「ファシリティ外部要求」で始まり「ファシリティ外部解放」で終わる一連のフローになります。「ファシリティ外部要求」「ファシリティ外部解放」が参照する「ファシリティ外部」は「同時利用容量」が2に設定されており、「ファシリティ外部要求」と「ファシリティ外部解放」の間には高々2個までしかアイテムが存在できません。また下側のフローにおける制限区間は「ファシリティ-シグナル用外部要求」で始まり「ファシリティ-シグナル用外部解放」で終わる一連のフローになります。「ファシリティ-シグナル用外部要求」「ファシリティ-シグナル用外部解放」が参照する「ファシリティ-シグナル用外部」は「同時利用容量」が1に設定されており、「ファシリティ-シグナル用外部要求」「ファシリティ-シグナル用外部解放」の間には高々1個までしかアイテムが存在できません。

上側の制限区間内にある「ファシリティ利用1」「ファシリティ利用2」は、通常であればお互いの仕事の状況を参照せず独立に動作します。「ファシリティ利用1」「ファシリティ利用2」の手前に「指示ストア」「待ちストア」の仕掛けを導入することで、2アイテムが同時に「ファシリティ利用1」「ファシリティ利用2」に入るようにしています。先に下側のフローと「指示待ち」について説明し、その後全体の仕掛けを説明します。

下側のフローの「生成-シグナル用」は0秒間隔・かつ無限個のアイテムを生成する設定になっています。そのままですとシミュレーション時間が前進する前に無限個のアイテムを生成しなければならなくなりますが、実際にはその前方にある「ファシリティ-シグナル用外部要求」から始まる制限区間で個数が高々1個に制限されるため、1個生成した後はシミュレーション時間が前進しシミュレーションが進みます。制限区間では「待ちストア」「指示ストア」とのやり取りを行います。

「待ちストア」「指示ストア」は上側のフローから見た "指示待ち" を実現する仕掛けになります。このストアでは物理的ではないシグナルのようなものをやり取りします。上側のフローを流れるアイテムはまず「待ちストアへ追加1」で自身が "待ち状態" である旨を伝えます。そして「指示ストアから取得1」に至り、「指示ストア」から "指示" を取得しようとします。最初は指示ストアは空であるため、アイテムが追加されるのを待つことになります。一方、下側のフローでは「待ちストア」にアイテムが追加されたことを受けて「待ちストアから取得」で待っていたアイテムは先に進みます。その次の「指示ストアへ追加」は "指示を出す" に相当する処理になります。すると上側のフローの「指示ストアから取得1」で待っていたアイテムが "指示" を受け取り、前に進んで「ファシリティ利用1」に至ります。その後、さらに上側のフローを進むと「待ちストアへ追加2」「指示ストアから取得2」が現れます。ここでもアイテムは "指示待ち" を行います。

ここからは「ファシリティ利用1」「ファシリティ利用2」の同期の仕組みを説明いたします。下側のフローの「待ちストアから取得」は、先の説明では1個の "待ち" を取得しようとしていましたが、この1個は実は可変です。編集画面上、取得個数は param.nfac であり、パラメータ nfac の初期値が1になっています(メニュー「モデル」→「パラメータを編集する」の「パラメータ」タブを参照)。そして下側のフローの後半にある「パラメータ更新」では nfac を更新しています。「パラメータ更新」は通過部品であり、それ自体は何もしませんが、「コード編集」タブを開くと以下のようなコードが追加されています。

    if param.nfac < 2:
        param.nfac += 1 # パラメータ更新

nfac の値が2未満であれば、 nfac に1を加算します。初期値は1でしたから、最初のアイテムが通過する際に nfac = 2 となり、その後は変化しません。 nfac の変化が済み、1個目のアイテムが「ファシリティ-シグナル用外部解放」で制限区間を離れると、次のアイテムが制限区間に入ってきます。これ以降では「待ちストアから取得」からは2個の "待ち" を取得しようとします。これは「待ちストア」に2個の "待ち" が置かれるまで待つことを意味します。

1個目のアイテムが「待ちストアへ追加2」に "待ち" を追加し「指示ストアから取得2」で待つようになるのと並行して、上側の制限区間には2個目のアイテムが入ってきて、「待ちストアへ追加1」に "待ち" を追加し「指示ストアから取得1」で待つようになります(実際には1個目のアイテムが「ファシリティ利用1」している間に2個目が入って来ます)。すると合計2個の "待ち" が「待ちストア」に置かれている状態になるため下側のフローの「待ちストアから取得」が成立し、先に進めるようになります。次の「指示ストアへ追加」では、追加個数が取得と同様 param.nfac となっているため、2個の "指示" が「指示ストア」に置かれます。このとき、上側のフローのアイテムは必ず「指示ストアから取得1」「指示ストアから取得2」で待っているため、それぞれが同時に "指示" を受け取ります。これにより続く「ファシリティ利用1」「ファシリティ利用2」も同時に開始します。これがファシリティ利用の同期の仕組みになります。

上側のフローに制限区間が無い場合、2個目、3個目、・・・のアイテムが「待ちストアへ追加」になだれ込み、間違った "待ち" シグナルが飛んでしまいます。また、下側のフローの制限区間が無いと、 param.nfac の更新と参照のタイミングが意図しない形で行われてしまいます。このように制限区間は複雑な手順を踏んだ処理を実現しようとするとしばしば必要となります。

おわりに

第6回となる今回は2種類のサンプルプロジェクト「制限区間」「ファシリティ利用開始時間の同期」についてご紹介しました。ミニマルと付いている「離散-ミニマル」に属するサンプルプロジェクトは単一の課題に注目して組み立てたプロジェクトであり、「S4プロジェクトを思い通りにカスタマイズする」ための直接的なアイデアを与える可能性が高いものになっています。

離散イベントシミュレーションに関してはある程度、アイコン設定やコーディングを通じたプロジェクトのカスタマイズの可能性いついて示しました。突然ではございますが、今回の記事をもって「S4コーディング入門」は一区切りとさせていただきます。

監修:株式会社NTTデータ数理システム 機械学習、統計解析、数理計画、シミュレーションなどの数理科学を 背景とした技術を活用し、業種・テーマを問わず幅広く仕事をしています。
http://www.msi.co.jp NTTデータ数理システムができること
「数理科学の基礎知識」e-book無料ダウンロードはこちら

関連記事