Register | Sign In


Understanding through Discussion


EvC Forum active members: 63 (9162 total)
4 online now:
Newest Member: popoi
Post Volume: Total: 916,396 Year: 3,653/9,624 Month: 524/974 Week: 137/276 Day: 11/23 Hour: 1/2


Thread  Details

Email This Thread
Newer Topic | Older Topic
  
Author Topic:   Evolution Generator Program
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 2 of 59 (571984)
08-03-2010 7:16 AM


Evolution Generator
I written a simple evolution generator program. You can find it here:
It is a much more accurate representation than Marshall's of what evolution is really like. ICANT referenced Perry Marshall's program over at the When does design become intelligent? (AS OF 8/2/10 - CLOSING COMMENTS ONLY) thread, see this reply to ICANT that has the link's to Marshall's program: Message 635
I would appreciate feedback on the program.
--Percy
Edited by Percy, : Clarify.

Replies to this message:
 Message 3 by Wounded King, posted 08-03-2010 9:01 AM Percy has replied
 Message 7 by Blue Jay, posted 08-03-2010 11:44 AM Percy has replied
 Message 8 by dwise1, posted 08-03-2010 12:31 PM Percy has replied
 Message 9 by Blue Jay, posted 08-03-2010 12:34 PM Percy has replied
 Message 10 by Aware Wolf, posted 08-03-2010 12:42 PM Percy has replied
 Message 11 by ICANT, posted 08-03-2010 1:15 PM Percy has replied
 Message 24 by CosmicChimp, posted 08-03-2010 10:45 PM Percy has seen this message but not replied
 Message 27 by ringo, posted 08-04-2010 2:03 PM Percy has replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 4 of 59 (571999)
08-03-2010 9:17 AM
Reply to: Message 3 by Wounded King
08-03-2010 9:01 AM


Re: Evolution Generator
Wounded King writes:
My first thoughts are that supervising every generation by hand is a bloody nightmare.
Yeah, you're right, but I wanted to be as similar to Marshall's program as possible, and with the number of matches displayed next to the select box I find I can go through 40 generations in five minutes with little problem, usually selecting between 2 and 4 strings to contribute to the next generation.
For myself a scenario utilising a set of selection criteria to automatically select the sequences to go into the next generation would be far preferable.
Agreed, and I hope to add an "automatic" option.
My ideal output would be some sort of graph of generation against fitness/identity to target sequence, as well as an archive of all of the offspring and progeny from each generation. I definitely see the value of having every step in the process there for scrutiny, I just don't like having to do all the scrutiny myself every generation.
I agree, but it takes it to another level of time committment, and then it gets out of the realm of what ICANT might possibly understand. An understandable illustration for the average layperson was my goal, something that when someone mentions Marshall's program you could come straight back with a link to my program. That's why I made sure they looked very similar.
I appreciate that this approach doesn't allow you to vary the mutation rate generation by generation, but I'm not sure how useful that ability is anyway.
I wouldn't have any problem varying the mutation rate automatically. One approach would be to track progress toward the goal and to reduce the mutation rate when it leveled off. Another approach would be to measure number of mutations against number of correct letters. Of course, you could quickly go through so many generations in an automatic mode that keeping the mutation rate high in the early stages wouldn't be necessary.
Another improvement would be to have multiple targets, which would bring the program a little closer to actual evolution. You would quickly observe that random changes early in the process would direct lines of descent toward different niches.
Wish I had serious time for this, there's so much that could be done.
--Percy

This message is a reply to:
 Message 3 by Wounded King, posted 08-03-2010 9:01 AM Wounded King has replied

Replies to this message:
 Message 5 by Wounded King, posted 08-03-2010 9:22 AM Percy has replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 6 of 59 (572005)
08-03-2010 9:27 AM
Reply to: Message 5 by Wounded King
08-03-2010 9:22 AM


Re: Evolution Generator
Yeah, it's just Perl, but it could just as easily have been PhP. I'm faster in Perl.
--Percy

This message is a reply to:
 Message 5 by Wounded King, posted 08-03-2010 9:22 AM Wounded King has seen this message but not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 12 of 59 (572062)
