プロパティ値の追跡 - 例

<< 目次を表示 >>

ページ位置:  シミュレーション > ビジネスプロセスシミュレーション (BPSim) > プロパティ値の追跡 >

プロパティ値の追跡 - 例

BPMNビジネスプロセスモデルをBPSimでシミュレーションする場合の、プロパティ値について生成される情報の理解を助けるために、サンプルモデルファイル内に2つのサンプルが利用できます。この2つのサンプルとは、次のような内容です。

 

また、このページの最後には、時間に関するパラメータの扱いについての説明を補足しています。

 

 

Fibonacci - フィボナッチ数列の生成

このサンプルは、フィボナッチ数列の生成をビジネスプロセスと見立ててBPMNモデルを作成し、10回の繰り返しの結果を得るものです。それぞれの繰り返しごとにプロパティ値がどのように増えていくのかを知る方法を学ぶためのサンプルです。「サンプルプロジェクト | シミュレーション | BPSimモデル | Fibonacci」 にモデルがあります。

 

 

 

このプロセスを示す擬似コードが、ダイアグラム内にノート要素として配置してあります。 'print(next)' を実行すると、 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 のような配列を生成します。

 

このプロセスの BPSimの設定について説明します。ダイアグラム内の、BPSim設定の成果物要素Artifact1をダブルクリックし、BPSimの設定サブウィンドウを表示します。

 

#

操作方法

1

 

開始イベントStartEvent1要素の'制御'タブでは、'TriggerCount' が '1' に設定されています。また、 プロパティ タブではプロパティの初期値を指定しています。

  • 'N' が '10'
  • 'first' が '1'
  • 'second' が '1'
  • 'n' が '0'

2

次に、プロセス内の各アクティビティの'プロパティ'タブでプロパティを定義します。これらのプロパティ値は他の値を参照して定義されています。この場合には、{と}で囲まれて表現されます。

  • next=first+second - プロパティ 'next' を定義し、その値は式 {first} + {second} であることを示しています。

  • first=second - プロパティ 'first' を定義し、その値が {second}であることを示しています。
  • second=next - プロパティ 'second' を定義し、その値が {next}であることを示しています。
  • n++ - プロパティ 'n' を定義し、その値が {n} + 1であることを示しています。

(参照:パラメータ値ダイアログの利用)

3

'loopNode'ゲートウェイから出ている2つのシーケンスフローの'Condition'のプロパティ値を「制御」 タブから確認します。

ツリー内のGateway | loopNode の項目を展開します。

  • next=first+second - 制御パラメータの'Condition'の値として、式 {n}<{N} が設定されています。

  • EndEvent1 - 制御パラメータの'Condition'の値として、式 {n}=>{N} が記載されています。

4

これらの設定が完了したら、BPSimの設定ウィンドウの実行ボタンを押してBPSimシミュレーション 実行ツールの画面を呼び出します。左下の実行ボタンを押すと表示される選択肢から、標準シミュレーションを実行します。

シミュレーションが完了したら、属性ボタンを押します。

BPSimプロパティパラメータの値ダイアログが表示されますので、トークン数として0が設定されていることを確認してから、クエリボタンを押します。

5

これで、シミュレーション中の値を取得できますので、 'next' のプロパティ値の内容を確認していきます。「プロパティで分類」タブで、それぞれの繰り返しにおけるfirst=secondのアクティビティにおける値を確認できます。

この一覧に表示される内容が多い場合には、一覧のヘッダ部分を右クリックして表示されるメニューから「フィルタバーの表示/非表示」の項目を選択し、フィルタバーを表示します。このフィルタバーでfirst=secondのアクティビティの内容だけに絞り込むことができます。

 

 

 

Car Repair - 車の修理

より複雑な例として、車の修理に関するプロセスのサンプルがあります。このサンプルは、顧客が店に来て修理の見積もり依頼を行い、見積もりの内容を見てから修理を行うか、行わずに帰るか、というような流れになっています。このプロセスのそれぞれのアクティビティにおいて、プロパティ値の変化を確認できます。「サンプルプロジェクト | シミュレーション | BPSimモデル | Car Repair Process」 にモデルがあります。

 

プロセスの概要は下の図の通りです。

 

Repair Carのアクティビティはサブプロセスを保持しています。そのプロセスは以下のようになっています。

 

 

#

操作方法

1

サンプルが含まれるパッケージ内の、Car Repair Processアクティビティ要素の子ダイアグラムとして、Car Repairという名前のダイアグラムがありますので、ダブルクリックして開きます。

このダイアグラム内には、'Scenario 1: Main Flow'という名前のBPSim設定要素がありますので、ダブルクリックしてBPSimの設定サブウィンドウを開きます。

「シナリオ」タブ内の 'Duration'の値を確認して下さい。2日と12時間と設定されています。これは、このシミュレーションの実施期間を示しています。

2

左側のツリーから、StartEventの下にあるCustomer Arrivesの項目を選択します。「制御」タブ内の'InterTriggerTimer'の値を確認します。この値は24分に設定されています。これは、顧客が24分ごとに店に到着することを示しています。つまり、60時間(2日と12時間)では、150名の顧客が店に到着することになります。

それぞれの顧客は、修理して欲しい問題点が1つかそれ以上あります。具体的にどれだけの問題点があるかは、乱数で生成しています。BPSimでは、整数の乱数を生成しています。

この生成は、「プロパティ」タブ内の 'noOfIssues' プロパティ値で定義されています。値がPoisson(3)となっていて、3までの整数値を乱数で生成します。

3

次に、Gatewayの下にある'Accepted?'およびその子項目となる2つのコントロールフローの内容を確認します。'Initial Estimate Accepted'のコントロールフローの「制御」タブにある'Probability'パラメータの値は0.67になっています。もう1つのコントロールフロー'Initial Estimate Not Accepted'の「制御」タブ内のパラメータ'Probability'の値0.33になっています。つまり、3分の1の確率で、顧客は修理を依頼しないことが定義されています。

4

このプロセスでは、車に問題がある場合に、さらに別の問題がある可能性が定義されています。

Gatewayの項目の下には3つの「名称未設定」の項目がありますが、そのうちの1つは2つのコントロールフローを持ちます。1つは'New Issue Found'で、もう1つは'No Added Issue Found'です。片方の'Probability'パラメータの値は0.25で、もう1つは0.75です。つまり、ある問題が見つかった場合に、別の問題が見つかる可能性は4分の1と言うことが定義されています。

'New Issue Found'のコントロールフローは、'Handle New Found Issue'のアクティビティにつながります。このアクティビティでは、発見された問題の数(noOfIssues)に1を追加しています。このアクティビティ要素の'Property'タブに、プロパティ'noOfIssues'が定義され、その値は{noOfIssues} + 1 という式が設定されています。

5

車に関する問題を解決するアクティビティ'Repair Issue'では、対象の顧客について、発見された問題の数を1減らしています。このアクティビティ要素の'Property'タブに、プロパティ'noOfIssues'が定義され、その値は{noOfIssues} - 1 という式が設定されています。

6

'Repair Issue'アクティビティの先には'Have Further Issues?'という名前のゲートウェイ要素が存在します。

このゲートウェイ要素から出るコントロールフロー'More Issues to Repair'の「制御」タブにはConditionパラメータが定義されていて、その値として式 {noOfIssues} > 0 が設定されています。このフローは'Inspect for Issue'アクティビティにつながります。

同様に、'No More Issues to Repair'のコントロールフローの「制御」タブにはConditionパラメータが定義されていて、その値として式 {noOfIssues} =< 0 が設定されています。このフローは'Repairs Completed'終了イベントにつながります。

以上でこのシミュレーション対象のモデルの内容の確認が終わりです。実際にシミュレーションを実行します。

7

これらの設定が完了したら、BPSimの設定ウィンドウの実行ボタンを押してBPSimシミュレーション 実行ツールの画面を呼び出します。左下の実行ボタンを押すと表示される選択肢から、標準シミュレーションを実行します。

Token statusとして表示される内容が更新されていきます。ただし、この内容でシミュレーション結果を把握することは困難ですので、シミュレーションが完了したら、属性ボタンを押します。

BPSimプロパティパラメータの値ダイアログが表示されます

8

左側の一覧では、それぞれのプロパティ値の最大値および最小値が表示されます。例えば、'noOfIssues'プロパティについて、'Customer Arrives'アクティビティでは最小値が0・最大値が8になります。これは、Poisson (3)の式によって生成されました。

トークン番号の欄には、0から150までの値が指定可能です。この例では、指定した番号の順番の顧客の状況に該当します。(例: 10を指定すると、10人目の顧客がお店に来た場合の状況を確認できる)

指定後に「クエリ」ボタンを押して、指定した状況でのプロパティ値を確認できます。

  • 「要素で分類」タブでは、モデル内の要素ごとのプロパティ値を参照できます。例えば、24番目の顧客の場合には、'noOfIssues'の初期値は4から始まり(問題点が4つある顧客)、'Inspect for Issue'のアクティビティが6回呼ばれたことがわかります。値が3の内容が3回続きますが、これは、問題を修正後すぐに別の問題が見つかることが2回連続で続いたことを示しています。
  • 「プロパティで分類」タブでは、プロパティ値ごとに、モデル内の要素でどの値を取ったかを確認できます。'noOfIssues'の値(問題点の個数)は4から始まり、だんだんと数値(問題点の数)が減少していき、最後には0になったことが確認できます。

