2009年08月11日

ドラム・バッファー・ロープ(DBR)の簡易プログラム



工程管理哲学の制約理論(TOC)に、ドラム・バッファ・ロープ(DBR)という考え方がある。

* ドラム-バッファ-ロープ(Drum-Buffer-Rope)
"同期生産"(SM)の基本的な原理は出口がひとつしかない講堂の例で説明できる。もし人々が講堂から出るように指示されるとき、人々がドアを通り抜けるペースは、講堂の中の人数によらず同じである。戸口の様子は、人々が出て行ける割合(人数/時間)を決定する。工場が一定数の製品を一定の期間に製造する限界値は与えられた期間に戸口から出て行ける人数に例えられる。工程中の原材料は講堂のなかの人数のようである。

手にすることができる商品の現実が工場生産と単純には相関しないということは最も基本的で重要なSMの基盤のひとつである。

参考として、DBRが要約されている"The Goal"の第37章を参照されたい。

wikiには小難しく書いてあるけど、要するに

『製造工程中の一番スループット遅い工程(ボトルネック)に資源量の供給を合わせれば、リードタイム(資源が工程開始から工程終了までにかかる時間)や在庫を短縮できる。逆に言えばボトルネックのスループットを上げれば生産量が増やせる。』

という事ですです。 んで、これを簡単に体感できるプログラムって見た事無いなって思ったので、作ってみた。
◆仕様
 実装を簡単にする為に、下記のような仕様とする。
 1.工程はA,B,Cの3工程
 2.資源はA→B→Cと流れる
 3.工程Aへの資源供給は工程Aのスループット丁度量とする
 
◆工程設定
 工程Aスループット:
 工程Bスループット:
 工程Cスループット:
 

◆実行
 
 
 経過時間:
 工程Bの在庫量
 工程Cの在庫量
 処理完了資源:
 資源当たりの平均リードタイム:

100回実行した際の数値は、
case 1.
 工程Aスループット:10
 工程Bスループット:2
 工程Cスループット:8
  
 工程Bの在庫量:794
 工程Cの在庫量:2
 処理完了資源:194
 資源当たりの平均リードタイム:41.79381443298969
case 2.
 工程Aスループット:2
 工程Bスループット:2
 工程Cスループット:2
  
 工程Bの在庫量:2
 工程Cの在庫量:2
 処理完了資源:194
 資源当たりの平均リードタイム:3

という結果になり、case2の場合の方がcase1に比べて「在庫量,平均リードタイム」が優れている。
この考え方ゲームに使えそうだよなー(シュミレーション系とか、シムシティ系とか)。

以下ソース

<html>
<head>
<title>制約理論:ドラム・バッファー・ロール</title>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery","1.3");</script>

<script type="text/javascript">
function material()
{
this.time = 0; //経過時間
};
function station(throughput)
{
this.stocks = new Array(); //在庫
this.throughput = throughput; //スループット(処理量)
};
station.prototype =
{
//更新
proc : function()
{
ret = new Array();
//マテリアル毎の経過時間を加算
for(var i = 0;i < this.stocks.length;i++)
{
this.stocks[i].time += 1;
}
//処理が終わった要素を抜き出す
for(var i = 0;(i<this.throughput)&&(this.stocks.length!=0);i++)
{
ret.push(this.stocks.shift());
}

return ret;
},
//ストック追加
add : function(stocks)
{
this.stocks = this.stocks.concat(stocks);
}
};

//各工程作成
st_a = new station(0);
st_b = new station(0);
st_c = new station(0);
dones = new Array();

//設定
function setting()
{
st_a = new station(Number($("#station_a").val()));
st_b = new station(Number($("#station_b").val()));
st_c = new station(Number($("#station_c").val()));
dones = new Array();
$("#station_b_stock").val(0);
$("#station_c_stock").val(0);
$("#time").val(0);
$("#dones_num").val(0);
$("#leadtime").val(0);
};

//処理
function proc(times)
{
for(var cnt=0;cnt<times;cnt++)
{
//工程Aは、無条件でスループット分の処理を追加
var sourceMaterials = new Array();
for(var i=0;i<st_a.throughput;i++)
{
sourceMaterials.push(new material());
}

var dones_a = st_a.proc();
var dones_b = st_b.proc();
var dones_c = st_c.proc();

st_a.add(sourceMaterials);
st_b.add(dones_a);
st_c.add(dones_b);

dones = dones.concat(dones_c);

}

$("#station_b_stock").val(st_b.stocks.length);
$("#station_c_stock").val(st_c.stocks.length);
$("#time").val(Number($("#time").val())+times);
$("#dones_num").val(dones.length);

var leadtime = 0;
if(dones.length!=0)
{
for(var i=0;i<dones.length;i++)
{
leadtime += dones[i].time;
}
leadtime /= dones.length;
}

$("#leadtime").val(leadtime);
};

$(function (){
setting();
});
</script>
</head>
<body>
◆工程設定<br>
 工程Aスループット:<input type="text" id="station_a" value="10"></input><br>
 工程Bスループット:<input type="text" id="station_b" value="2"></input><br>
 工程Cスループット:<input type="text" id="station_c" value="8"></input><br>
 <input type="button" value="設定更新" onclick="setting();"></input>
<br>
◆実行<br>
 <input type="button" value="処理1回実行" onclick="proc(1);"></input><br>
 <input type="button" value="処理10回実行" onclick="proc(10);"></input><br>
 経過時間:<input type="text" id="time" value="0"></input><br>
 工程Bの在庫量<input type="text" id="station_b_stock" value="0"></input><br>
 工程Cの在庫量<input type="text" id="station_c_stock" value="0"></input><br>
 処理完了資源:<input type="text" id="dones_num" value="0"></input><br>
 資源当たりの平均リードタイム:<input type="text" id="leadtime" value="0"></input><br>
</body>
</html>




posted by purigen at 23:56| Comment(0) | TrackBack(0) | 雑考 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。