/* S0830.java * 機械修理の問題 (変化点方式) * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.text.DecimalFormat; public class S0830 extends Applet{ int M = 5; /* 機械の台数 */ int N = 2; /* 修理者の人数 */ double A = 10.0; /* 平均故障発生間隔 */ double H = 4.0; /* 平均修理時間 */ double DT = 0.5; /* 時刻増分 */ double T_END = 100.0; /* シミュレーションを終る時刻 */ double INF = 1.0e100; /* 十分大きい値 */ double EPS = 1.0e-100; /* 十分小さい値 */ public void paint(Graphics g) { double tt = 0.0; /* シミュレーションクロック */ int i; /* 待ち行列のforのカウンタ */ int j; /* 機械のforのカウンタ */ int k; /* 修理者のforのカウンタ */ int f = 0; /* 故障している機械の台数 */ int q = 0; /* 待ち行列の長さ */ int l = 0; /* 表示行 */ int sm[] = new int[M + 1]; /* 機械jの状態 */ double tm[] = new double[M + 1]; /* (1)機械に次の状態変化が起るまでの時間 */ int sn[] = new int[N + 1]; /* 修理者kの状態 */ double tn[] = new double[N + 1]; /* (1)修理者に次の状態変化が起るまでの時間 */ int sq[] = new int[M + 1]; /* 待ち行列 */ double p[] = new double[M + 1]; /* (1)機械がf台故障している時間の割合 */ double at; /* 時刻増分 */ DecimalFormat exFormat1 = new DecimalFormat(" 0.000000"); DecimalFormat exFormat2 = new DecimalFormat(" 0.00"); g.drawString(" tt sm[j] sn[k] sq[i]", 10, 10); /* (2)初期設定 */ for (j = 1; j <= M; j ++) { sm[j] = 0; tm[j] = -A * Math.log(1 - Math.random()); } for (k = 1; k <= N; k ++) { sn[k] = 0; tn[k] = INF; } /* (3)開始 */ while (tt <= T_END) { /* 故障発生 */ for (j = 1; j <= M; j ++) { if (Math.abs(tm[j]) < EPS) { /* (4)機械jが故障発生 */ sm[j] = 1; tm[j] = INF; /* (5) */ q = q + 1; sq[q] = j; } } /* (6)故障修理 */ for (k = 1; k <= N; k ++) { if (Math.abs(tn[k]) < EPS) { /* (7)修理者kの修理が完了 */ sm[sn[k]] = 0; tm[sn[k]] = -A * Math.log(1 - Math.random()); /* (8) */ } if (Math.abs(tn[k]) 0) { /* (10)待ち行列を取り出す */ sn[k] = sq[1]; tn[k] = -H * Math.log(1 - Math.random()); q = q - 1; if (q > 0) { for (i = 1; i <= q; i ++) { sq[i] = sq[i + 1]; } } } else { /* 待ち行列が空なら修理者kは未稼働状態になる */ sn[k] = 0; tn[k] = INF; } } } /* (13)表示 */ g.drawString(" " + exFormat2.format(tt), 10, 20 + 10 * l); for (j = 1; j <= M; j ++) g.drawString(" " + sm[j], 50 + 10 * j, 20 + 10 * l ); for (k = 1; k <= N; k ++) g.drawString(" " + sn[k], 100 + 10 * M +10 * k, 20 + 10 * l ); for (i = 1; i <= q; i ++) g.drawString(" " + sq[i], 150+ 10 * (M + N) + 10 * i, 20 + 10 * l ); l= l + 1; /* (11)次に状態変化の起る時刻を求める */ at = INF; for (j = 1; j <= M; j ++) { if (tm[j] < at) at = tm[j]; } for (k = 1; k <= N; k++) { if (tn[k] < at) at = tn[k]; } /* (14)故障している機械の台数を数える */ f = 0; for (j = 1; j <= M; j ++) { if (sm[j] == 1) { f ++; } } p[f] = p[f] + at; /* (12)時間を進める */ for (j = 1; j <= M; j ++) { tm[j] = tm[j] - at; } for (k = 1; k <= N; k ++) { tn[k] = tn[k] - at; } tt = tt+ at; } /* 結果出力 */ for (j = 0; j <= M; j ++) { g.drawString("p["+ j + "]="+ " " + exFormat1.format((double)p[j] / T_END) ,10 , 20 + 10 * l + 10 * j); } } }