simulacion.Operaciones.java Source code

Java tutorial

Introduction

Here is the source code for simulacion.Operaciones.java

Source

/*
 * 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));
        }

    }

}