Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package simulacion; import static java.lang.Math.floor; import org.apache.commons.math3.distribution.NormalDistribution; /** * * @author John */ public class Operaciones { public int[] invInc; //inventario inicial del dia i public int[] invFin; //inventario final del dia i public int[] demanda; //demanda diaria de i public int[] nroDem; //numero aleatorio demanda i public int[] falta; //faltante en el dia i, si no falta, asignar 0 public int[] orden; // numero de pedido realizado, si en i no se hace orden, asignar -1 public int oAct; //numero de orden actual public int[] nroEnt;//numero aleatorio entrega dia i, si no se usa en i, asignar -1 public int[] entrega; //tiempo de entrega dia i, si no se usa en i, asignar -1 public int[] nroEsp; //numero aleatorio tiempo de espera dia i, si no se usa en i, asignar -1 public int[] espera; //valor del numero de espera en i, si no se usa en i, asignar -1 public GenerarRandom randomD; //generador para la demanda public GenerarRandom randomEn; //generador para la entrega public GenerarRandom randomEs; //generador para la espera public int dias; private int i;//dia actual de la simulacion public int pR; //punto de reorden public int q; //cantidad a ordenar private boolean flag; //simboliza que se realizo un pedido private int diaEntrega; //dia en el cual se realizara la entrega de un pedido public Operaciones(int dias, int inicial, int[] pD, int[] eD, int[] pEn, int[] eEn, int[] pEs, int[] eEs, int reorden, int q) { //se inicia definiendo el numero de dias que se desean simular y los arreglos de probabilidades y equivalencias, ademas de el punto de reorden y Q asignados por el usuario invInc = new int[dias]; invInc[0] = inicial; invFin = new int[dias]; demanda = new int[dias]; nroDem = new int[dias]; orden = new int[dias]; nroEnt = new int[dias]; entrega = new int[dias]; nroEsp = new int[dias]; espera = new int[dias]; falta = new int[dias]; randomD = new GenerarRandom(pD, eD); randomEn = new GenerarRandom(pEn, eEn); randomEs = new GenerarRandom(pEs, eEs); this.dias = dias; oAct = 0; pR = reorden; flag = false; this.q = q; diaEntrega = 0; } public void iterar() { for (i = 0; i < dias; i++) { if (diaEntrega == i && flag == true) {//si se realizo un pedido y es un dia de entrega invInc[i] = invInc[i] + q; //se agrega la cantidad pedida al inventario inicial flag = false; } demanda[i] = randomD.randomizar();//asigna demanda diaria nroDem[i] = randomD.getNumero();//obtiene el numero aleatorio if (demanda[i] > invInc[i]) { falta[i] = demanda[i] - invInc[i];//si la demanda supera el inventario, se determina cuanto falta invFin[i] = 0;//el inventario final queda en 0 espera[i] = randomEs.randomizar();//se genera el tiempo de espera nroEsp[i] = randomEs.getNumero();//se obtiene le numero aleatorio } else { invFin[i] = invInc[i] - demanda[i];//si la demanda es menor o igual que el inventario, se resta y se obtiene el inventario final falta[i] = 0; //no falto inventario, por lo tanto se deja en 0 espera[i] = -1; nroEsp[i] = -1; } if (i < dias - 1) { invInc[i + 1] = invFin[i]; //el inventario inicial del siguiente dia es el inventario final del dia } reordenar(); } } public void reordenar() { if (invFin[i] < pR && flag == false) { //si el inventario final del dia es menor al punto de reorden y no se realizado un pedido entrega[i] = randomEn.randomizar(); //se genera un pedido con un tiempo de entrega aleatorio nroEnt[i] = randomEn.getNumero(); diaEntrega = i + entrega[i]; flag = true; oAct++; orden[i] = oAct; } else { orden[i] = -1; } } public int pReordenOpt(float k, float h, float cp) { NormalDistribution d = new NormalDistribution(); double mL = obtenerMedia(entrega); double mD = obtenerMedia(demanda); double mX = mL * mD; //System.out.println(obtenerVarianza(entrega)); double desvX = Math.sqrt((mL * obtenerVarianza(demanda)) + ((mD * mD) * obtenerVarianza(entrega))); double p = (h * Qopt(k, h)) / (cp * mD * 365); double valor = d.inverseCumulativeProbability(p); double z = 1 - valor; return (int) Math.round((z * desvX) + mX); } public int Qopt(float k, float h) {//k costo fijo, h costo almacenamiento double E = obtenerMedia(demanda) * 365;//calculo de la demanda promedio ANUAL return (int) Math.round(Math.sqrt((2 * k * E) / h)); } public double obtenerMedia(int[] e) { int sum = 0; int count = 0; for (int k = 0; k < e.length; k++) { if (e[k] != 0) { sum += e[k]; count++; } } return 1.0d * sum / count; } public double obtenerVarianza(int[] v) { double sum = 0; int count = 0; double m = obtenerMedia(v); for (int k = 0; k < v.length; k++) { if (v[k] != 0) { sum += Math.abs((v[k] - m) * (v[k] - m)); count++; } } return sum / count; } public int qvar(float k, float h, float s, int d) { //k: costo por ordenar ~ h: costo almacenamiento DIARIO ~ s: para qmin costo SIN espera, para qmax costo CON espera ~ d: para qmin valor minimo de demanda, para qmax valor maximo de la demanda return (int) Math.sqrt(((2 * k * d) * (h + s)) / (h * s)); } public double rvar(float k, float h, float s, int d, int l) {//l: tiempo de espera (menor para min, mayor para max) int t = qvar(k, h, s, d) / d; if (l < t) { return l * d; } else { double n = floor(l / t); return d * (l - (n * t)); } } }