08-03-2010 1:37 PM
Reply to: Message 7 by Blue Jay
08-03-2010 11:44 AM


Re: Evolution Generator
Bluejay writes:
  1. It took about 10 generations before I got my first matching letter.
  2. It took a long time (I can't remember how long) to get from 6 correct letters to 7.
  3. Once you get to the target sequence, it's impossible to drive it to fixation, because the offspring always mutate.
The first two I think are real quirks of evolution: the first template on which evolution could work would have to have been generated randomly, and fine-tuning (6 to 7 letters) would be hard to stabilize.
About number 1, that will vary, sometimes you're luckier than others. About number 2, getting the final few letters to match is the toughest, because there's only one right answer. In the real world there are millions of correct answers, and even creationists must acknowledge this because everyone's DNA is different.
The last one might also be a real quirk of evolution (the difficulty of driving a trait to absolute fixation); but I think it's more a quirk of the generator. Maybe you could allow a range of mutations in each offspring, instead of saying exactly how many? So, instead of saying "1 mutation per individual," it could be "0-1" or "0-2."
I have no idea how difficult that might be to program, because I know nothing about programming.
This is very easy, and I considered doing it, but I was afraid what I had was already too different from Marshall's program to be easily understood.
{AbE: Also, maybe the possibility of a moving target sequence would make it more realistic?}
This, too, is relatively easy. It would reflect a changing environment. It would show how organisms could get caught between needing a high mutation rate to keep up with a changing environment but not so high that fitness is undermined.
--Percy

This message is a reply to:
 Message 7 by Blue Jay, posted 08-03-2010 11:44 AM Blue Jay has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 13 of 59 (572064)
08-03-2010 1:42 PM
Reply to: Message 9 by Blue Jay
08-03-2010 12:34 PM


Re: Evolution Generator
Bluejay writes:
I just noticed a glitch. I tried it with "2 offspring per parent," and the check box unchecks after each generation. It doesn't happen for 1, 5 or 10 offspring: just for 2.
Thanks for finding this, typo, it's fixed now.
--Percy

This message is a reply to:
 Message 9 by Blue Jay, posted 08-03-2010 12:34 PM Blue Jay has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 14 of 59 (572070)
08-03-2010 1:51 PM
Reply to: Message 8 by dwise1
08-03-2010 12:31 PM


Re: Evolution Generator
I was hoping to make something that was only incrementally more complicated than Perry's program but that gave a more accurate picture of how evolution works. I vaguely remember The Blind Watchmaker, but it's been over 20 years. I recall that he had a chapter about an evolution program, and I guess that's the WEASEL program you mention. Neat stuff, I still have the book on my shelf. At the time I read it I was carrying on a snail-mail debate with a fundamentalist Christian I'd met on an airplane and I sent her a copy. I'm sure she found it worked great as a paperweight.
--Percy

This message is a reply to:
 Message 8 by dwise1, posted 08-03-2010 12:31 PM dwise1 has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 15 of 59 (572071)
08-03-2010 1:52 PM
Reply to: Message 10 by Aware Wolf
08-03-2010 12:42 PM


Re: Evolution Generator
Yeah, I can see the problems you faced. It would probably work great if selection was automated, but then it wouldn't provide any insights to the people watching it. They'd just gradually see a picture emerge.
--Percy

This message is a reply to:
 Message 10 by Aware Wolf, posted 08-03-2010 12:42 PM Aware Wolf has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 16 of 59 (572073)
08-03-2010 1:58 PM
Reply to: Message 11 by ICANT
08-03-2010 1:15 PM


Re: Evolution Generator
Hi ICANT, thanks for trying it out, I figured you'd be on vacation already.
Just to save time, try starting with a very short line of text, like maybe "Jesus loves us." Set the number of mutations to 2 and the number of offspring to 10, then try selecting the 2 to 4 strings that have the highest number of matching characters in each generation and let me know what happens. The fittest strings are those with the largest number of matching letters.
It doesn't matter whether you select parents or offspring, all you're doing is selecting which strings contribute to the next generation. Sometimes the parents are more fit than any of the offspring.
--Percy

This message is a reply to:
 Message 11 by ICANT, posted 08-03-2010 1:15 PM ICANT has replied

Replies to this message:
 Message 20 by Blue Jay, posted 08-03-2010 6:01 PM Percy has seen this message but not replied
 Message 21 by ICANT, posted 08-03-2010 6:34 PM Percy has replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 22 of 59 (572107)
08-03-2010 7:05 PM
Reply to: Message 21 by ICANT
08-03-2010 6:34 PM


Re: Evolution Generator
Hi ICANT!
When the program checks whether letters match it doesn't care about upper and lower case. An upper case "J" will match a lower case "j". I did this on purpose because it is actually somewhat analogous to nucleotides in DNA where, for example, the amino acid arginine is coded for by both CGA and CGG - it doesn't matter whether the last letter is A or G, you still get arginine. So it doesn't matter whether it's a lower case or capital "J", it's still Jesus. Ancient Hebrew didn't have upper and lower case, did it? I'm not sure.
So it sounds like you were able to use selection to get closer and closer to the target phrase, "JesUS loVEs ME," though you couldn't quite get all the way there. That's quite a dramatic difference from the random selection you were using before.
As the string changes the information is new in the sense that it is information that was not there before.
--Percy

This message is a reply to:
 Message 21 by ICANT, posted 08-03-2010 6:34 PM ICANT has replied

Replies to this message:
 Message 25 by ICANT, posted 08-04-2010 12:57 PM Percy has replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 28 of 59 (572208)
08-04-2010 3:30 PM
Reply to: Message 27 by ringo
08-04-2010 2:03 PM


Re: Evolution Generator
ringo writes:
I can't run the program at 10 mutations at all. It just waits and waits and never produces a result.
Can I guess that your target string was shorter than 10 characters?
This is a bug, I should be detecting pathological cases, but anyway, try a longer string and see if it works.
--Percy

This message is a reply to:
 Message 27 by ringo, posted 08-04-2010 2:03 PM ringo has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 29 of 59 (572209)
08-04-2010 3:35 PM
Reply to: Message 25 by ICANT
08-04-2010 12:57 PM


Re: Evolution Generator
ICANT writes:
If I set the mutations at 10 per generation using 15 parents how many of those mutations are:
Good mutations?
A good mutation is any character position where the letter was black and is now red.
Neutral mutations?
A neutral mutation is any character position where the letter changes but not color.
Deleterious mutations
A deleterious mutation is any character position where the letter was red and is now black.
--Percy

This message is a reply to:
 Message 25 by ICANT, posted 08-04-2010 12:57 PM ICANT has replied

Replies to this message:
 Message 33 by ICANT, posted 08-23-2010 5:51 PM Percy has replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 31 of 59 (572222)
08-04-2010 6:00 PM
Reply to: Message 27 by ringo
08-04-2010 2:03 PM


Re: Evolution Generator
Bug is fixed.
--Percy
Edited by Percy, : Change author.

This message is a reply to:
 Message 27 by ringo, posted 08-04-2010 2:03 PM ringo has replied

Replies to this message:
 Message 32 by ringo, posted 08-04-2010 6:43 PM Percy has seen this message but not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 34 of 59 (576358)
08-23-2010 8:50 PM
Reply to: Message 33 by ICANT
08-23-2010 5:51 PM


Re: Evolution Generator
Here's a copy of the program, knock yourself out.
--Percy

#!C:/Perl/bin/perl.exe
#!/usr/bin/perl

use strict;

use CGI;

my @LegalChars = ('a'..'z', 'A'..'Z', '0'..'9', ' ', '!', ',', '.', ';', ':', '"', chr(39));

print "Content-type: text/html\n\n";

my $p = new CGI;

my $styleSection = <<HERE;
<style type="text/css">
.style1 {
        font-family: Verdana, Arial;
	font-size: 10pt;
	font-weight: bold;
}
.style2 {
        font-family: courier;
	font-size: 10pt;
	font-weight: bold;
}
.style3 {
        font-family: Verdana, Arial;
        font-size: 12pt;
        font-weight: bold;
}
</style>
HERE

my $introText =
  (qq(Select some target text to represent favorable characteristics, then beginning with a) .
   qq(random string of letters and spaces the generator automatically adds random mutations) .
   qq(while you do the selection.));

my $descriptiveText = <<HERE;
<center>Discussion</center>

First a few explanatory words about what you're seeing in the display.  After you enter the target
text and click "Begin" the program generates a random starting string as the first parent, the
common ancestor of all subsequent organisms.  You can select the number of mutations per offspring
and the number of offspring per parent.  The text of each parent and
offspring has the matching characters highlighted in red.  Select the organisms you want to
contribute to the next generation by checking the select boxes.  The number of matching characters
is displayed next to the select box.

Natural selection permits the survival to reproduce of those best fitted to the environment.
In nature survival is dictated by how well an organism is fit to cope with the environment, such
as possessing fur for cold, or speed or disguise to elude predators.

In this simple computer program an organism is a string of text, and its fitness is measured by
how closely it matches the target string.  Notice that because the strings are relatively short,
maybe a hundred characters at most, that if you set the number of mutations as 10 that you're
chaning 10% of the genome in each offspring.  That's an enormous mutation rate for such a small
genome, and you'll find that while a high mutation rate is good for rapidly approaching the
target text in the beginning, that as you get closer you'll have to reduce the mutation rate.

This is similar to real life, where a high mutation rate such as can be caused by high radition is
fatal.  Evolution works through small incremental changes, and this program works best in
the same way.
HERE

my $command = $p->param('command');
my $startOver = $p->param('startover');

if ($command eq '' || $startOver) {

print <<HERE;
<html>
<head>
<title>Evolution Demonstrator</title>
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
$styleSection
</head>

<body class=style1>
<form action="Evolution.cgi" enctype="multipart/form-data" method="post">
<input type="hidden" name="cnt" value="">

<center>
<blockquote>
<span class="style3">Evolution Demonstrator</span>

<p /> 
$introText
<p /> 

Enter the target text in the box below, then click Begin.

</blockquote>
</center>

<table border="1" align="center" class=style2>
<tr>
  <td>
    Target:
  <td>
    <script>var cleared=false;</script>
    <input type=text name=target value="Enter the target text used to measure fitness here" size=60
     onfocus="if (!cleared) {this.value='';cleared=true}">
  <td>
<tr>
  <td>
    Parent:
  <td>
  <td>
<tr>
  <td>
    Offspring of
Parent:
  <td>
  <td>
<tr>
  <td>
  <td align=right>
    Number of mutations:
  <td>
    <input type="radio" name="mutations" value="1" checked="true"/>1
    <input type="radio" name="mutations" value="2" />2
    <input type="radio" name="mutations" value="5" />5
    <input type="radio" name="mutations" value="10" />10
<tr>
  <td>
  <td align=right>
    Number of offspring per parent:
  <td>
    <input type="radio" name="offspring" value="1" checked="true"/>1
    <input type="radio" name="offspring" value="2" />2
    <input type="radio" name="offspring" value="5" />5
    <input type="radio" name="offspring" value="10" />10
<tr>
  <td colspan=3 align=center>
    <input type="submit" name="command" value="Begin">         
    <input type="submit" name="reset" value="Reset Form">
</table>

 <div align="center">

    <input type="hidden" name="total_mutations" value="0" />
    <input type="hidden" name="checksum" value="" />
    <span class="style1">Demonstrate evolution for yourself with the Evolution Generator</span></p>
 </div>
 <blockquote>
    $descriptiveText
 </blockquote>
</form>
</body>
</html>
HERE

} elsif ($command eq 'Begin') {

  my $targetText = $p->param('target');
  my $lengthTargetText = length($targetText);
  my $randomStartString = join '', (map {$LegalChars[int(rand(@LegalChars))]} (1..$lengthTargetText));
  $p->param('parentsel-1' => $randomStartString);
  $p->param('gennum' => 1);

  PresentNextGeneration($targetText);
} elsif ($command eq 'Create Next Generation') {
  my $targetText = $p->param('target');
  PresentNextGeneration($targetText);
} else {
  print "Error, sorry, apologies, etc...
\n";
}

exit(0);

sub PresentNextGeneration {

  my ($targetText) = @_;
  my $targetTextEncoded = $targetText;
  $targetTextEncoded =~ s/"/"/g;

  my $numMutations = $p->param('mutations');
  my %NumMutationsChecked;
  $NumMutationsChecked{$numMutations} = 'checked';

  my $numOffspring = $p->param('offspring');
  my %NumOffspringChecked;
  $NumOffspringChecked{$numOffspring} = 'checked';

  # Fetch parents
  my @Parents;
  map {push(@Parents, $p->param($_)) if $_ =~ /^parentsel-/} $p->param;

print <<HERE;
<html>
<head>
<title>Evolution Generator</title>
<meta http-equiv="Content-type" content="text/html; charset=ISO-8859-1">
$styleSection
</head>

<body class=style1>
HERE

  if (@Parents == 0) {
    print (qq(<blockquote><center>) .
           qq(You didn't select anyone to contribute to the next generation and everyone has died. ) .
           qq(You're population has gone extinct.

) .
           qq(Click your back button if you'd like to select one or more organisms to contribute ) .
           qq(to the next generation and try again.) .
           qq(</center></blockquote>));
    exit(0);
  }

  my $genNum = $p->param('gennum');
  my $nextGenNum = $genNum + 1;

print <<HERE;
<form action="Evolution.cgi" enctype="multipart/form-data" method="post">
<input type="hidden" name="cnt" value="">

<center>
<blockquote>
<span class="style3">Evolution Demonstrator</span>

<p /> 
$introText
<p /> 

Select the parents and offpsring to produce the next generation, then click Generate.
</blockquote>
</center>

<table border="1" align="center" class=style2>
<tr>
  <td>
    Number of
Generations:
  <td>
    $genNum
    <input type=hidden name=gennum value=$nextGenNum>
  <td>
<tr>
  <td>
    Target:
  <td>
    $targetTextEncoded
    <input type=hidden name=target value="$targetTextEncoded">
  <td>
    Select:
HERE

  my $count = 1;
  foreach (@Parents) {
    my $parentString = $_;
    my ($parentStringProcessed, $numMatches) = ProcessString($parentString, $targetText);
    my $parentStringEncoded = $parentString;
    $parentStringEncoded =~ s/"/"/g;
    print <<HERE;
<tr>
  <td>
    Parent $count:
  <td>
    $parentStringProcessed
  <td>
    <input type=checkbox name=parentsel-1 value="$parentStringEncoded"> $numMatches
HERE

    foreach (1..$numOffspring) {
      my $offspring = GenOffspring($parentString, $numMutations);
      my ($offspringProcessed, $numMatches) = ProcessString($offspring, $targetText);
      my $offspringEncoded = $offspring;
      $offspringEncoded =~ s/"/"/g;
      print <<HERE;
<tr>
  <td>
    Offspring $_:
  <td>
    $offspringProcessed
  <td>
    <input type=checkbox name=parentsel-$_ value="$offspringEncoded"> $numMatches
HERE

    }
    $count++;
  }

print <<HERE;
<tr>
  <td>
  <td align=right>
    Number of mutations:
  <td>
    <input type="radio" name="mutations" value="1" $NumMutationsChecked{1}/>1
    <input type="radio" name="mutations" value="2" $NumMutationsChecked{2}/>2
    <input type="radio" name="mutations" value="5" $NumMutationsChecked{5}/>5
    <input type="radio" name="mutations" value="10" $NumMutationsChecked{10}/>10
<tr>
  <td>
  <td align=right>
    Number of offspring per parent:
  <td>
    <input type="radio" name="offspring" value="1" $NumOffspringChecked{1}/>1
    <input type="radio" name="offspring" value="2" $NumOffspringChecked{2}/>2
    <input type="radio" name="offspring" value="5" $NumOffspringChecked{5}/>5
    <input type="radio" name="offspring" value="10" $NumOffspringChecked{10}/>10
<tr>
  <td colspan=3 align=center>
    <input type="submit" name="command" value="Create Next Generation">
               
    <input type="submit" name="startover" value="Start Over">
               
    <input type="submit" name="reset" value="Reset">
</table>

 <div align="center">

    <input type="hidden" name="total_mutations" value="0" />
    <input type="hidden" name="checksum" value="" />
    <span class="style1">Demonstrate evolution for yourself with the Evolution Generator</span></p>
 </div>
 <blockquote>
    $descriptiveText
 </blockquote>
</form>
</body>
</html>
HERE

}

sub GenOffspring {
  my ($parent, $numMutations) = @_;
  my %Positions;
  my $parentLen = length($parent);
  return '' if $parentLen == 0;
  if ($numMutations >= $parentLen) {
    $numMutations = $parentLen;
    map {$Positions{$_} = 1} (0..$numMutations-1);
  } else {
    foreach (1..$numMutations) {
      my $pos;
      do {
        $pos = int(rand($parentLen));
      } until !$Positions{$pos};
      $Positions{$pos} = 1;
    }
  }
  my @Parent = split(//, $parent);
  foreach (keys %Positions) {
    @Parent[$_] = $LegalChars[int(rand(@LegalChars))];
  }
  my $offspring = join '', @Parent;
  return $offspring;
}

sub ProcessString {
  my ($trialString, $targetText) = @_;
  my @TrialString = split(//, $trialString);
  my @TargetString = split(//, $targetText);
  my $numMatches = 0;
  for (my $i=0; $i<@TrialString; $i++) {
    if (lc($TrialString[$i]) eq lc($TargetString[$i])) {
      if ($TrialString[$i] eq ' ') {
        $TrialString[$i] = "<font color=red>_</font>";
      } else {
        $TrialString[$i] = "<font color=red>$TrialString[$i]</font>";
      }
      $numMatches++;
    }
    $TrialString[$i] =~ s/"/"/;
  }
  return ((join '', @TrialString), $numMatches);
}

This message is a reply to:
 Message 33 by ICANT, posted 08-23-2010 5:51 PM ICANT has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 39 of 59 (576456)
08-24-2010 7:30 AM
Reply to: Message 36 by Bolder-dash
08-24-2010 7:20 AM


Re: Evolution Generator
Those would be excellent improvements, though you don't really want to change the environment as rapidly as every 10 generations, but the rate of environmental change can be a variable. The source is in Message 34, go for it.
--Percy
Edited by Percy, : Add comment.

This message is a reply to:
 Message 36 by Bolder-dash, posted 08-24-2010 7:20 AM Bolder-dash has not replied

  
Percy
Member
Posts: 22480
From: New Hampshire
Joined: 12-23-2000
Member Rating: 4.8


Message 48 of 59 (576473)
08-24-2010 8:25 AM
Reply to: Message 46 by Bolder-dash
08-24-2010 8:11 AM


Re: Evolution Generator
Hi Bolder-dash,
Your concerns were addressed earlier in the thread, particularly in Message 4. An excerpt:
Percy in Message 4 writes:
I agree, but it takes it to another level of time committment, and then it gets out of the realm of what ICANT might possibly understand. An understandable illustration for the average layperson was my goal, something that when someone mentions Marshall's program you could come straight back with a link to my program. That's why I made sure they looked very similar.
You are welcome to make all the improvements you like. Let me know when you're done and I'll be glad to make it available here. The original source appears in Message 34.
But before you go to any trouble please be aware that there are many excellent evolution simulation programs available on the web. They lack the simplicity and layperson-level understandability of my program, but they do an excellent job addressing the concerns you raise. If you want links to them just ask. I don't know the links off the top of my head, but I'm sure other participants in this thread do.
--Percy

This message is a reply to:
 Message 46 by Bolder-dash, posted 08-24-2010 8:11 AM Bolder-dash has replied

Replies to this message:
 Message 50 by Bolder-dash, posted 08-24-2010 8:32 AM Percy has seen this message but not replied

  
Newer Topic | Older Topic
Jump to:


Copyright 2001-2023 by EvC Forum, All Rights Reserved

™ Version 4.2
Innovative software from Qwixotic © 2024