/* S0930.java * 即時式入線無限大のシステム * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.text.DecimalFormat; public class S0930 extends Applet{ int N = 4; /* サービスチャンネル数 */ double A = 10.0; /* 呼びの発生間隔 */ double H = 10.0; /* 平均保留時間 */ 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]; /* サービスチャンネルの状態 */ double tn[] = new double[N +1]; /* サービスチャンネルが次に変化を起こすまでの時間 */ double an[] = new double[N + 1]; /* サービスチャンネルの稼働率 */ int nn = 0; /* サービスを終えた客の数 */ double tm; /* 次に呼びが生起するまでの時間 */ int busy; /* 全チャンネルビジーの時1 */ int bb = 0; /* 損失となった呼びの数 */ double at; /* 時刻増分 */ int l = 10; /* 表示行 */ DecimalFormat exFormat1 = new DecimalFormat(" 0.000000"); /* 初期設定 */ tm = - A * 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(tm) < EPS) { nn = nn + 1; busy = 1; for (k = 1; k <= N; k ++) { if ( sn[k] == 0) { /* 空きチャンネルを探す */ sn[k] = 1; tn[k] = - H * Math.log(1.0 - Math.random()); busy = 0; break; } } if (busy == 1) { bb = bb + 1; } tm = - A * Math.log(1.0 - Math.random()); } /* (2)チャンネルが空いた時の処理 */ for (k = 1; k <= N; k ++) { if (Math.abs(tn[k]) < EPS) { sn[k] = 0; tn[k] = INF; } } /* 次に状態変化の起る時刻を求める */ at = INF; if (tm < at) at = tm; for (k = 1; k <= N; k++) { if (tn[k] < at) at = tn[k]; } /* 時間を進める */ tm = tm - at; for (k = 1; k <= N; k++) { tn[k] = tn[k] - at; if (sn[k] > 0) { an[k] = an[k] + 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; g.drawString("呼損率 = " + exFormat1.format((double)bb / nn), 10 ,l); } }