I'll start by saying that the reference dancing here makes my eyes cross, so take my remarks with some salt. Also, since I don't have your input file or a good idea of what this is to produce, I can't really test. That said, look here...
my @parents = @population[40 .. 49]; shuffle @parents; my @children; push @children, crossover( pop @parents, pop @parents ) while @parents; @population[0 .. 4] = map { mutate($_) } @children;
The first thing I notice is that crossover returns two things, so @children will have the same length as @parents, but you're discarding half of them when you put them back into @population. I can't tell if that's deliberate or not, but it easily could be.
What I don't think is deliberate is that mutate is operating directly on the items it gets.
sub mutate{ my @string = @{$_[0]}; for my $i (0.. $#string){ my $aref = $string[$i]; #print "\n"; if (rand() < $mutation_rate){ my $position1 = int(rand($#{$aref})); my $position2 = int(rand($#{$aref})); if ($position1 ne $position2){ my $temp = $string[$i][$position1]; $string[$i][$position1] = $string[$i][$position2]; $string[$i][$position2] = $temp; } } } return \@string; }
You copy into @string, which is good, and then pass out a reference to it, which is also good, but in the meantime you do this:
my $temp = $string[$i][$position1]; $string[$i][$position1] = $string[$i][$position2]; $string[$i][$position2] = $temp;
I think $string[$i] is a copy and so safe to modify, but $string[$i][$position1] is a reference that also exists in the original array. What you pass in are references from @children, but those also come directly from @parents.
To fix this, it might help to make a deep copy of the data structures involved before you operate on them. These might help with that:
Again, I'm not sure that's the problem, but it might be worth looking into.
In reply to Re: Problem of referencing into subroutines.
by kyle
in thread Problem of referencing into subroutines.
by zli034
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |