/* S0940.java * プライオリティ待ち合わシステム * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.text.DecimalFormat; public class S0940 extends Applet{ int N = 5; /* サービスチャンネル数 */ double A1 = 60.0; /* 高プライオリティ平均到着間隔 */ double A2 = 30.0; /* 低プライオリティ平均到着間隔 */ double H = 80.0; /* 平均サービス時間 */ int Q_LENGTH = 100 ; /* 待行列の最大の長さ */ double T_END = 1000000.0; /* シミュレーションを終る時刻 */ double INF = 1.0e100; /* 十分大きい値 */ double EPS = 1.0e-100; /* 十分小さい値 */ public void paint(Graphics g) { double tt = 0.0; /* シミュレーション時刻 */ int i, j, k; /* forのカウンタ */ int sn[] = new int[N + 1]; /* サービスチャンネルの状態 sn[k]==0:空き,sn[k]==1:ビジー*/ double tn[] = new double[N +1]; /* サービスチャンネルが次に変化を起こすまでの時間 */ double an[] = new double[N + 1]; /* サービスチャンネルの稼働率 */ double tq1[] = new double[Q_LENGTH + 1]; /* 高プライオリティ待ち行列についた時刻 */ double tq2[] = new double[Q_LENGTH + 1]; /* 低プライオリティ待ち行列についた時刻 */ double fq1[] = new double[Q_LENGTH + 1]; /* 高プライオリティ待ち行列が長さqである割合 */ double fq2[] = new double[Q_LENGTH + 1]; /* 低プライオリティ待ち行列が長さqである割合 */ int q1 = 0; /* 高プライオリティ待ち行列の長さ */ int q2 = 0; /* 低プライオリティ待ち行列の長さ */ int nn1 = 0; /* 高プライオリティでサービスを終えた客の数 */ int nn2 = 0; /* 低プライオリティでサービスを終えた客の数 */ double tm1; /* 高プライオリティの次に客が到着するまでの時間 */ double tm2; /* 低プライオリティの次に客が到着するまでの時間 */ double tw1; /* 高プライオリティの待ち時間 */ double tw2; /* 低プライオリティの待ち時間 */ double x1 = 0.0; /* tw1の和 */ double x2 = 0.0; /* tw2の和 */ double x21 = 0.0; /* tw1の自乗和 */ double x22 = 0.0; /* tw2の自乗和 */ double at; /* 時刻増分 */ int l = 10; /* 表示行 */ DecimalFormat exFormat1 = new DecimalFormat(" 0.000000"); /* 初期設定 */ tm1 = - A1 * Math.log(1.0 - Math.random()); tm2 = - A2 * Math.log(1.0 - Math.random()); for (k = 1; k <= N; k ++) { sn[k] = 0; tn[k] = INF; } /* 開始 */ while (tt <= T_END) { /* (1)高プライオリティ到着 */ if (Math.abs(tm1) < EPS) { tm1 = - A1 * Math.log(1.0 - Math.random()); q1 = q1 + 1; tq1[q1] = tt; } /* (2)低プライオリティ到着 */ if (Math.abs(tm2) < EPS) { tm2 = - A2 * Math.log(1.0 - Math.random()); q2 = q2 + 1; tq2[q2] = tt; } /* サービス */ for (k = 1; k <= N; k ++) { if (Math.abs(tn[k]) < EPS || sn[k] == 0 ) { /* tn[k]が0あるいはサービスチャンネルが空きのとき */ if (q1 > 0) { /* (3)高プライオリティの待行列 */ sn[k] = 1; tn[k] = - H / 2.0 * Math.log(Math.random() * Math.random()); tw1 = tt - tq1[1]; x1 = x1 + tw1; x21 = x21 + tw1 * tw1; nn1 = nn1 + 1; q1 = q1 - 1; if (q1 > 0) { for (i = 1; i <= q1; i++) { tq1[i] = tq1[i + 1]; } } } else if (q2 > 0) { /* (4)低プライオリティの待行列 */ sn[k] = 1; tn[k] = - H / 2.0 * Math.log(Math.random() * Math.random()); tw2 = tt - tq2[1]; x2 = x2 + tw2; x22 = x22 + tw2 * tw2; nn2 = nn2 + 1; q2 = q2 - 1; if (q2 > 0) { for (i = 1; i <= q2; i ++) { tq2[i] = tq2[i + 1]; } } } else { /* だれも待っていない */ sn[k] = 0; tn[k] = INF; } } } /* 次に状態変化の起る時刻を求める */ at = INF; if (tm1 < at) at = tm1; if (tm2 < at) at = tm2; for (k = 1; k <= N; k ++) { if (tn[k] < at) at = tn[k]; } /* 時間を進める */ tm1 = tm1 - at; tm2 = tm2 - at; for (k = 1; k <= N; k ++) { tn[k] = tn[k] - at; if (sn[k] > 0) { an[k] = an[k] + at;} } fq1[q1] = fq1[q1] + at; fq2[q2] = fq2[q2] + at; tt =tt + at; } /* 出力 */ for (k = 1; k <= N; k ++) { g.drawString(" an[" + k + "] =" + " " + exFormat1.format(an[k] / T_END) ,10 ,l); l = l +12; } l = l +12; for (q1 = 0; q1 <= 9; q1 ++) { g.drawString(" fq1[" + q1 + "] =" + " " + exFormat1.format(fq1[q1] / T_END) ,10 ,l); l = l +12; } l = l +12; for (q2 = 0; q2 <= 9; q2 ++) { g.drawString(" fq2[" + q2 + "] =" + " " + exFormat1.format(fq2[q2] / T_END) ,10 ,l); l = l +12; } l = l +12; g.drawString("高プライオリティの平均待ち時間 =" + exFormat1.format(x1 / nn1),10 , l); l = l +12; g.drawString("高プライオリティの待ち時間の標準偏差 =" + exFormat1.format(Math.sqrt((x21 - x1 * x1 / nn1) / nn1)) , 10 ,l); l = l +12; g.drawString("高プライオリティのサービスを受けた客の数 = " + nn1, 10 , l); l = l +12; l = l +12; g.drawString("低プライオリティの平均待ち時間 =" + exFormat1.format(x2 / nn2),10 , l); l = l +12; g.drawString("低プライオリティの待ち時間の標準偏差 =" + exFormat1.format(Math.sqrt((x22 - x2 * x2 / nn2) / nn2)) , 10 ,l); l = l +12; g.drawString("低プライオリティのサービスを受けた客の数 = " + nn2, 10 , l); l = l +12; } }