#!/usr/bin/perl -w

use strict;

my $existe = `which glpsol`;

die "You doesn't have glpsol from glpk package. Exiting." if length($existe) < 3;


# Digamos que tenemos 30 proyectos de inversión con VAN positivo (VAN = NPV)

my $limit = 30;

my ($inversion, $npv, @INV, @VAN);

for (0..$limit-1){
        $inversion = sprintf ("%.02f", -1000 * rand);
        $npv = 1500 * rand;
        $INV[$_] = abs ($inversion);
        $VAN[$_] = $npv;
    }

# Digamos que tenemos un presupuesto de 10_000 (BUDGET)
my $PPTO = 10000;              # SIN _ que lo vamos a mandar a glpk

# Enumeremos todas las posibilidades y escogemos la cartera (PORTFOLIO) 
# de proyectos cuya suma da un mayor VAN de la cartera


my $antes = time();
  
open OUT, '>', $antes.".lp" or die $!;
print OUT "Maximize\n";
print OUT " Z: ";
for (0..$limit-1){
    print OUT "$VAN[$_] x_$_ ";
    if ($_ < $limit-1) { print OUT "+ "; }
}
print OUT "\n";

print OUT "Subject To\n";
print OUT " c1: ";
for (0..$limit-1){
    print OUT "$INV[$_] x_$_ ";
    if ($_ < $limit-1) { print OUT "+ "; }
}
print OUT " <= $PPTO\n";

print OUT "binary\n";
for (0..$limit-1){
    print OUT " x_$_\n";
}

print OUT "End\n";
close OUT;

my $output =  `glpsol --lp --max --binarize --noscale -w cartera_proyectos3_cplex.out $antes.lp`;

# Se SUPONE que habría que leer el output

print "$output\n\n";

system "cat cartera_proyectos3_cplex.out";


my $despues = time();

print "Elapsed time ", ($despues-$antes)/60 , " min.\n";

exit 0;









     
__END__
  
v.2 Con la ayuda inestimable de
  un anónima ayuda
  para hacer el paseo de 0 a 2**30 más ligero
  usando $num & 2**$i -> 0 o 1 dependiendo solo de $num
  que se incrementa en cada bucle. SIN LISTA. ¡Genial!

v.3 Usando 'glpsol'