9

このようにして、トークン番号を変更しながら「クエリ」を実行することで、シミュレーション中の状況を調査することができます。

あとは、BPSimの設定の値を変えながら、モデルに対するシミュレーションを繰り返します。

 

 

整数値を利用するプロセスで、実数値に対応する

状況によっては、プロセス内のアクティビティの処理について、実数値をもつパラメータに対して整数値で条件を記載する場合があります。

 

このような状況では、条件として記載する内容に絶対値を含めないようにすることが重要です。例えば、何らかのカウンターの値が1ずつ減少する場合で、初期値が実数値である場合を考えます。もし、条件式として、'value==0' (0と等しい) あるいは 'value !=0' (0と等しくない) のような式を記述すると、完全に0と一致する場合しか意図したとおりの判定にはなりません。その結果として、無限ループに陥るなど意図したとおりの挙動にならない場合があります。こうした状況を避けるために、以下のような式を指定する必要があります。

 

'value > 0'

'value < 0'

'value >= 0'

'value <= 0'

 

また、別の方法として、BPSimエンジンで内部的に利用するテンプレートをカスタマイズする方法があります。

その手順の概要は次の通りです。

#

操作方法

1

「コード」リボン内の「ソースコード」パネルにある「設定」ボタンを押し、「コード生成テンプレート」を実行します。

2

コードテンプレートエディタのタブで、「言語」として「MDGBPSimExecutionEngineExtension」を選択します。

3

このテンプレートはJavaの言語を生成するテンプレートです。一覧から'MDGBPSimExecutionEngineExtension Compute Value'のテンプレートを選択します。

4

以下の行を探します。

double %bpsimPropertyParameterName% = (double) distribution.next();

この内容を、以下のように変更します。

 

%if bpsimPropertyParameterName == "noOfIssues" or  

bpsimPropertyParameterName == "noOfVisitors"%

double %bpsimPropertyParameterName% = (int) distribution.next();

//double %bpsimPropertyParameterName% = Math.ceil( distribution.next() );

//double %bpsimPropertyParameterName% = Math.floor( distribution.next() );

//double %bpsimPropertyParameterName% = Math.round( distribution.next() );

%else%

double %bpsimPropertyParameterName% = (double) distribution.next();

%endIf%

5

プロパティ値の名前を変更します。

6

保存ボタンを押し、変更内容を保存して下さい。

 

この例にあるように、それぞれのパラメータは整数値として指定された値を整数値として変換しています。その他、状況に応じてコメントアウトされているいずれかの行を採用することもできます。

 

 

時間のパラメータの振る舞い

BPSimの設定では、アクティビティに対して時間のパラメータを指定することができます。例えばQueue TimeやWait Timeなどが該当します。また、これらの値を結果の要求に含めることもできます。しかし、BPSimのシミュレーションエンジンではこれらの時間の値を単一のProcessing Timeとして扱います。

 

サンプルプロジェクトに含む TimeParameter  (サンプルプロジェクト | シミュレーション | BPSimモデル | TimeParameter) を例にします。以下のダイアグラムで表現されています。

 

 

Artifact2要素をダブルクリックすると、BPSimの設定タブが開きます。左側の階層一覧でActivityグループを展開し、ダイアグラム内にあるActivity1を選択します。右側の詳細欄で最初のTimeタブを選択すると、以下のように時間に関する設定が表示されます。

 

 

右上のパネルでは、時間に関するパラメータが7つ表示されています。この例では、それぞれの値として1, 2, 4, 8, 16, 32, 64分(1時間と4分)が指定されています。また、その全ての値に対して、平均値の結果の要求の設定が行われています。

この状況でシミュレーションを実行します。

実行ボタンを押し、 BPSim Simulation Controller ダイアログの実行ボタンで標準シミュレーションを選択します。シミュレーションは1回のみ実行されるように設定されています。シミュレーションが完了したら、結果の表示ボタンを押します。BPMN Simulation Report View で右クリックし、Show Only Non-Empty Itemsを選択します。Activity1要素の設定されているパラメータについてのみ表示されます。

 

 

これらの結果は、すべて127分になっています。この値は、元々のそれぞれのパラメータの値を足したものです。それぞれのパラメータの値が別々に扱われていないことがわかります。

 

ここで、BPSimシミュレーション実行ツールのダイアログに戻り、実行ボタンを押して「カスタマイズシミュレーション」を実行する場合と比較します。この場合には、集約されたパラメータProcessingTimeのみが表示され、その値は127になります。

 

 

 

参照: