in reply to How to evolve a permutation?
(Hmm, I didn't find the question hard to understand. But perhaps it had been updated before I read it.)
I'd mutate by swapping a random pair of adjacent items in the list. I'd recombine by assigning each element a number that is the average of its positions in the two orders and then putting the elements in an order that sorts these value:
my @mother= qw( a b d e c g f i h ); my @father= qw( b c a d e f h i g ); my %avgPos; for my $av ( \@mother, \@father ) { for my $i ( 0 .. $#$av ) { $avgPos{$av->[$i]} += $i/2; } } print " $_ => $avgPos{$_}\n" for keys %avgPos; my @son= sort { $avgPos{$a} <=> $avgPos{$b} } @mother; print "( @son )\n"; __END__ e => 3.5 a => 1 d => 2.5 c => 2.5 h => 7 b => 0.5 g => 6.5 f => 5.5 i => 7 ( b a d c e f g i h )
You could flip a coin to pick @mother vs @father for the last step since modern Perl sort is "stable" now.
- tye
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: How to evolve a permutation? (swap, sort)
by halley (Prior) on Feb 15, 2008 at 16:27 UTC | |
by tye (Sage) on Feb 15, 2008 at 19:17 UTC |