/* S1020.java * 在庫管理の問題 * (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 S1020 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; long A = 100; /* 1回の入荷量 */ long AL = 5; /* 1日の平均売上個数 */ long ET = 6; /* 納品するまでの平均日数 */ long ST = 2; /* 納品するまでの日数の標準偏差 */ 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 Q1_MAX = 100; /* q1の最大値 */ long tt; /* シミュレーション日数 */ long q; /* 現在在庫量 */ long q1; /* 発注点 */ long k; /* 1日の売上個数 */ long zk; /* kの累計 */ long yk; /* 売上個数の累計 */ long ls; /* 在庫割れのため売り損なった個数 */ long nn; /* 発注回数 */ long lt; /* 入荷遅れ日数 */ double sc1; /* 在庫費用の累計 */ double sc2; /* 発注費用の累計 */ double sc3; /* 品切れ損失の累計 */ double rr; /* 総売上 */ int l = SPACE; /* 表示行 */ DecimalFormat exFormat1 = new DecimalFormat("0"); /*グラフィックの準備*/ w.setWindow(0, 0.0,0.0,Q1_MAX,1.0e08, 5*SPACE,HIGHT-SPACE,WIDTH-SPACE,SPACE); w.axis(0, "q1", 10, "rr", 1e07, g); w.moveTo(0, 0.0, 0.0, g); g.drawString(" q1 rr" ,10 ,l);l = l + 12; /*メイン*/ for (q1 = 0; q1 <= Q1_MAX; q1 = q1 + 5) { /* q1を0からQ1_MAXまで変化させ                          シミュレーションを行う */ /* 初期設定 */ tt = 0; q = A; zk = 0; ls = 0; nn = 0; lt = -1; 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 < q1 && lt < 0) { /* 発注点を割ったので発注する */ lt = (long)normal(ET, ST); nn = nn + 1; } if (q < 0) { /* 在庫割れのため売り損ない */ ls = ls - q; q = 0; } if (lt == 0) { /* 入荷 */ q = q + A; } sc1 = q * C1 + sc1; lt = lt - 1; tt = tt + 1; } sc2 = nn * C2; sc3 = ls * C3; yk = zk - ls; rr = (SP - PC) * yk - sc1 - sc2 - sc3; /* 総売上の計算 */ /* 出力 */ g.drawString(" " + q1 + " " + exFormat1.format(rr) , 10, l); l = l + 12; if (q1 == 0) { w.moveTo(0, q1, rr, g); } else { w.lineTo(0, q1, 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); } double normal(double ex, double sd) { /* 正規乱数発生 */ double xw = 0.0; double x; long n; for (n = 1;n <= 12; n ++) { xw = xw + Math.random(); } x = sd * (xw - 6.0) + ex; return (x); } }