Version 6.5
チュートリアル
Copyright © 2008-2023 NTT DATA Mathematical Systems, Inc. All Rights Reserved.
S4 Simulation System を使えば、工場などの生産システム、サプライチェーンなどの流通システム、銀行の窓口やATM、通信システム、 交通システム、コールセンターなど、何かしらの待ちや混雑の発生する、確率的な振る舞いをするシステムを対象とした、 シミュレーションを行う事が出来ます。
S4 Simulation System はシミュレーションモデルを効率的にモデル化出来るように、部品・資源・フローアイテム・リンクという汎用オブジェクト を用意しています。これらを配置・接続・編集する事で、モデルを表現します。
本チュートリアルでは、S4 Simulation System によるモデル作成方法と、簡単な分析方法をご紹介します。 本チュートリアルは S4 Simulation System の全ての機能を網羅的に紹介するものではありませんが、本チュートリアルを読めば、 S4 Simulation System の基本概念、操作方法を理解出来るはずです。
まずはじめに、「銀行の窓口モデル」を作成し、分析を行ってみます。
銀行の窓口モデルは銀行に来るお客をシミュレーションするモデルです。(図 1)
お客がランダムに到着する。
銀行にはひとつの窓口があり、お客はその窓口でサービスを受ける。
窓口が空いていない場合、お客は待ち行列を作ってサービスを待つ。
先に並んだ人から順に窓口でサービスを受ける事が出来る。
サービス時間はランダムである。
銀行の窓口はひとつしかないので、お客の待ち行列が出来ます。その待ち行列がどのぐらいになるのか、お客の待ち時間はどのぐらいになるのか、などをシミュレーションします。
実際にシミュレーションを行うには、もう少し厳密な設定が必要です。ここでは、
お客の到着間隔は平均 60 秒の指数分布に従う。
窓口のサービス時間は平均 30 秒の指数分布に従う。
とします。
まず、S4 Simulation System を起動します。S4 Simulation System をインストールすると、Windows のスタートメニューに登録されます。
Windows 7 以前のOSの場合、スタートメニューから、[すべてのプログラム]\rightarrow[S-Quattro Simulation System]\rightarrow[S-Quattro Simulation System] で起動します。(ただし、インストール時の設定で別のメニューに登録されている場合もあります。)
Windows 8, 8.1 の場合、スタート画面からアプリ画面を開き、そこから[S4(S-Quattro Simulation System)]で起動します。
Windows 10 以降の場合、スタートメニューから、[すべてのアプリ]\rightarrow[MSI Solutions]\rightarrow[S4(S-Quattro Simulation System)]で起動します。
サーバーにてご利用の場合、上記のいずれかのOSの方法で起動できます。
※なお、どのOSでも検索機能で「s4」と入力すれば概ね S4 Simulation System がヒットします。
初回起動時は、初回起動画面(図 2)が表示されます。
初回起動画面ではワークスペースフォルダを指定して下さい。ワークスペースフォルダとは、S4 Simulation System で作成したプロジェクトを保存するフォルダの事です。ワークスペースフォルダは後で変更する事も出来ます。よく分からなければ、デフォルトの設定のままで構いません。
ファイルメニューから「新規プロジェクト」を選択し、プロジェクトを作成します。(図 3)
[新規プロジェクトの作成」ダイアログ(図 4)が表示されますので、プロジェクト名「銀行の窓口」を入力して下さい。
ブラウザパネルのワークスペースタブに作成されたプロジェクトが表示されます。(図 5)
モデルをダブルクリックすると、モデル編集パネルに空のモデルが表示されます。
ブラウザパネル(左側のパネル)で「アイテム」タブを選択して下さい。(図 6)
アイテムタブの「アイテム」上でマウスの左ボタンを押し、押しながら、モデル編集画面(右側)に移動し、左ボタンを離すと配置されます。(図 7)
フローアイテムとはシミュレーション内に流れるオブジェクトで、この場合は、お客を示します。配置したフローアイテムの下側をダブルクリックするとフローアイテムの名前を変更する事が出来ます。ここでは「お客」という名前に変えます。(図 8)
次に来店を表す「生成」部品を配置します。ブラウザパネル(左側のパネル)で「部品タブ」を選択して下さい。 (図 9)
フローアイテムの配置した方法と同様に、「生成」部品をモデル上に配置します。 この部品は来店を表すので、フローアイテムの名前を変更した方法と同様に「来店」という名前に変更します。 (図 10)
次に窓口を表す資源「ファシリティ」部品を配置します。 ファシリティは、排他的に利用可能な複数の離散資源を表します。例えば銀行の窓口がそれにあたりますが、 他にはオフィス内のプリンタ、生産ライン上の同時にひとつしか処理出来ない工程などもファシリティです。
ブラウザパネル(左側のパネル)で「資源」タブを選択して下さい。(図 11)
資源タブからファシリティをモデル上に配置します。 この部品は窓口を表すので、「窓口」という名前に変更します。(図 12)
同様に部品タブから「ファシリティ利用」部品を「窓口利用」という名前で配置し、「終端」部品を「退店」という名前で配置します。(図 13)
次にお客の流れをリンクで表現します。 「来店」部品の右側の丸で、マウスの左ボタンを押し、押しながら、「窓口利用」部品の左側の丸に移動し、左ボタンを離すと、 リンクが作成されます。(図 14)
同様に、「窓口利用」部品の右側の丸から「退店」部品に左側の丸にもリンクを作成します。(図 15)
次に「来店」部品の振る舞いを指定します。 「来店」部品をダブルクリックすると部品編集画面が表示されます。(図 16)
「来店」部品ではある間隔で「お客」が到着する事を表現します。 言い換えれば「お客」をある間隔で生成します。「お客」を生成するためには「フローアイテム名」のプルダウンメニューから「お客」を選択します。(図 17)
お客の到着間隔は平均 60 秒の指数分布に従う事になっていました。 そこで、「生成時間」の「生成方式」を「指数分布」にし、「平均」を 60 に設定します(図 18)。
注意: 生成部品の「初期生成時間」は、生成を開始する時間を指定します。ここでは、生成する間隔をランダムに設定したいので、「生成時間」の方を指定します。
他の項目はそのままにし、「OK」を押すと、部品編集画面が閉じます。
次に「窓口利用」部品の振る舞いを指定します。「窓口利用」部品をダブルクリックすると部品編集画面が表示されます。(図 19)
「窓口利用」はファシリティ「窓口」をある時間占有する事を示します。「ファシリティリスト」の「+」をクリックし、プルダウンメニューから「窓口」を選択します。
窓口のサービス時間は平均 30 秒の指数分布に従う事になっていました。そこで、「ファシリティの利用時間」の「生成方式」を指数分布にし、「平均」を 30 に設定します。
並列処理で「並列処理」を選択し、並列数を「Inf」にします。並列数はお客が同時に窓口を利用できる数を表します。「Inf」を指定すると、窓口が無限に並んでいる事になります。お客は無限に並んでいる窓口に座り、担当者が来るのを待っているイメージです。また、「逐次処理」は、並列処理が1の場合と同義になります。(図 21)
他の項目はそのままにし、「OK」を押すと、部品編集画面が閉じます。
次にモデルパラメータを設定します。モデルパラメータとは、シミュレーションモデルの実行方法を定めるパラメータです。 モデルメニューから「パラメータを編集する」を選ぶと(図 22)、パラメータ編集画面が表示されます。 (図 23)
ここでは、シミュレーション終了時間を 100000 に設定します。 シミュレーション終了時間にはシミュレーション内部時間を指定します。 この例の場合はシミュレーション時間の単位は「秒」としていますが、シミュレーションによっては単位が「時間」、「日」の場合もあります。シミュレーション終了時間を長くすればよりシミュレーションの分析を正確に行えますが、シミュレーションに要する実時間も長くなります。
他の項目はそのままにし、「OK」を押すと、パラメータ編集画面が閉じます。
シミュレーションを実行する準備が整いましたので、シミュレーションを実行してみます。 モデルメニューから「モデルを開始する」を選ぶと(図 22)、モデル実行画面が表示されます。 (図 24) メーターはシミュレーションの進捗状況を示しています。
モデルメニューから「サマリを表示する」を選ぶと(図 22)、サマリ画面が表示されます。 (図 25)
ファシリティ「窓口」の基本統計量が表示されます。 「要求待ち」は「窓口」に平均でどのぐらいの人が並んでいるかを表しています。 シミュレーションごとに結果は異なりますが、平均でおおよそ 0.5 人近辺の値を示していると思います。
次に窓口に平均でどれくらいの時間並んでいるかを調べます。 もう一度「窓口利用」部品をダブルクリックして編集画面を開いて、一番下の「ファシリティ利用の記録」で「モニター」を選択し (図 26)、「OK」を押し編集画面を閉じて下さい。
モデルメニューから「モデルを開始する」を選び、再実行して下さい。 もう一度モデルメニューから「サマリを表示する」を選ぶと、サマリ画面が表示されます。(図 27)
「窓口利用-ファシリティの記録」が加わっています。「待ち時間」がファシリティの利用に要した時間を表します。 シミュレーションごとに結果は異なりますが、平均でおおよそ 30.0 秒近辺の値を示していると思います。
この結果から、
お客の到着間隔は平均 60 秒の指数分布に従う。
窓口のサービス時間は平均 30 秒の指数分布に従う。
であれば、待ち行列はおおよそ 0.5 人程度であり、待ち時間はおおよそ 30.0 秒程度になる事が分かりました。
次に実際のデータを見てみます。ブラウザパネルのワークスペースタブを開いて下さい。 「窓口利用-ファシリティの記録」で右クリックするとメニューが表示されます。(図 28)
「データを表示する」を選ぶと、生データが表示されます。(図 29)
今の設定では最大待ち時間を設定していないため「待ち受け」列には全て「use」が表示されています。「待ち受け時間」列には、お客が窓口の待ち行列に並んでいる時間(待ち行列に並び始めてから窓口サービスを受けられるまでの時間)が表示されています。
「待ち受け時間」列を見ただけでは、特徴が分かりませんでした。サマリ画面から待ち時間の平均は 30.0 秒程度である事は分かっていますが、どんなばらつきをしているのかをヒストグラムで確認してみます。
「窓口利用-ファシリティの記録」で右クリックしたメニュー(図 28で、「ヒストグラム」を選ぶと、ヒストグラムが表示されます。(図 30)
右にテールを引く分布である事が読み取れると思います。
次に窓口に並ぶ人数の時系列変化を確認してみます。
「窓口」で右クリックしたメニューから「時系列プロット」を選んで下さい。 時系列変化が表示されます。(図 31)
平均待ち行列数は 0.5 人程度である事が分かっていますが、窓口の混雑状況にかかわらずお客はランダムに到着するため、待ち行列数がランダムに上昇、下降している様子が分かります。
! 注意 ! : リアルタイムグラフ表示は、以下に示すリアルタイムグラフ部品を使う方法以外に、v6.5より追加されたノードグラフエディタ部品を使う方法もあります。 ノードグラフエディタの操作方法についてはノードグラフエディタマニュアルのクイックスタートをご覧ください。
S4 Simulation System では、実行結果に対するグラフをリアルタイムに描画させる事も出来ます。 ブラウザパネルの「グラフ」タブを開いて、「リアルタイムグラフ」をモデル上に配置します。 (図 32)
「リアルタイムグラフ」をダブルクリックすると、グラフ作成画面が表示されます。 グラフ作成画面上部の「ヒストグラム」をクリックすると、グラフ内にヒストグラムが配置され、 その設定画面が表示されます。(図 33)
グラフデータの1行目の「x」に、「窓口利用-ファシリティ」の中の「待ち時間」を設定します。(図 34)
グラフグループ設定の「OK」をクリックし、「銀行の窓口-リアルタイムグラフ」の右上の「X」をクリックします。 モデルメニューから「モデルを開始する」を選び、実行すると、先程確認した待ち時間の分布がリアルタイムで表示されます。
記録部品を用いて来店者と退店者の数を時系列に記録する事で、直接的に窓口の混雑具合を確認する事が出来ます。来店者と退店者の記録には、「銀行の窓口」モデルに記録部品を以下のように配置し名前を編集します。
来店者数の記録をダブルクリックして編集画面を開き、モニター種類を時系列モニターにします。また、記録内容の列名を来店、列の型を実数、記録方法を累積カウントにします。
退店者数の記録も同様に、モニター種類を時系列モニターにします。また、記録内容の列名を退店数、列の型を実数、記録方法を累積カウントにします。
まずは、窓口が1つの場合の混雑具合を確認します。「銀行の窓口」モデルのファシリティ「窓口」の「同時利用容量」を1にします。また今回は、窓口利用のファシリティの利用時間の平均を 50 に、シミュレーション終了時間を5000秒に変更します。その他のパラメータは、そのままにしておきます。パラメータを変更したらモデルを実行します。 実行後、来店者数と退店者数のグラフを描きます。グラフを描くには、グラフ部品を配置してダブルクリックしてグラフ編集画面を開きます。グラフ編集画面が開いたら、折れ線グラフを選択しグラフデータ欄の1行目のx軸に来店者数の記録の時間、y軸に来店者数の記録の来店数を入力し、2行目のx軸に退店者数の記録の時間、y軸に退店者数の記録の退店数を入力します。
「同時利用容量」は、窓口の担当者の人数に相当します。今、並列処理数には「Inf」が設定されているため、この場合は、無限に並んでいる窓口に対して、担当者は1人が順番に対応する事になります。
グラフが描かれたら凡例を表示させるために、グラフタブにある凡例をクリックします。また、軸に名前を付ける為にラベルをクリックしてx軸に時間、y軸に累積人数と入力します。このようにして作成されたグラフは以下のようになります。
来店者数と退店者数に挟まれた面積が銀行に滞留している人数になります。パラメータ(この場合は窓口の数)を調整して窓口がなるべく混雑しないようにすると、この面積は小さくなります。
次に窓口の担当者の人数を2人にした場合を考えます。今作成したモデルのファシリティ「窓口」の「同時利用容量」を2にしてもう一度モデルを実行します。実行が終わったら、先程作成したグラフ部品をダブルクリックすると窓口の担当者の人数が2人の場合のグラフが表示されます。
窓口の担当者の人数を2人にすると、来店者数と退店者数に挟まれた面積はほぼ0になり滞留人数が少なくなった事がわかります。
このようにシミュレーションでは条件を様々に変えてシステムの挙動の変化を調べる必要があります。 例えば、担当者の人数の他に来店数(間隔)が変わった場合や、窓口でのサービス時間を変えた場合に、 窓口に並ぶ人数や並ぶ時間はどのように変わるのでしょうか。 S4 Simulation System では以下のようにパラメータを動かして結果を分析することがきます。
「来店」部品の「生成時間」は来店間隔を表します。来店間隔を変えると、どうなるでしょうか。
「窓口利用」部品の「ファシリティの利用時間」は窓口のサービス時間を表します。サービス時間を換えると、どうなるでしょうか。
来店間隔の平均が窓口利用時間の平均より小さいとどうなるでしょうか。
先程のモデルは窓口が一つの単純なモデルでした。ここでは窓口の種類が3種類ある少し複雑なモデルを考えます。
モデルの概要は以下の通りです。
銀行には「預金受付」、「融資申し込み」、「投資相談」の3つのサービスがある
各サービスはそれぞれ専用の窓口で処理を行う
「お客」は1Fと2Fから来店しそれぞれ目的に応じて各窓口に並ぶ
1F から来店する「お客」は平均20秒の指数分布に従う
2F から来店する「お客」は平均240秒の指数分布に従う
1F から来店したお客の 90%が預金、8% が融資、2%が投資相談に行く
2F の入り口は「投資相談窓口」専用である
各窓口でサービスを受けたお客は、他の窓口には行かずそのまま退店する
各窓口には担当者が一人ずついる
行列に並べる人数はそれぞれ預金が 30 人、融資が 10 人, 投資相談が 10 人までである
サービス提供時間は平均預金が25秒、融資申し込みが120秒、投資相談が145秒の指数分布に従う
「銀行の窓口モデル」で作成したように、以下のように部品を配置して名前を変更します。
1F から来店したお客は預金、融資、投資相談に行くので次のようにリンクを作成します。
2F の入り口は「投資相談窓口」専用なので次のようにリンクを作成します。
サービスを受けたお客はそのまま退店するので次のようにリンクを作成します。
「来店1F」部品をダブルクリックして編集画面を開きます。編集画面が表示されたら 1F から来店する「お客」は平均20秒の指数分布に従うので、生成時間の生成方式を指数分布にし、平均に20を設定します。
また、1F から来店したお客の 90%が預金、8% が融資、2%が投資相談に行くので、共通設定の出力ポートの選択方式でセレクタをランダム(重み付き)にし、重み表の預金受付に 90、融資申し込みに8、投資相談に2を入力します。重み表の行を追加するには、表の上で右クリックしてメニュを表示します。
同様に 2F から来店する「お客」は平均240秒の指数分布に従うので、来店2F部品の編集画面を編集します。
「預金窓口」部品をダブルクリックして編集画面を開きます。窓口にいる担当者の人数は1人なので、同時利用容量を1にします。「融資窓口」、「投資窓口」も同様に編集します。
「預金受付」部品をダブルクリックして編集画面を開きます。預金受付では、預金窓口を利用するのでファシリティリストに預金窓口を指定します。また、サービスの提供にかかる時間は平均25秒の指数分布に従うので、ファシリティの利用時間の生成方式を指数分布にし、平均に25を設定します。今回は担当者数と同じ数だけ窓口を用意しますので、並列処理にチェックをし、並列数に1を設定します。
預金受付の行列に並べる人数は30人なので、共通設定のキューサイズを制限ありにし 30 を入力します。
今回は、窓口の数を担当者の人数と同じにしているので、お客が並ぶ場所を作らなければなりません。入力のキューサイズに無制限、あるいは制限ありで、数を指定すると窓口の前に行列を作ることができます。つまり、お客は窓口に座って待つのではなく、窓口の前に行列を作ることになります。
融資申し込みも同様に、ファシリティリストに融資窓口を、ファシリティの利用時間の生成方法を指数分布にし、平均に120を設定します。また、並列数に1を設定します。さらに共通設定のキューサイズを制限ありにし 10 にします。 投資申し込みについても、ファシリティリストに投資窓口を、ファシリティの利用時間の生成方法を指数分布にし、平均に145を設定します。また、並列数に1を設定します。さらに共通設定のキューサイズを制限ありにし 10 にします。
パラメータ編集画面を開いて、シミュレーション時間に 500000 を入力します。
どの窓口に行列が出来るかを把握するには、アニメーション機能を用いると便利です。アニメーション機能とは、シミュレーション実行中に待ち行列の長さを色で知らせる機能です。これによりシミュレーション中にどこに待ち行列が発生しやすいかを視覚的に確認する事が出来ます。
アニメーションを利用するには、パラメータ編集画面でアニメーション表示をありにします。アニメーションの表示速度はスライドバーによって変更できます。
モデルを実行すると、待ち行列が発生している箇所に行列の長さと行列の上限数に対する割合が数値とグラデーションで表示されます。この例では、「預金受付」と「投資相談」に待ち行列が発生しやすい事が分かります。 また、預金窓口、融資窓口、投資窓口の表示はそれぞれの利用率を表しています。効率よく利用出来ていればここの値は常に高くなります。
製品の製造工程を考えます。 ここで考える製造工程は、製品の種類が1種類であり、複数の工程があり、工程ごとに使用する装置が異なる場合を考えます。 また、それぞれの工程で使用する装置は複数あり、それらは同時に利用することが可能である場合を想定します。
製品組み立てモデルは、パーツから製品を組み立てるモデルです。(図 52)
パーツは無限に供給されているとする。
製造工程は全部で4工程あります。
工程ごとに使用する装置が異なります。
装置は複数あります。
装置と装置の間にはバッファーがあります。
装置に続くバッファーが一杯な場合には装置は新たなパーツの処理を行えません。
装置の処理時間はランダムです。
具体的にはそれぞれの装置の同時処理数と処理時間は以下の通りとします。
| 装置 | 同時処理数 | 処理時間 |
|---|---|---|
| 装置1 | 3 | 平均 0.33333 の指数分布 |
| 装置2 | 2 | 平均 0.5 の指数分布 |
| 装置3 | 2 | 平均 0.2 の指数分布 |
| 装置4 | 3 | 平均 0.25 の指数分布 |
また、バッファーの大きさは以下の通りとします。
| バッファー | 場所 | サイズ |
|---|---|---|
| バッファー1 | 装置1と装置2の間 | 3 |
| バッファー2 | 装置2と装置3の間 | 1 |
| バッファー3 | 装置3と装置4の間 | 2 |
S4 Simulation System を起動し、ファイルメニューから「新規プロジェクト」を選択し、新規プロジェクトを作成します。 「新規プロジェクトの作成」ダイアログが表示されますので、プロジェクト名を「製造工程」と入力してください。 ブラウザパネルのワークスペースタブに作成されたプロジェクトが表示されます。 モデルをダブルクリックすると、モデル編集パネルに空のモデルが表示されます。 次に、製造工程モデルを作成していきます。
製造装置モデルでは、それぞれの装置で加工されるパーツをアイテムで表現します。 ブラウザパネルで「アイテムタブ」を選択してください。 アイテムタブの「アイテム」をドラッグし、モデル編集画面にドロップしてください。アイテムが配置されます。 アイテムはシミュレーション内に流れるパーツを表しますので、名前を「パーツ」と変更します。
製造工程では、まずパーツが供給されなくてはなりません。パーツの供給は「生成」部品で表現します。 ブラウザパネルの「部品」タブを選択し、生成部品をモデル編集画面に配置します。 この部品はパーツの供給を表しますので「パーツ供給」という名前に変更します。
装置がある部品を加工している間、ほかの部品は製造装置を利用することができません。 これは資源の排他的な利用になります。そこで、装置を「ファシリティ」で表現することにします。
ブラウザパネルで「資源」タブを選択し、資源タブから「ファシリティ」をモデル編集画面に配置します。 製造工程は4工程あり、それぞれ装置が異なります。そこで、ファシリティを4つモデル編集画面に配置します。 このファシリティは装置を表すので、それぞれ「装置1」、「装置2」、「装置3」、「装置4」と名前を変更します。
実際に製造装置を排他的に利用する製造工程を「ファシリティ利用」部品で表現します。 ブラウザパネルで「部品」タブを選択し、「ファシリティ利用」部品をモデル編集画面に配置します。 製造工程は4工程あるので、それぞれに対応して4つ配置します。 それぞれ「工程1」、「工程2」、「工程3」、「工程4」と名前を変更します。
完成した製品の出力を「終端」部品で表します。 ブラウザパネルで「部品」タブを選択し、「終端」部品をモデル編集画面に配置します。 終端部品は製品の出力を表すので「出荷」と名前を変更します。
製造工程におけるパーツの流れをリンクで表現します。 「パーツ供給」部品と「工程1」部品にリンクを作成します。 「工程1」部品と「工程2」部品にもリンクを作成します。 「工程2」部品と「工程3」部品にもリンクを作成します。 「工程3」部品と「工程4」部品にもリンクを作成します。 「工程4」部品と「出荷」部品にもリンクを作成します。
出来上がったプロジェクトは以下のようになります。(図 53)
パーツ供給の振る舞いを指定するために、「パーツ供給」を編集します。 「パーツ供給」部品をダブルクリックすると部品編集画面が表示されます。 「パーツ供給」部品では、パーツの供給を表現します。 この製造工程モデルではパーツの供給は無限大ですので、それを表現するために
| パラメータ名 | 値 |
|---|---|
| フローアイテム名 | Itemパーツ |
| 生成時間 | 0 |
| 生成最大数 | 無限大 |
と指定します。(図 54) これにより、パーツを無限に生成するという指定になります。
この指定では大量のパーツを生成するように見えますが、S4 Simulation System では、入力、出力ポートのキューサイズを コントロールすることにより、部品の動作を制限することができます。 この場合、「パーツ供給」部品につながる部品(工程1)の入力ポートのサイズを制限することで、実際には「パーツ供給」部品は、 「工程1」に空きがある場合のみ、パーツを供給するという動作になります。
装置の振る舞いを指定するために、「装置」を編集します。 「装置」をダブルクリックすると資源編集画面が表示されます。 この製造工程モデルでは、それぞれの装置での同時処理数が「装置1」が3、「装置2」が2、「装置3」が2、「装置4」が3 です。 同時処理数の指定は同時利用量を設定することで行います。 それぞれの「装置」の「同時利用量」にこの値を指定します。 (図 55)
また、「共通設定」タブをクリックし、「オブジェクト名」を変更します。 (図 56)
| 装置 | 同時利用量 | オブジェクト名 |
|---|---|---|
| 装置1 | 3 | WS1 |
| 装置2 | 2 | WS2 |
| 装置3 | 2 | WS3 |
| 装置4 | 3 | WS4 |
装置の利用の仕方を指定するために、「工程」部品を編集します。 「工程」部品をダブルクリックすると部品編集画面が表示されます。 この製造工程モデルでは、それぞれの装置を同時利用します。それを表現するために、 属性設定タブで以下のように指定します。(図 57)
| 工程 | ファシリティリスト | 利用時間 | 並列処理数 |
|---|---|---|---|
| 工程1 | WS1装置1 | 平均0.333の指数分布 | 3 |
| 工程2 | WS2装置2 | 平均0.5の指数分布 | 2 |
| 工程3 | WS3装置3 | 平均0.2の指数分布 | 2 |
| 工程4 | WS4装置4 | 平均0.25の指数分布 | 3 |
「工程」での並列数とは、装置に対してその利用を同時に要求する数となります。 「装置」は「工程」から要求を受け、装置が空いていればその要求に従い装置を指定された時間占有し、その後、解放します。 装置が空いていない場合には、装置が空くのを待ちます。 いくつまで待てるかがバッファーのサイズということになります。これを入力ポートのキューサイズで指定します。 「共通設定」タブの「入力」の「キューサイズ」を制限ありとし、それぞれの工程でのキューサイズを以下のように指定します。 (図 58)
| 工程 | キューサイズ |
|---|---|
| 工程1 | 0 |
| 工程2 | 3 |
| 工程3 | 1 |
| 工程4 | 2 |
出荷される製品数をカウントするために「出荷」部品を編集します。 「出荷」部品をダブルクリックすると部品編集画面が表示されます。 「共通設定」タブをクリックし、入力の「記録」を「有り」にします。(図 59) これにより、「出荷」部品へ入力した部品の数をカウントします。
製造工程モデルにおける実行パラメータを編集します。 「モデル」メニューの「パラメータを編集する」を選択し、パラメータ編集画面を開きます。 「基本設定」タブで以下の基本的な情報を設定します。(図 60)
| パラメータ名 | 値 |
|---|---|
| シミュレーション時間 | 96 |
| ウォームアップ時間 | 24 |
シミュレーション時間はシミュレーションを行う時間です。 ウォームアップ時間はシステムをウォームアップする時間です。 シミュレーション開始からウォームアップ時間まで、システムは実際のシミュレーションを行い状態変化しますが、 その結果は保存されません。
シミュレーションの評価関数を編集します。 ここでは、装置数をMとし、バッファ数をBとし、製造される製品数をnとし、 装置一つのコストを250万円、バッファ一つを10万円のコストがかかるとします。製品は一つ20万円で売れるとします。 この時、評価関数は以下のようになります。
\begin{aligned} F(M,B,n)=20 \times n-250 \times M-10 \times B \nonumber \end{aligned}
シミュレーションの評価関数は、分析スクリプトで設定することができます。 「モデル」の「分析スクリプトを編集する」を選択し、分析スクリプト編集画面を開きます。 objectiveの定義を以下のように書きます。
コード 1: objectiveの定義
「モデル」メニューから「モデルを開始する」を選択し、シミュレーションを開始します。 Informationウィンドウに実行結果が表示されます。おおよそ 3500万円 くらいの値になります。
シミュレーションは「What if」形式にさまざまに条件を変えながらその振る舞いを分析する手法です。 しかし、この方法では調べられる範囲が限られ、システムを最適化しようとするには不十分です。 ここでは、このようなシステムの振る舞いを最適にするパラメータを求めたい場合について考えてみます。
最適化では最適化すべき目的関数(先の例ではシミュレーションの評価関数)とその際のパラメータを指定します。 先ほどと同じように、装置数をMとし、バッファ数をBとし、製造される製品数をnとし、 装置一つのコストを250万円、バッファ一つを10万円のコストがかかるとします。製品は一つ20万円で売れるとします。 この時、目的関数は以下のようになります。
\begin{aligned} F(M,B,n)=20 \times n-250 \times M-10 \times B \nonumber \end{aligned}
また、装置数は全体で最大10とし、バッファサイズはそれぞれ最大10までとします。 よって、制約条件は以下のようになります。 \begin{aligned} M_{1}+M_{2}+M_{3}+M_{4} \leq 10 \nonumber \\ 1 \leq B_{1} \leq 10 \nonumber \\ 1 \leq B_{2} \leq 10 \nonumber \\ 1 \leq B_{3} \leq 10 \nonumber \\ 1 \leq B_{4} \leq 10 \nonumber \end{aligned}
製造工程モデルにおける最適化のためのパラメータを編集します。 「モデル」メニューの「パラメータを編集する」を選択し、パラメータ編集画面を開きます。 「パラメータ」タブでシミュレーションで用いる変数を定義します。 変数左上の「+」ボタンを押してを追加します。 変数名、生成方式、型、値は以下のように設定します。(図 65)
| 変数名 | 生成方式 | 型 | 値 |
|---|---|---|---|
| WS1 | 固定 | 整数 | 3 |
| WS2 | 固定 | 整数 | 2 |
| WS3 | 固定 | 整数 | 2 |
| WS4 | 固定 | 整数 | 3 |
| Buffer1 | 固定 | 整数 | 3 |
| Buffer2 | 固定 | 整数 | 1 |
| Buffer3 | 固定 | 整数 | 2 |
部品や資源の動作をこれらのパラメータを用いて記述します。 (図 62)
装置に関しては以下のようになります。
| 装置 | 同時利用容量 |
|---|---|
| 装置1 | self.param.WS1 |
| 装置2 | self.param.WS2 |
| 装置3 | self.param.WS3 |
| 装置4 | self.param.WS4 |
工程に関しては以下のようになります。
| 装置 | 並列処理の並列数 | 入力キューサイズ |
|---|---|---|
| 工程1 | param.WS1 | 0 |
| 工程2 | param.WS2 | self.param.Buffer1 |
| 工程3 | param.WS3 | self.param.Buffer2 |
| 工程4 | param.WS4 | self.param.Buffer3 |
これにより、実行時にこれらのパラメータを用いてシミュレーションが行われるようになります。
最適化の目的関数を編集します。 先ほどの評価関数を、最適化のパラメータを使って書きなおします。 「モデル」の「分析スクリプトを編集する」を選択し、分析スクリプト編集画面を開きます。 objectiveの定義を以下のように書きます。(図 63)
コード 2: objective の定義
このようにすることで、パラメータを変更した際に目的関数も変更されるようになります。
実行のオプションとして最適化実行を行う設定をします。 「モデル」メニューの「パラメータを編集する」を選択し、パラメータ編集画面を開きます。
まず、「基本設定」タブの「実行種類」を「最適化」にします。
次に、「最適化」タブで最適化に用いるパラメータを定義します。
「最適化設定」タブで最適化変数を「+」ボタンを押して追加します。 パラメータ名には先ほど設定したパラメータをコンボリストから選択し、以下のように設定します。 (図 65)
| パラメータ名 | 型 | 下限 | 上限 |
|---|---|---|---|
| WS1 | 整数 | 1 | 10 |
| WS2 | 整数 | 1 | 10 |
| WS3 | 整数 | 1 | 10 |
| WS4 | 整数 | 1 | 10 |
| Buffer1 | 整数 | 1 | 10 |
| Buffer2 | 整数 | 1 | 10 |
| Buffer3 | 整数 | 1 | 10 |
最適化のオプションは以下のように指定します。(図 66)
目的関数はデフォルトのself.objectiveのままで構いません。 シミュレーションの結果は確率的に変わるため、目的関数の値は一意に求めることができません。 そこで、シミュレーションの最適化においては、目的関数の期待値を計算します。期待値を計算するためのサンプル数が レプリケーションとなります。ここでは最大回数を指定することもできますし、目的関数の信頼区間で指定することもできます。 ここでは、デフォルトのまま最小回数と最大回数を5で行います。
S4 Simulation System では、最適化はOptuna(TPE)探索あるいは、Particle Swarm Optimizaton(PSO)と呼ばれる手法を用いて最適化を行います。 最適化変数がすべて整数の場合にはランダム・サーチを行います。 OptunaはPreferred Networks社によって提供されているハイパーパラメータ自動最適化フレームワークであり、TPE (Tree-Structured Parzen Estimator) サンプラーを用いたベイズ探索を行います。 最適化オプションではこれらのパラメータを設定します。今回のTutorialではデフォルトのまま行います。 この状態で「適用」ボタンを押し設定を反映させます。
次に「条件」タブをクリックし、最適化のための制約条件を指定します。 ウィンドウの上側には
コード 3: 変数
def makeConstraints():
WS1 = IntegerVariable(name = u'WS1', lower = 1, upper = 10)
WS2 = IntegerVariable(name = u'WS2', lower = 1, upper = 10)
WS3 = IntegerVariable(name = u'WS3', lower = 1, upper = 10)
WS4 = Variable(name = u'WS4', lower = 1, upper = 10)
Buffer1 = Variable(name = u'Buffer1', lower = 1, upper = 10)
Buffer2 = Variable(name = u'Buffer2', lower = 1, upper = 10)
Buffer3 = Variable(name = u'Buffer3', lower = 1, upper = 10)と表示されています。これは、最適化パラメータで指定した内容になります。 ウィンドウの下側でこれらの変数を用いて制約条件を記述します。 ここでは以下のように指定します。
「モデル」メニューから「モデルを開始する」を選択し、シミュレーション最適化を開始します。 最適化を実行すると以下の画面が表示されます。上から、最適化反復数、最適化経過時間、レプリケーション番号、 シミュレーション時間となります。(図 67)
最適化反復数は最適化のための反復数を表します。 最適化経過時間は最適化実行の経過時間を表します。 レプリケーション番号は一つのパラメータセットに対する目的関数の評価のためのレプリケーションの番号を表します。 シミュレーション時間は一つのレプリケーションにおけるシミュレーション時間を表します。
グラフ表示ボタンを押すと、最適化の実行結果、それぞれの変数の値がリアルタイムに表示されます。 (図 68)