fork(5) download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<math.h>
  5.  
  6. int main(){
  7. float wip[10], tp[10], ti[10], tpsum[4], wipsum[4];
  8. long p[11][1001],
  9. a[11][1001],
  10. d[11][1001],
  11. sowa[11], max;
  12. int k, j, i, kn[100], n, m, z, q, kanban;
  13.  
  14. srand((unsigned)time(NULL));
  15.  
  16. printf("トヨタかんばん方式\n\n");
  17. /*初期データおよび初期値の設定の開始*/
  18. for (j = 1; j <= 3; ++j){
  19. tpsum[j] = 0;
  20. wipsum[j] = 0;
  21. }
  22.  
  23. //工程数mの設定
  24. m = 10;
  25. //処理部品nの設定
  26. n = 1000;
  27. /*ai[j],di[j],kni[j]  iがない場合:トヨタかんばん方式
  28. i=2:CONWIP制御方式
  29. i=3:入れ子型かんばん方式*/
  30. /*a[i][j]:工程iでの部品jの処理開始時間*/
  31.  
  32. a[1][1] = 0;//1)第1工程の第1部品の処理開始時間の設定
  33.  
  34. /*d[i][j]:工程iでの部品jの処理完了時間*/
  35. for (i = 0; i <= m; i++){
  36. d[i][0] = 0;//2)i工程0番目の処理完了時間の設定
  37. a[i][0] = 0;//3)i工程0番目の処理開始時間の設定
  38. }
  39. /*kn[i]:i+1工程からi工程へのかんばん枚数*/
  40. /*かんばん枚数の設定*/
  41. for (q = 1; q <= 1; q = q + 1){
  42.  
  43. for (k = 0; k <= 10; k = k + 2){
  44. for (i = 1; i <= 9; i++){
  45.  
  46. kn[i] = k;
  47. }
  48.  
  49.  
  50. /*評価項目tpとwipの初期値の設定*/
  51. tpsum[1] = 0;//トヨタかんばん方式
  52. tpsum[2] = 0;//CONWIP制御方式
  53. tpsum[3] = 0;//入れ子型かんばん方式
  54.  
  55. wipsum[1] = 0;//トヨタかんばん方式
  56. wipsum[2] = 0;//CONWIP制御方式
  57. wipsum[3] = 0;//入れ子型かんばん方式
  58.  
  59. for (z = 1; z <= 10; z++){
  60. /*i工程での部品jの処理時間p[i][j]の設定:一様乱数or指数乱数*/
  61. /*処理時間の設定*/
  62. for (i = 1; i <= m; ++i){
  63. for (j = 1; j <= n; ++j){
  64. p[i][j] = rand() % 20 + 1;//4)処理時間pに乱数値を入れる。(一様乱数の場合)
  65. }
  66. }
  67.  
  68.  
  69. /*トヨタかんばん方式*/
  70. for (i = 1; i <= n; ++i){//5)iは部品番号
  71. for (j = 1; j <= m; ++j){//6)jは工程番号
  72. kanban = i - kn[i];//7)部品番号から各工程のかんばん枚数を引いた数をkanbanに代入
  73.  
  74. /*第1工程*/
  75. if (j == 1){
  76. if (kanban <= 0){//かんばんが発行されていない場合
  77.  
  78. a[j][i] = d[j][i - 1];//工程jのi番目の処理開始時間
  79. d[j][i] = a[j][i] + p[j][i];//工程jのi番目の処理完了時間
  80. goto start1;
  81. }
  82. /*d[i][i-1]とa[2][i-kn[i]]の大小比較を行い処理開始時間、処理終了時間を決定する*/
  83. if (d[j][i - 1] >= a[j + 1][kanban]){//8)後工程の処理開始時間より前工程の処理完了時間が大きい場合
  84. a[j][i] = d[j][i - 1];//9)工程jのi番目の処理開始時間
  85. d[j][i] = a[j][i] + p[j][i];//10)工程jのi番目の処理完了時間
  86. goto start1;
  87. }
  88. //後工程の処理開始時間より前工程の処理完了時間が小さい場合
  89. a[j][i] = a[j + 1][kanban];//11)工程jのi番目の処理開始時間
  90. d[j][i] = a[j][i] + p[j][i];//12)工程jのi番目の処理完了時間
  91. goto start1;
  92. }
  93.  
  94. /*第2工程以降~最終の1つ前の工程まで*/
  95. if (kanban <= 0){//13)かんばんが発行されていない場合
  96. max = d[j - 1][i];//14)ひとつ前の工程のi番目の処理完了時間をmaxに入れる
  97. if (d[j - 1][i] < d[j][i - 1]){//15後工程のi-1番目の処理完了時間より前工程のi番目の処理完了時間が大きい場合
  98. a[j][i] = d[j][i - 1];//16)工程jのi番目の処理開始時間
  99. d[j][i] = a[j][i] + p[j][i];//17)工程jのi番目の処理完了時間
  100. goto start1;
  101. }
  102. a[j][i] = d[j - 1][i];//18)工程jのi番目の処理開始時間
  103. d[j][i] = a[j][i] + p[j][i];//19)工程jのi番目の処理完了時間
  104. goto start1;
  105. }
  106. /*20)かんばんが発行されている場合につき以下同様な決定処理をする*/
  107. max = d[j - 1][i];//ひとつ前の工程のi番目の処理完了時間をmaxに入れる
  108. if (d[j][i - 1] > max){//後工程のi-1番目の処理完了時間よりmaxが小さい場合
  109. max = d[j][i - 1];//工程jのi-1番目の処理完了時間をmaxに入れる
  110. }
  111. if (a[j + 1][kanban] < max){//ひとつ後の工程のkanban番目の処理完了時間よりmaxが大きい場合
  112. a[j][i] = max;//工程jのi番目の処理開始時間
  113. d[j][i] = a[j][i] + p[j][i];//工程jのi番目の処理完了時間
  114. goto start1;
  115. }
  116. a[j][i] = a[j + 1][kanban];//工程jのi番目の処理開始時間
  117. d[j][i] = a[j][i] + p[j][i];//工程jのi番目の処理完了時間
  118.  
  119. start1:;
  120. }//for(j)
  121. /*21)最終工程*/
  122. if (d[j - 1][i] < d[j][i - 1]){//後工程のi-1番目の処理完了時間より前工程のi番目の処理完了時間が遅い場合
  123. a[m][i] = d[j][i - 1];//工程jのi番目の処理開始時間
  124. d[m][i] = a[m][i] + p[j][i];//工程jのi番目の処理完了時間
  125. goto next;
  126. }
  127. a[m][i] = d[j - 1][i];//工程jのi番目の処理開始時間
  128. d[m][i] = a[m][i] + p[j][i];//工程jのi番目の処理完了時間
  129. next:;
  130. }//for(i)
  131.  
  132. /*システム性能の評価*/
  133. ti[1] = d[m][n] - a[1][1];//22)全稼働時間の計算(全体の処理完了時間-全体の処理開始時間)…①
  134.  
  135.  
  136. tp[1] = m*n / ti[1];//23)第1の評価値(処理部品÷生産期間)…③
  137. sowa[1] = 0;
  138.  
  139. for (i = 1; i <= n; ++i){
  140. sowa[1] = sowa[1] + d[m][i] - a[1][i];//24)全部品の総処理時間(全行程の個体ごとの処理完了時間-全行程の個体ごとの処理開始時間の総和)…④
  141. }
  142.  
  143. wip[1] = (float)sowa[1] / ti[1];//25)第2の評価値
  144. tpsum[1] = tpsum[1] + tp[1];//⑥
  145. wipsum[1] = wipsum[1] + wip[1];//⑦
  146.  
  147.  
  148. }//for(z)
  149.  
  150. tpsum[1] = tpsum[1] / m;//26)生産率(⑥÷工程数)
  151. wipsum[1] = wipsum[1] / m;//27)平均仕掛在庫量(⑦÷工程数)
  152. /*結果の出力*/
  153. printf("生産率TP[%d]=%f ", 1, tpsum[1]);
  154. printf("平均仕掛在庫量WIP[%d]=%f ", 1, wipsum[1]);
  155. printf("かんばん枚数kn[1]=%d kn[9]=%d\n", kn[1], kn[9]);
  156.  
  157. printf("\n");
  158. }//for(k)
  159. }//for(q)
  160.  
  161. return 0;
  162. }
  163.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty