(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
In reply to Re: How to evolve a permutation? (swap, sort)
by tye
in thread How to evolve a permutation?
by zli034
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |