/* A0840.java 8章4.解答 *    溶接の電流 * (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 A0840 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 = 20; /* 溶接工の人数 */ double A = 10.0; /* 平均発生間隔 */ double H = 4.0; /* 平均溶接時間 */ double DT = 0.5; /* 時刻増分 */ double T_END = 100.0; /* シミュレーションを終る時刻 */ double INF = 1.0e100; /* 十分大きい値 */ double EPS = 1.0e-100; /* 十分小さい値 */ double tt = 0.0; int j; int s[] = new int [M + 1]; double t[] = new double [M + 1]; int mm = 0; /* 同時使用数(電流値) */ double at; /* 次に状態の変化が起るまでの時間 */ double cp = 0.0; /* カレントポインタ */ /* スクリーンの大きさを読み取る */ width = getSize().width; height = getSize().height; /* グラフィクの準備 */ w.setWindow(0, 0.0,0.0,T_END,M, SPACE,height-SPACE,width-SPACE,SPACE); w.axis(0, "時間", T_END/10, "電流値", 1, g); w.moveTo(0, 0.0, 0.0, g); if (sw == true) { /* 初期設定 */ for (j = 1; j <= M; j ++) { s[j] = 0; t[j] = -A * Math.log(1.0 - Math.random()); } /* メイン */ while (tt <= T_END) { for (j = 1; j <= M; j ++) { if (Math.abs(t[j]) < EPS) { if (s[j] == 0) { s[j] = 1; t[j] = -H * Math.log(1.0 - Math.random()); mm = mm + 1; } else { s[j] = 0; t[j] = -A * Math.log(1.0 - Math.random()); mm = mm - 1; } } } g.setColor(Color.blue); w.lineTo(0, tt, cp, g); w.lineTo(0, tt, (double)mm, g); cp = (double)mm; /* 時間を進める */ 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; } } } }