#!/usr/bin/perl =head1 NAME tide_float.pl - Optimization of the tide function using A::E =head1 SYNOPSIS prompt% ./tide_float.pl or prompt% perl tide_float.pl will show the values of the two floating-point components of the chromosome and finally the best value and fitness reached, which should be as close to 1 as possible. =head1 DESCRIPTION A simple example of how to run an Evolutionary algorithm based on Algorithm::Evolutionary. Tries to find the max of the bidimensional Tide , and outputs the x and y coordinates, along with fitness. Best fitness is close to 1. Around 50 generations should be enough, but default is population and number of generations equal to 100. =cut use warnings; use strict; use Time::HiRes qw( gettimeofday tv_interval); use lib qw(lib ../lib); use Algorithm::Evolutionary qw( Individual::Vector Op::Easy Op::GaussianMutation Op::VectorCrossover); #----------------------------------------------------------# my $popSize = shift || 100; #Population size my $numGens = shift || 100; #Max number of generations my $dimension = shift || 2; #Vector dimension #----------------------------------------------------------# #Fitness function will be Tide 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; }; #----------------------------------------------------------# #Initial population my @pop; #Creamos $popSize individuos for ( 0..$popSize ) { my $indi = Algorithm::Evolutionary::Individual::Vector->new( $dimension ); push( @pop, $indi ); } #----------------------------------------------------------# # Variation operators my $m = Algorithm::Evolutionary::Op::GaussianMutation->new( 0, 0.1 ); my $c = Algorithm::Evolutionary::Op::VectorCrossover->new( $dimension ); #----------------------------------------------------------# #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] ) ; #Time 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 ) && ( $pop[0]->Fitness() < 1 ) ); #----------------------------------------------------------# #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\nTime: ". tv_interval( $inicioTiempo ) . "\n"; =head1 AUTHOR Contributed by Pedro Castillo Valdivieso, modified by J. J. Merelo =cut =head1 Copyright This file is released under the GPL. See the LICENSE file included in this distribution, or go to http://www.fsf.org/licenses/gpl.txt CVS Info: $Date: 2012/12/08 10:12:37 $ $Header: /media/Backup/Repos/opeal/opeal/Algorithm-Evolutionary/scripts/tide_float.pl,v 3.1 2012/12/08 10:12:37 jmerelo Exp $ $Author: jmerelo $ $Revision: 3.1 $ $Name $ =cut