/* A1020.java 10章2.解答 * 在庫管理の問題  (定期入荷) * (C) H.Ishikawa 2008 */ package simulation; import java.applet.*; import java.awt.*; import java.awt.event.*; import java.text.DecimalFormat; import window.Window; public class A1020 extends Applet implements ActionListener { Button button0; public void init() { button0 = new Button(" 再実行 "); add(button0); button0.addActionListener(this); } public void actionPerformed(ActionEvent e) { String label = e.getActionCommand(); repaint(); } public void paint(Graphics g) { Window w ; w = new Window(); int SPACE = 30; int HIGHT = 400; int WIDTH = 640; int FRIDAY = 4; /* 入荷日は金曜日 */ long AL = 5; /* 1日の平均売上個数 */ double SP = 7000.0; /* 売値 */ double PC = 5000.0; /* 仕入れ単価 */ double C1 = 20.0; /* 1日1個当たりの在庫費用 */ double C2 = 10000.0; /* 1回の発注にともなう費用 */ double C3 = 500.0; /* 品切れ1個あたりの損失 */ long T_END = 10000; /* 終りの時刻 */ long A1_MIN = 10; long A1_MAX = 200; int l = SPACE; /* 表示行 */ long tt; /* シミュレーション日数 */ long a; /* 1回の入荷量 */ long q; /* 現在在庫量 */ long a1; /* 発注判断量 */ long k; /* 1日の売上個数 */ long zk; /* kの累計 */ long yk; /* 売上個数の累計 */ long ls; /* 在庫割れのため売り損なった個数 */ long nn; /* 発注回数 */ double sc1; /* 在庫費用の累計 */ double sc2; /* 発注費用の累計 */ double sc3; /* 品切れ損失の累計 */ double rr; /* 総売上 */ DecimalFormat exFormat1 = new DecimalFormat("0"); /*グラフィックの準備*/ w.setWindow(0, 0.0,0.0,A1_MAX,1.0e08, 5*SPACE,HIGHT-SPACE,WIDTH-SPACE,SPACE); w.axis(0, "a1", 10, "rr", 1e07, g); w.moveTo(0, 0.0, 0.0, g); g.drawString(" a1 rr" ,10 ,l);l = l + 12; /*メイン*/ for (a1 = A1_MIN; a1 <= A1_MAX; a1 = a1 + 10) { /* 初期設定 */ tt = 0; a = 0; q = a1; zk = 0; ls = 0; nn = 0; sc1 = 0.0; sc2 = 0.0; sc3 = 0.0; /* 1日分のシミュレーション */ while (tt <= T_END) { k = poisson(AL); /* k個売れた */ q = q - k; zk = zk + k; if (q < 0) { /* 在庫割れのため売り損ない */ ls = ls - q; q = 0; } if ((tt % 7) == (FRIDAY - 2)) { /* 入荷量決める日は金曜の2日前 */ a = a1 - q; /* a1と今日の在庫の差が入荷 */ if (a <= 0) { a = 0; } else { nn = nn + 1; } } if ((tt % 7) == FRIDAY) { /* 入荷日 */ q = q + a; } sc1 = q * C1 + sc1; tt = tt + 1; } sc2 = nn * C2; sc3 = ls * C3; yk = zk - ls; rr = (SP - PC) * yk - sc1 - sc2 - sc3; /* 総売上の計算 */ /* 出力 */ g.drawString(" " +a1 + " " + exFormat1.format(rr) , 10, l); l = l + 12; if (a1 == A1_MIN) { w.moveTo(0, a1, rr, g); } else { w.lineTo(0, a1, rr, g); } } } long poisson(double lambda) { /* ポアソン乱数発生 */ double xp = Math.random(); long k = 0; while (xp >= Math.exp(-lambda)) { xp = xp * Math.random(); k = k + 1; } return (k); } }