#!/usr/bin/perl -w

use 5.032;

my $C = 50; # coste unitario de compra
my $D = 100; # demanda anual en unidades
my $S = 3;   # coste fijo por ordenar un pedido
my $i = 0.05;    # tipo de interés para calcular el coste de inventario
my $H = $C*$i; # coste unitario de tener inventario
my $F = $C; # el valor del fallo se considera igual al de la compra, es decir, total
my $p = 0.1; # probabilidad del fallo anterior (lo contrario a la calidad)
# $Q = sqrt(2*$D*$S/$H);  # Qopt lote óptimo según modelo de Wilson 

# $Cd = 48;  # coste unitario con descuento procedente de una oferta   
# $Qd = 5; # lote en unidades de la oferta
# $Hd = $Cd*$i;

my ($CQ, $Qopt);
my $min = 99e99;
my ($CC, $CS, $CH, $CT); 
for my $Q (1..$D){
    $CC = $C*$D;  # coste de la compra anual
    $CS = $S*$D/$Q; # coste de los pedidos al año
    $CH = $H*$Q/2;  # coste anual del inventario medio
    $CQ = 0;
    $CQ += nocalidad($Q, $_) for (1..$Q); # coste de la calidad dicha por el coste esperado de los fallos
    $CT = $CC + $CS + $CH + $CQ; # coste total
    if ($CT <= $min){
	$min = $CT;
	$Qopt = $Q;
	say "$0 tamaño lote $Q ->   compra $CC   pedidos $CS   inventario $CH   calidad $CQ   =>   total $CT";
    }
}

exit 1;


sub nocalidad {
    my ($n, $m) = @_;
    if ($m >$n) { die "M mayor que N"; }
    my $nn = 1;
    my $mm = 1;
    for (2..$m){
        $mm *= $_;
    }
    for (($n-$m+1)..$n){
        $nn *= $_;
    }
    return ($nn/$mm) * ($p**$m) *$F; # el número de combinaciones de fallos se multiplica por su probabilidad y su valor
}

__END__

version 1 - only costs

Explicación: El coste de la calidad intuitivamente es mucho mayor que los costes tradicionales 
  asignados a un lote, como el de realizar el pedido o el de financiero de inventarios. El coste
  en un producto que puede fallar totalmente es todo el coste de compra por la probabilidad de fallo.


