use strict; use warnings; use AI::Genetic; my %signup; $signup{bob}{genetic} = 2; $signup{ted}{genetic} = 1; $signup{alice}{genetic} = 1; $signup{carol}{genetic} = 0; $signup{joe}{genetic} = 0; $signup{biff}{genetic} = 0; $signup{sneezy}{genetic}= 0; $signup{bob}{neural} = 0; $signup{ted}{neural} = 0; $signup{alice}{neural} = 1; $signup{carol}{neural} = 2; $signup{joe}{neural} = 1; $signup{biff}{neural} = 1; $signup{sneezy}{neural}= 0; $signup{bob}{fuzzy} = 0; $signup{ted}{fuzzy} = 1; $signup{alice}{fuzzy} = 0; $signup{carol}{fuzzy} = 1; $signup{joe}{fuzzy} = 0; $signup{biff}{fuzzy} = 0; $signup{sneezy}{fuzzy}= 2; my $generations= 0; sub fitness { my ($classes)= @_; my $class1= $classes->[0]; my $class2= $classes->[1]; return 0 if $class1 eq $class2; my $fitness=0; foreach my $student_name (keys %signup) { if ($signup{$student_name}{$class1} > $signup{$student_name}{$class2}) { $fitness += $signup{$student_name}{$class1}; } else { $fitness += $signup{$student_name}{$class2}; } } return $fitness; } my $ga = new AI::Genetic( -fitness => \&fitness, -type => 'listvector', -population => 500, -crossover => 0.9, -mutation => 0.01, -terminate => sub { $generations++; return 1 if $generations > 100; return 0 }, ); $ga->init([ [qw/genetic neural fuzzy/ ], [qw/genetic neural fuzzy/ ], ]); $ga->evolve('rouletteTwoPoint', 100); print "Best score = ", $ga->getFittest->score, ".\n"; print "Best genes = ", join(' ',$ga->getFittest->genes), ".\n";