/* A0930.java 9章3.解答 * キャリア・センス形アロハシステム * (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 A0930 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; /* 端末の数 */ double R = 10.0; /* 再送信タイミング */ int NN_END = 5000; /* シミュレーションを終るパケットの数 */ double H_END = 0.8; /* hの最大 */ double INF = 1.0e100; /* 十分大きい値 */ double EPS = 1.0e-100; /* 十分小さい値 */ double tt; /* シミュレーション時刻 */ double a= 10; /* パケットを送り終って次の送るべきパケットが 発生するまでの平均時間 */ double h= 0.0; /* 平均パケット長 */ int i; /* forのカウンタ */ int j; /* forのカウンタ */ int s[] = new int [M + 1]; /* 端末の状態 s[j]=0,1,2,3 */ double t[] = new double [M + 1]; /* 端末が次に変化を起こすまでの時間 */ double tr[] = new double [M + 1]; /* 再送パケット伝送時間 */ double t0[] = new double [M + 1]; /* パケット伝送開始時刻 */ int ss; /* いずれかの端末が送信中の時ss=1 そうでないときss=0 */ int nn; /* 送信完了したパケットの数 */ double tw; /* 待ち時間の合計 */ double ts; /* 送信成功したパケット伝送時間の合計 */ double at; /* 次に状態の変化が起るまでの時間 */ /* スクリーンの大きさを読み取る */ width = getSize().width; height = getSize().height; /* グラフィクの準備 */ w.setWindow(0, 0.0,0.0,H_END,0.5, SPACE,height/2-SPACE/2,width-SPACE,SPACE); w.axis(0, "平均パケット長", 0.2, "through put", 0.05, g); w.setWindow(1, 0.0,0.0,H_END,20, SPACE,height-SPACE,width-SPACE,height/2+SPACE/2); w.axis(1, "平均パケット長", 0.2, "waiting time", 5, 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.05; ss = 0; nn = 0; tt = 0; tw = 0.0; ts = 0.0; for (j = 1; j <= M; j ++) { s[j] = 0; t[j] = - a * Math.log(1.0 - Math.random()); } /* 開始 */ while (nn <= NN_END) { for (j = 1; j <= M; j ++) { if (Math.abs(t[j]) < EPS) { switch(s[j]) { case 0: /* 送信パケット発生 */ t[j] = - h * Math.log(1.0 - Math.random()); tr[j] = t[j]; t0[j] = tt; if (ss == 1) { /* キャリアをセンス */ s[j] = 3; /* 再送信待ちへ */ t[j] = - R * Math.log(1.0 - Math.random()); } else { s[j] = 1; /* 送信中へ */ ss = 1; } break; case 1: /* 送信完了 */ nn = nn + 1; /* 統計をとる */ tw = tw + (tt - t0[j]); ts = ts + tr[j]; s[j] = 0; ss = 0; /* 電波空いた */ t[j] = - a * Math.log(1.0 - Math.random()); break; case 3: /* 再送信開始 */ if (ss == 1) { /* キャリアをセンス */ s[j] = 3; /* 再送信待ちへ */ t[j] = - R * Math.log(1.0 - Math.random()); } else { s[j] = 1; /* 送信中へ */ ss = 1; } break; } } } /* 時間を進める */ at = INF; for (j = 1; j <= M; j ++) { if (t[j] < at) at = t[j]; } for (j = 1; j <= M; j ++) { t[j] = t[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); } } } }