<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xchmp &#187; python</title>
	<atom:link href="http://xchmp.com/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://xchmp.com</link>
	<description></description>
	<lastBuildDate>Mon, 15 Feb 2010 11:34:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Hello Gene</title>
		<link>http://xchmp.com/2009/02/hello-gene/</link>
		<comments>http://xchmp.com/2009/02/hello-gene/#comments</comments>
		<pubDate>Mon, 02 Feb 2009 22:44:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[genetic programming]]></category>

		<guid isPermaLink="false">http://xchmp.com/?p=114</guid>
		<description><![CDATA[While on breaks at work I&#8217;ve been reading a bit about Genetic Programming. The following is a quick-and-dirty python script I threw together (mostly for myself) the other night. It evolves the target string &#8220;Hello World&#8221; over several generations, starting with random strings. After a bit of experimentation I found that a population size of [...]]]></description>
			<content:encoded><![CDATA[<p>While on breaks at work I&#8217;ve been reading a bit about <a href="http://en.wikipedia.org/wiki/Genetic_programming">Genetic Programming</a>. The following is a quick-and-dirty python script I threw together (mostly for myself) the other night. It evolves the target string &#8220;Hello World&#8221; over several generations, starting with random strings. After a bit of experimentation I found that a population size of 300 seems to work best for this.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> GenePool:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, population_size<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">population_size</span> = population_size
        <span style="color: #008000;">self</span>.<span style="color: black;">population</span> = <span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">generate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                           <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>population_size<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        i = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Generation &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;: &quot;</span> + <span style="color: #008000;">self</span>.<span style="color: black;">population</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
            i = i + <span style="color: #ff4500;">1</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">step</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> step<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        fittest = <span style="color: #008000;">self</span>.<span style="color: black;">get_best</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">population_size</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">successful</span><span style="color: black;">&#40;</span>fittest<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Success! &quot;</span> + fittest<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">population</span> = <span style="color: #008000;">self</span>.<span style="color: black;">get_new_generation</span><span style="color: black;">&#40;</span>fittest<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> generate<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span>.<span style="color: black;">ascii_letters</span> + <span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span>
                         <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> evaluate<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, individual<span style="color: black;">&#41;</span>:
        s = <span style="color: #483d8b;">&quot;Hello World&quot;</span>
        total = <span style="color: #ff4500;">0</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> idx <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> individual<span style="color: black;">&#91;</span>idx<span style="color: black;">&#93;</span> == s<span style="color: black;">&#91;</span>idx<span style="color: black;">&#93;</span>:
                total = total + <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> total / <span style="color: #ff4500;">11.0</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_best<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, n<span style="color: black;">&#41;</span>:
        fitness = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> idx, individual <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">enumerate</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">population</span><span style="color: black;">&#41;</span>:
            fitness.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>idx, <span style="color: #008000;">self</span>.<span style="color: black;">evaluate</span><span style="color: black;">&#40;</span>individual<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        fitness.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: #008000;">cmp</span>=<span style="color: #ff7700;font-weight:bold;">lambda</span> x,y: <span style="color: #008000;">cmp</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, y<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, reverse=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
        best = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#91;</span><span style="color: #008000;">self</span>.<span style="color: black;">population</span><span style="color: black;">&#91;</span>tup<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> tup <span style="color: #ff7700;font-weight:bold;">in</span> fitness<span style="color: black;">&#91;</span>:n<span style="color: black;">&#93;</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> successful<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, individual<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> individual == <span style="color: #483d8b;">&quot;Hello World&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> get_new_generation<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, individuals<span style="color: black;">&#41;</span>:
        population = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>population<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">population_size</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">0.75</span><span style="color: black;">&#41;</span>:
            population.<span style="color: black;">extend</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">breed</span><span style="color: black;">&#40;</span>
                                    <span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span>individuals<span style="color: black;">&#41;</span>,
                                    <span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span>individuals<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>population<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #008000;">self</span>.<span style="color: black;">population_size</span>:
            population.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">generate</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> population
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> breed<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, mother, father<span style="color: black;">&#41;</span>:
        point1 = <span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>,<span style="color: #008000;">len</span><span style="color: black;">&#40;</span>mother<span style="color: black;">&#41;</span>-<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
        point2 = <span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span>point1+<span style="color: #ff4500;">1</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>mother<span style="color: black;">&#41;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
        new1 = mother<span style="color: black;">&#91;</span>:point1<span style="color: black;">&#93;</span> + father<span style="color: black;">&#91;</span>point1:point2<span style="color: black;">&#93;</span> + mother<span style="color: black;">&#91;</span>point2:<span style="color: black;">&#93;</span>
        new2 = father<span style="color: black;">&#91;</span>:point1<span style="color: black;">&#93;</span> + mother<span style="color: black;">&#91;</span>point1:point2<span style="color: black;">&#93;</span> + father<span style="color: black;">&#91;</span>point2:<span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">random</span>.<span style="color: #dc143c;">random</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">0.05</span>:
            new1 = <span style="color: #008000;">self</span>.<span style="color: black;">mutate</span><span style="color: black;">&#40;</span>new1<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">random</span>.<span style="color: #dc143c;">random</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">0.05</span>:
            new2 = <span style="color: #008000;">self</span>.<span style="color: black;">mutate</span><span style="color: black;">&#40;</span>new2<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span>new1, new2<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> mutate<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, individual<span style="color: black;">&#41;</span>:
        x = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>individual<span style="color: black;">&#41;</span>
        x<span style="color: black;">&#91;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span>-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> = <span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span>
                                            <span style="color: #dc143c;">random</span>.<span style="color: black;">choice</span><span style="color: black;">&#40;</span>
                                              <span style="color: #dc143c;">string</span>.<span style="color: black;">asciiletters</span> + <span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    G = GenePool<span style="color: black;">&#40;</span><span style="color: #ff4500;">300</span><span style="color: black;">&#41;</span>
    G.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

</pre>
]]></content:encoded>
			<wfw:commentRss>http://xchmp.com/2009/02/hello-gene/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
