import umontreal.iro.lecuyer.rng.*; import umontreal.iro.lecuyer.randvar.*; import umontreal.iro.lecuyer.probdist.PoissonDist; import umontreal.iro.lecuyer.stat.Tally; import umontreal.iro.lecuyer.util.*; public class Inventory { double lambda; // Mean demand size. double c; // Sale price. double h; // Inventory cost per item per day. double K; // Fixed ordering cost. double k; // Marginal ordering cost per item. double p; // Probability that an order arrives. RandomVariateGenInt genDemand; RandomStream streamDemand = new MRG32k3a(); RandomStream streamOrder = new MRG32k3a(); Tally statProfit = new Tally ("stats on profit"); public Inventory (double lambda, double c, double h, double K, double k, double p) { this.lambda = lambda; this.c = c; this.h = h; this.K = K; this.k = k; this.p = p; genDemand = new PoissonGen (streamDemand, new PoissonDist (lambda)); } // Simulates the system for m days, with the (s,S) policy, // and returns the average profit per day. public double simulateOneRun (int m, int s, int S) { int Xj = S, Yj; // Stock in the morning and in the evening. double profit = 0.0; // Cumulated profit. for (int j = 0; j < m; j++) { Yj = Xj - genDemand.nextInt(); // Subtract demand for the day. if (Yj < 0) Yj = 0; // Lost demand. profit += c * (Xj - Yj) - h * Yj; if ((Yj < s) && (streamOrder.nextDouble() < p)) { // We have a successful order. profit -= K + k * (S - Yj); Xj = S; } else Xj = Yj; } return profit / m; } // Performs n independent simulation runs of the system for m days, // with the (s,S) policy, and returns a report with a 90% confidence // interval on the expected average profit per day. public void simulateRuns (int n, int m, int s, int S) { for (int i = 0; i < n; i++) statProfit.add (simulateOneRun (m, s, S)); } public static void main (String[] args) { Chrono timer = new Chrono(); Inventory system = new Inventory (100.0, 2.0, 0.1, 10.0, 1.0, 0.95); system.simulateRuns (500, 2000, 80, 200); system.statProfit.setConfidenceIntervalStudent(); System.out.println (system.statProfit.report (0.9, 3)); System.out.println ("Total CPU time: " + timer.format()); } }