#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main(){
float wip[10], tp[10], ti[10], tpsum[4], wipsum[4];
long p[11][1001],
a[11][1001],
d[11][1001],
sowa[11], max;
int k, j, i, kn[100], n, m, z, q, kanban;
srand((unsigned)time(NULL));
printf("トヨタかんばん方式\n\n");
/*初期データおよび初期値の設定の開始*/
for (j = 1; j <= 3; ++j){
tpsum[j] = 0;
wipsum[j] = 0;
}
//工程数mの設定
m = 10;
//処理部品nの設定
n = 1000;
/*ai[j],di[j],kni[j] iがない場合:トヨタかんばん方式
i=2:CONWIP制御方式
i=3:入れ子型かんばん方式*/
/*a[i][j]:工程iでの部品jの処理開始時間*/
a[1][1] = 0;//1)第1工程の第1部品の処理開始時間の設定
/*d[i][j]:工程iでの部品jの処理完了時間*/
for (i = 0; i <= m; i++){
d[i][0] = 0;//2)i工程0番目の処理完了時間の設定
a[i][0] = 0;//3)i工程0番目の処理開始時間の設定
}
/*kn[i]:i+1工程からi工程へのかんばん枚数*/
/*かんばん枚数の設定*/
for (q = 1; q <= 1; q = q + 1){
for (k = 0; k <= 10; k = k + 2){
for (i = 1; i <= 9; i++){
kn[i] = k;
}
/*評価項目tpとwipの初期値の設定*/
tpsum[1] = 0;//トヨタかんばん方式
tpsum[2] = 0;//CONWIP制御方式
tpsum[3] = 0;//入れ子型かんばん方式
wipsum[1] = 0;//トヨタかんばん方式
wipsum[2] = 0;//CONWIP制御方式
wipsum[3] = 0;//入れ子型かんばん方式
for (z = 1; z <= 10; z++){
/*i工程での部品jの処理時間p[i][j]の設定:一様乱数or指数乱数*/
/*処理時間の設定*/
for (i = 1; i <= m; ++i){
for (j = 1; j <= n; ++j){
p[i][j] = rand() % 20 + 1;//4)処理時間pに乱数値を入れる。(一様乱数の場合)
}
}
/*トヨタかんばん方式*/
for (i = 1; i <= n; ++i){//5)iは部品番号
for (j = 1; j <= m; ++j){//6)jは工程番号
kanban = i - kn[i];//7)部品番号から各工程のかんばん枚数を引いた数をkanbanに代入
/*第1工程*/
if (j == 1){
if (kanban <= 0){//かんばんが発行されていない場合
a[j][i] = d[j][i - 1];//工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//工程jのi番目の処理完了時間
goto start1;
}
/*d[i][i-1]とa[2][i-kn[i]]の大小比較を行い処理開始時間、処理終了時間を決定する*/
if (d[j][i - 1] >= a[j + 1][kanban]){//8)後工程の処理開始時間より前工程の処理完了時間が大きい場合
a[j][i] = d[j][i - 1];//9)工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//10)工程jのi番目の処理完了時間
goto start1;
}
//後工程の処理開始時間より前工程の処理完了時間が小さい場合
a[j][i] = a[j + 1][kanban];//11)工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//12)工程jのi番目の処理完了時間
goto start1;
}
/*第2工程以降~最終の1つ前の工程まで*/
if (kanban <= 0){//13)かんばんが発行されていない場合
max = d[j - 1][i];//14)ひとつ前の工程のi番目の処理完了時間をmaxに入れる
if (d[j - 1][i] < d[j][i - 1]){//15後工程のi-1番目の処理完了時間より前工程のi番目の処理完了時間が大きい場合
a[j][i] = d[j][i - 1];//16)工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//17)工程jのi番目の処理完了時間
goto start1;
}
a[j][i] = d[j - 1][i];//18)工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//19)工程jのi番目の処理完了時間
goto start1;
}
/*20)かんばんが発行されている場合につき以下同様な決定処理をする*/
max = d[j - 1][i];//ひとつ前の工程のi番目の処理完了時間をmaxに入れる
if (d[j][i - 1] > max){//後工程のi-1番目の処理完了時間よりmaxが小さい場合
max = d[j][i - 1];//工程jのi-1番目の処理完了時間をmaxに入れる
}
if (a[j + 1][kanban] < max){//ひとつ後の工程のkanban番目の処理完了時間よりmaxが大きい場合
a[j][i] = max;//工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//工程jのi番目の処理完了時間
goto start1;
}
a[j][i] = a[j + 1][kanban];//工程jのi番目の処理開始時間
d[j][i] = a[j][i] + p[j][i];//工程jのi番目の処理完了時間
start1:;
}//for(j)
/*21)最終工程*/
if (d[j - 1][i] < d[j][i - 1]){//後工程のi-1番目の処理完了時間より前工程のi番目の処理完了時間が遅い場合
a[m][i] = d[j][i - 1];//工程jのi番目の処理開始時間
d[m][i] = a[m][i] + p[j][i];//工程jのi番目の処理完了時間
goto next;
}
a[m][i] = d[j - 1][i];//工程jのi番目の処理開始時間
d[m][i] = a[m][i] + p[j][i];//工程jのi番目の処理完了時間
next:;
}//for(i)
/*システム性能の評価*/
ti[1] = d[m][n] - a[1][1];//22)全稼働時間の計算(全体の処理完了時間-全体の処理開始時間)…①
tp[1] = m*n / ti[1];//23)第1の評価値(処理部品÷生産期間)…③
sowa[1] = 0;
for (i = 1; i <= n; ++i){
sowa[1] = sowa[1] + d[m][i] - a[1][i];//24)全部品の総処理時間(全行程の個体ごとの処理完了時間-全行程の個体ごとの処理開始時間の総和)…④
}
wip[1] = (float)sowa[1] / ti[1];//25)第2の評価値
tpsum[1] = tpsum[1] + tp[1];//⑥
wipsum[1] = wipsum[1] + wip[1];//⑦
}//for(z)
tpsum[1] = tpsum[1] / m;//26)生産率(⑥÷工程数)
wipsum[1] = wipsum[1] / m;//27)平均仕掛在庫量(⑦÷工程数)
/*結果の出力*/
printf("生産率TP[%d]=%f ", 1, tpsum[1]);
printf("平均仕掛在庫量WIP[%d]=%f ", 1, wipsum[1]);
printf("かんばん枚数kn[1]=%d kn[9]=%d\n", kn[1], kn[9]);
printf("\n");
}//for(k)
}//for(q)
return 0;
}