#!/usr/bin/perl -w
use strict;
# 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 = 10_000;
# Enumeremos todas las posibilidades y escogemos la cartera (PORTFOLIO)
# de proyectos cuya suma da un mayor VAN de la cartera
my $antes = time();
my @a = (0) x $limit;
my $count = 0;
my $MAXNPV = 0;
my $NPROYECTOS = 0;
my @b;
my ($van, $ppto, $c, @pn);
while ($count < $limit) {
# print reverse @a, "\n"; # reverse @a for avoid antinature
$van = $ppto = $c = 0;
for (0..$limit-1){
$van += $a[$_] * $VAN[$_];
$ppto += $a[$_] * $INV[$_];
++$c if ($a[$_] == 1);
}
if ($ppto <= $PPTO && $van >= $MAXNPV){
@b = @a;
@pn=();
for (0..$limit-1){
push (@pn, $_+1) if $a[$_] == 1;
}
$MAXNPV = $van;
$NPROYECTOS = $c;
print "El vector ",@b," produce $MAXNPV con una inversión de $ppto ($c proyectos)\n";
}
@a = enum(@a); # next number or
combination
}
print "Lista de proyectos: @pn\n";
my $despues = time();
print "\nElapsed time ", ($despues-$antes)/60," min.\n";
exit 0;
sub enum {
my @l = @_;
my $i = 0;
zz:
if ($l[$i] == 0) {
$l[$i]=1;
return @l;
}else{
$l[$i]=0;
if (++$i > $count){
$l[++$count]=1;
return @l;
}else{
goto zz;
}
}
}
__END__
This short code last for hours.
Make suggestions to speed up.
Thank you.
--
http://gamo.sdf-eu.org/
"What happens in EuroVegas it remains in EuroVegas"
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)