/* S0820.java * 機械修理の問題 (固定時間方式) * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.text.DecimalFormat; public class S0820 extends Applet{ int M = 5; /* 機械の台数 */ int N = 2; /* 修理者の人数 */ double A = 10.0; /* 平均故障発生間隔 */ double H = 4.0; /* 平均修理時間 */ double DT = 0.5; /* 時刻増分 */ double T_END = 30.0; /* シミュレーションを終る時刻 */ 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の状態 */ int sn[] = new int[N + 1]; /* 修理者kの状態 */ int sq[] = new int[M + 1]; /* 待ち行列 */ double p[] = new double[M + 1]; /* 機械がf台故障している時間の割合 */ DecimalFormat exFormat1 = new DecimalFormat(" 0.000000"); g.drawString(" tt sm[j] sn[k] sq[i]", 10, 10); /* 開始 */ while (tt <= T_END) { /* (1)故障発生 */ for (j = 1; j <= M; j ++) { if (sm[j] == 0) { /* 機械が稼働中なら */ if ((1.0 / A * DT) > Math.random()) { //(2) sm[j] = 1; /* ある確率で故障する */ q = q + 1; /* (3)待ち行列の後ろにつく */ sq[q] = j; } } } /* (4)故障修理 */ for (k = 1; k <= N; k ++) { if (sn[k] == 0) { /* (5)修理者が未稼働なら */ if (q > 0) { sn[k] = sq[1]; /* 待ち行列から取り出す */ q = q - 1; if (q > 0) { for (i = 1; i <= q; i ++) { sq[i] = sq[i + 1]; /* (6)待ち行列を1進める */ } } } } else { if ((1.0 / H * DT) > Math.random()) { /* (7)修理者は機械を修理し */ sm[sn[k]] = 0; /* 稼働状態にする */ sn[k] = 0; } } } /* (8)表示 */ g.drawString(" " + 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; /* 故障している機械の台数を数える */ f = 0; for (j = 1; j <= M; j ++) { if (sm[j] == 1) { f = f + 1; } } p[f] = p[f] + DT; /* (9)時刻を進める */ tt =tt + DT; } /* 結果出力 */ for (j = 0; j <= M; j ++) { g.drawString("p["+ j + "]="+ " " + exFormat1.format((double)p[j] / T_END) ,10 , 20 + 10 * l + 10 * j); } } }