#!/usr/bin/perl use warnings; use strict; #use Time::HiRes qw( gettimeofday tv_interval); use lib qw(.. ../..); use Algorithm::Evolutionary::Individual::Vector; use Algorithm::Evolutionary::Op::Easy; use Algorithm::Evolutionary::Op::GaussianMutation; use Algorithm::Evolutionary::Op::VectorCrossover; #----------------------------------------------------------# my $popSize = shift || 100; my $numGens = shift || 100 ; #----------------------------------------------------------# #Definimos la función de fitnes, que es la función Marea my $funcionMarea = sub { my $indi = shift; my ( $x, $y ) = @{$indi->{_array}}; my $sqrt = sqrt( $x*$x+$y*$y); if( !$sqrt ){ return 1; } return sin( $sqrt )/$sqrt; }; #----------------------------------------------------------# #Creamos la población inicial my @pop; #Creamos $popSize individuos for ( 0..$popSize ) { my $indi = Algorithm::Evolutionary::Individual::Vector->new( 2 ); push( @pop, $indi ); } #----------------------------------------------------------# #Definimos los operadores de variación my $m = Algorithm::Evolutionary::Op::GaussianMutation->new( 0, 0.1 ); my $c = Algorithm::Evolutionary::Op::VectorCrossover->new(2); #----------------------------------------------------------# #Usamos estos operadores para definir una generación del algoritmo. Lo cual # no es realmente necesario ya que este algoritmo define ambos operadores por # defecto. Los parámetros son la función de fitness, la tasa de selección y los # operadores de variación. my $generation = Algorithm::Evolutionary::Op::Easy->new( $funcionMarea , 0.2 , [$m, $c] ) ; #Inicializar el contador de tiempo #my $inicioTiempo = [gettimeofday()]; #----------------------------------------------------------# for ( @pop ) { if ( !defined $_->Fitness() ) { my $fitness = $funcionMarea->($_); $_->Fitness( $fitness ); } } my $contador=0; do { $generation->apply( \@pop ); print "$contador : ", $pop[0]->asString(), "\n" ; $contador++; } while( $contador < $numGens ); #----------------------------------------------------------# #leemos el mejor resultado my ( $x, $y ) = @{$pop[0]->{_array}}; #Mostramos los resultados obtenidos print "El mejor es:\n\t ",$pop[0]->asString(),"\n\t x=$x \n\t y=$y \n\t Fitness: ",$pop[0]->Fitness(),"\n"; #print "\n\nTiempo transcurrido: ". tv_interval( $inicioTiempo ) . "\n";