in reply to Problem of referencing into subroutines.

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.