/* S0970.java *    ポーリングシステム * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import window.Window; public class S0970 extends Applet implements ActionListener{ Button button0; Button button1; boolean sw = false; public void init() { button0 = new Button(" 実行 "); button1 = new Button("クリア"); add(button0); add(button1); button0.addActionListener(this); button1.addActionListener(this); } public void actionPerformed(ActionEvent e) { String label = e.getActionCommand(); if (label.equals(" 実行 ")) sw = true; else sw = false; repaint(); } public void paint(Graphics g) { Window w; w = new Window(); int height; int width; int SPACE = 30; int M = 8; /* 2次局の数 */ double HP = 0.001; /* ポーリング周期 */ double HF = 0.001; /* 空きフレーム伝送時間 */ int NN_END = 10000; /* シミュレーションを終るパケットの数 */ double H_END = 5.0; /* hの最大 */ double INF = 1.0e100; /* 十分大きい値 */ double EPS = 1.0e-100; /* 十分小さい値 */ double tt = 0.0; /* シミュレーション時刻 */ double a = 10; /* フレームを送り終ってから次の フレームが発生するまでの平均時間 */ double h = 0.0; /* 平均データ伝送時間 */ int j; /* forのカウンタ */ int sn; /* 1次局の状態 */ double tn; /* 1次局が次に変化を起こすまでの時間 */ int sm[] = new int [M + 1]; /* 2次局の状態 */ double tm[] = new double [M + 1]; /* 2次局が次に変化を起こすまでの時間 */ double t0[] = new double [M + 1]; /* ポーリング待ち状態に入った時刻 */ double tf[] = new double [M + 1]; /* 送信フレーム時間 */ int p; /* ポーリングをかけている2次局の番号 */ int nn; /* 送信完了したフレームの数 */ double tw; /* 待ち時間の合計 */ double ts; /* 送信したフレーム時間の合計 */ double at; /* 次に状態の変化が起るまでの時間 */ /* スクリーンの大きさを読み取る */ width = getSize().width; height = getSize().height; /* グラフィクの準備 */ w.setWindow(0, 0.0,0.0,H_END,1, SPACE,height/2-SPACE/2,width-SPACE,SPACE); w.axis(0, "平均パケット長", 1.0, "through put", 0.2, g); w.setWindow(1, 0.0,0.0,H_END,40, SPACE,height-SPACE,width-SPACE,height/2+SPACE/2); w.axis(1, "平均パケット長", 1.0, "waiting time", 5.0, g); w.moveTo(0, 0.0, 0.0, g); w.moveTo(1, 0.0, 0.0, g); if (sw == true) { while (h < H_END) { /* 初期設定 */ h = h + 0.5; nn = 0; tt = 0; tw = 0.0; ts = 0.0; sn = 0; tn = HP; for (j = 1; j <= M; j ++) { sm[j] = 0; tm[j] = - a * Math.log(1.0 - Math.random()); } p = 1; /* 開始 */ while (nn < NN_END) { /* (1)1次局のシミュレーション */ if (Math.abs(tn) < EPS) { switch(sn) { case 0: /* ポーリング完了 */ if (sm[p] == 1) { /* 2次局pに送るべきデータがある場合 */ sn = 1; tn = INF; /* (2)1次局は状態1へ */ tm[p] = 0.0; /* (8)2次局pのtm[p]を0とする */ } else { sn = 2; tn = HF; /* 1次局は状態2へ */ } break; case 1: /* データフレーム受信完了 */ case 2: /* 空フレーム受信完了 */ sn = 0; tn = HP; /* (4)1次局は状態0へ */ if (p < M) { p = p + 1;} else {p = 1;} /* (5)ポーリング番号を1増加 */ break; } } /* (6)2次局のシミュレーション */ for (j = 1; j <= M; j ++) { if (Math.abs(tm[j]) < EPS) { switch(sm[j]) { case 0: /* 送るべきフレーム発生 */ sm[j] = 1; tm[j] = INF; /* (7)状態1へ */ t0[j] = tt; /* (9) */ break; case 1: /* ポーリング待へ */ /* 次の送信フレーム */ sm[j] = 2; tm[j] = - h * Math.log(1.0 - Math.random()); tf[j] = tm[j]; tn = tm[j]; /* (3)1次局のtnをtm[j]と同じ値とする */ break; case 2: /* フレーム送信完了 */ /* 統計をとる */ nn = nn + 1; tw = tw + (tt - t0[j]); /* (10) */ ts = ts + tf[j]; sm[j] = 0; /* 状態0へ */ tm[j] = - a * Math.log(1.0 - Math.random()); break; } } } /* 時間を進める */ at = INF; if (tn < at) at = tn; for (j = 1; j <= M; j ++) { if (tm[j] < at) at = tm[j]; } tn = tn - at; for (j = 1; j <= M; j ++) { tm[j] = tm[j] - at; } tt =tt + at; } /* 出力 */ g.setColor(Color.green); w.lineTo(0, h, ts / tt, g); g.setColor(Color.blue); w.lineTo(1, h, tw / nn, g); } /* 次のhへ */ } } }