#!/usr/bin/perl -w

use 5.034;

# presupuestos ordenados de + a - y en U represupestar hacia arriba

# Requisitos: % incremento postivo máximo del total y de cada partida,
# incluyendo decrementos 

# Se aleatoriza dentro de los rangos y se mide la idoneidad por el mayor
# incremento postivos de las partidas de arriba (más prioridad)

# Esto se puede hacer a través de un índice de las mejores 3, 5, etc partidas

####

# año 2020, Ayto

############################################ (c) Jesús Lozano Mosterín, 2022 ###################################################################

# my $ingresos = 233_020_000;

my @gasto = qw(Personal CorrientesByS Financieros Transf_Corrientes Provisiones Inversiones Transf_Capital Activos_fin Pasivos_fin);
my @partida = qw(62008400 46165000 674714 88865500 400000 11268893 7956853 3614700 18864802);

my $ingresos = 0;
$ingresos += $_ for (@partida);

my @prio = qw(0 1 2 4 5 3 6 8 7);  # ordenación por prioridades

my $INCREMENTO = 0.06;  # este va a ser el objetivo
my $eps = 0.00001;
my ($low, $high) = (-0.05, 0.15);

####

my $n = scalar @partida;
my @r;
my $nsol = 4; # número de soluciones
my $c = 0;

my $resultant = $low;
my (@ppto, $result);
while (1){
    $r[$_-1] = (1 + $low + rand() * ($high-$low)) for (1 .. $n);
    @r = sort { $b <=> $a } @r;  # de más a menos
    
    my $s = 0;
    for my $i (1 .. $n){
	$ppto[$prio[$i-1]] = $r[$i-1] * $partida[$prio[$i-1]];
	$s += $ppto[$prio[$i-1]];
    }
    $result = ($s / $ingresos - 1);
    
    if ($result <= $INCREMENTO || $r[$prio[0]] >= $resultant){
	$resultant = $r[$prio[0]];
#	say "incr = $result   max = $r[0]";
	
	if ($result >= $INCREMENTO - $eps){
	    say "-" x 50;
	    for (@prio){
		say "$gasto[$_] = $ppto[$_] ($r[$_])";
	    }
	    say "\nIncremento = $result";
	    last if (++$c >= $nsol);
	}
    }
}

exit 3;


