clear; target="METHINKS IT LOOKS LIKE A WEASEL" n=length(target) #FUNCTION TO CALCULATE HOW CLOSE A STRING IS TO THE TARGET function pt=points(off) target="METHINKS IT LOOKS LIKE A WEASEL"; n=length(target); pt=0; for i=1:n if (off(i)==target(i)) pt=pt+1; # INCRASE POINTS IF THERE ARE IDENTICAL LETTERS AT IDENTICAL POSITIONS endif endfor endfunction #FUNCTION TO MUTATE A STRING sh INTO A STRING st BY CHANGING m RANDOMLY CHOSEN CHARACTERS IN THE ORIGINAL TO m OTHER RANDOMLY CHOSEN ONES function st=mutate(sh,m) for i=1:m r=round(rand*(length(sh)-1))+1; off=round(rand*26)+64; if (off==64) sh(r)=char(32); else sh(r)=char(off); endif endfor st=sh; endfunction # NOTE THE START TIME startt=time; # Generate a random string of n characters - THE ANCESTOR STRING for i=1:n parentN=round(rand*26)+64; if (parentN!=64) ancestor(i)=char(parentN); else ancestor(i)=char(32); endif endfor ancestor # SHOW THE ANCESTOR STRING ON SCREEN G=1; # INITIATE THE GENERATION COUNTER o=5; # LET THE ANCESTOR BE SO FERTILE AS TO GENERATE 5 OFFSPRING IN ITS LIFETIME parent=ancestor; # PARENT STORES THE SELECTED INDIVIDUAL (A STRING) WHICH PRODUCES 'o' OFFSPRING IN ITS LIFETIME while (strcmp(parent,target)==0) # STOP WHEN THE SELECTED INDIVIDUAL IS EXACTLY THE TARGET STRING for i=1:o offs(i,:)=mutate(parent,1); # PRODUCE 'o' OFFSPRING FROM THE PARENT WITH MINIMAL MUTATION AND CALCULATE HOW CLOSE EACH p(i)=points(offs(i,:)); # IS TO THE TARGET STRING (Note that duplicating with an error greater than one decreases the rate # of convergence significantly. Keep mutation to a minimum (1) for best results) endfor G=G+1; # INCREMENT GENERATION COUNTER [mx,mxp]=max(p); # FIND WHICH OFFSPRING SCORED THE MAXIMUM POINTS parent=offs(mxp,:) # SET THAT OFFSPRING TO BE THE PARENT FOR THE NEXT GENERATION o=mx+5 # INCREASE THAT OFFSPRING'S REPRODUCTION RATE SINCE IT IS CLOSER TO THE TARGET (OPTIONAL). # AS AN ALTERNATIVE, SET o=20 or some higher value and remove the previous line endwhile G # SHOW NUMBER OF GENERATIONS PASSED parent # THIS WILL BE THE SAME AS THE TARGET STRING NOW endt=time; time=endt-startt # SHOW HOW MUCH TIME PASSED