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

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.