<?xml version="1.0" encoding="utf-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"	>
<channel>
	<title>Comments on: Wallace 0.99.1 Released</title>
	<atom:link href="http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/</link>
	<description>After all, it could only cost you your life, and you got that for free.</description>
	<lastBuildDate>Sat, 28 Aug 2010 11:58:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Paul Kuliniewicz</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1127</link>
		<dc:creator>Paul Kuliniewicz</dc:creator>
		<pubDate>Thu, 01 Mar 2007 20:45:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1127</guid>
		<description>John, you mean penalizing for every time the input state changes?  One could probably implement that without too much difficulty.</description>
		<content:encoded><![CDATA[<p>John, you mean penalizing for every time the input state changes?  One could probably implement that without too much difficulty.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1126</link>
		<dc:creator>John</dc:creator>
		<pubDate>Thu, 01 Mar 2007 20:14:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1126</guid>
		<description>Have you considered adjusting the fitness function to penalize on a per-input basis?  That would remove alot of the random flipping of pills, make it appear a bit more natural, and more optomized, since they need to get a high score in as few inputs as possible.</description>
		<content:encoded><![CDATA[<p>Have you considered adjusting the fitness function to penalize on a per-input basis?  That would remove alot of the random flipping of pills, make it appear a bit more natural, and more optomized, since they need to get a high score in as few inputs as possible.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jamie</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1125</link>
		<dc:creator>Jamie</dc:creator>
		<pubDate>Thu, 01 Mar 2007 18:44:03 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1125</guid>
		<description>I&#039;d like to second what Ryan just said, and point out that I have pathetically watched the video 10... make that 11 times.</description>
		<content:encoded><![CDATA[<p>I&#8217;d like to second what Ryan just said, and point out that I have pathetically watched the video 10&#8230; make that 11 times.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ryan</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1124</link>
		<dc:creator>Ryan</dc:creator>
		<pubDate>Thu, 01 Mar 2007 04:24:00 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1124</guid>
		<description>It feels *so* weird to watch the video, because I find myself cheering for it.  Go!  C&#039;mon, little guy!  You can do it- no- just move it to the- a little to the right!</description>
		<content:encoded><![CDATA[<p>It feels *so* weird to watch the video, because I find myself cheering for it.  Go!  C&#8217;mon, little guy!  You can do it- no- just move it to the- a little to the right!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Kuliniewicz</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1123</link>
		<dc:creator>Paul Kuliniewicz</dc:creator>
		<pubDate>Thu, 01 Mar 2007 00:36:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1123</guid>
		<description>Weakening the selection pressure helps to avoid getting trapped in a local maximum, by allowing poorer performers to survive for a while and hopefully mutate into something even better.  Tournament selection is nifty in that it provides an easy way to parameterize the selection pressure, by controlling the number of participants in each tournament.

There are five types of mutation.  A point mutation changes a single byte in the organism.  An insertion inserts one or more bytes.  A deletion deletes one or more bytes.  A transposition takes two contiguous chunks and swaps them.  A duplication takes a chunk of bytes and inserts a copy immediately afterwards.  Mutations can take place anywhere within the organism.

Of course, as you observed, we expect most of the progress to occur at the &quot;tail&quot;, where the tail is the part of the solution after the last time a virus was eliminated.  Changes here can&#039;t make performance any worse, but could make it better.  A mutation earlier on is more likely to throw everything behind it out of whack, since the later moves will be played when the game is in a different state.  It&#039;s possible to make a good beginning even better, but it&#039;s less likely than improving the tail.</description>
		<content:encoded><![CDATA[<p>Weakening the selection pressure helps to avoid getting trapped in a local maximum, by allowing poorer performers to survive for a while and hopefully mutate into something even better.  Tournament selection is nifty in that it provides an easy way to parameterize the selection pressure, by controlling the number of participants in each tournament.</p>
<p>There are five types of mutation.  A point mutation changes a single byte in the organism.  An insertion inserts one or more bytes.  A deletion deletes one or more bytes.  A transposition takes two contiguous chunks and swaps them.  A duplication takes a chunk of bytes and inserts a copy immediately afterwards.  Mutations can take place anywhere within the organism.</p>
<p>Of course, as you observed, we expect most of the progress to occur at the &#8220;tail&#8221;, where the tail is the part of the solution after the last time a virus was eliminated.  Changes here can&#8217;t make performance any worse, but could make it better.  A mutation earlier on is more likely to throw everything behind it out of whack, since the later moves will be played when the game is in a different state.  It&#8217;s possible to make a good beginning even better, but it&#8217;s less likely than improving the tail.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: E Procter</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1122</link>
		<dc:creator>E Procter</dc:creator>
		<pubDate>Wed, 28 Feb 2007 03:53:37 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1122</guid>
		<description>hmmm....

*thinking*

ok, i agree that the &quot;top &lt;i&gt;n&lt;/i&gt; solutions&quot; selection technique may not be optimal for Dr. Mario, but for other game-types i would still believe that it would be superior... i.e. Mario Bros...

the next thing i have to say really depends on how your mutation subroutine works, but i assume that it simply randomly identifies a &quot;move&quot; and mutates it...  

given the nature of video games, do you think it would be beneficial to include more than the combinations and mutations?  by that, i mean to simply take solution &quot;L&quot; (that has obviously already been selected to contribute to the next generation) and simply &quot;amputate&quot; a random length of the solution tail?  in order to allow it to participate in the fitness evaluations you&#039;d have to randomly generate (a la generation 0) a new tail, though it really shouldn&#039;t be that hard to actually implement given that i assume you have the subroutines for these already in your combinations and as part of your initial population generation, respectively...

just to make sure i&#039;m making sense, it would be like if you had solution &quot;a,b,b,u,d,l,l,l,r,d&quot; and instead of mutating it at the fourth &#039;move&#039; of &#039;u&#039;, &quot;amputating&quot; it at, say, the first &#039;d&#039; and regenerating a new tail...

the only reason i bring this up is that since video games, especially old school Nintendo ones, are fairly linear in their gameplay, and you may get stuck with solutions that, while &#039;best&#039;, just aren&#039;t going to get you there... and while this is typically picked up by mutations, well... like i said, i don&#039;t know how your mutations work so i can&#039;t really speculate...

all in all, though, looks good...  and is pretty impressive...

oh, and by the by, it&#039;s about time you excluded start/select...</description>
		<content:encoded><![CDATA[<p>hmmm&#8230;.</p>
<p>*thinking*</p>
<p>ok, i agree that the &#8220;top <i>n</i> solutions&#8221; selection technique may not be optimal for Dr. Mario, but for other game-types i would still believe that it would be superior&#8230; i.e. Mario Bros&#8230;</p>
<p>the next thing i have to say really depends on how your mutation subroutine works, but i assume that it simply randomly identifies a &#8220;move&#8221; and mutates it&#8230;  </p>
<p>given the nature of video games, do you think it would be beneficial to include more than the combinations and mutations?  by that, i mean to simply take solution &#8220;L&#8221; (that has obviously already been selected to contribute to the next generation) and simply &#8220;amputate&#8221; a random length of the solution tail?  in order to allow it to participate in the fitness evaluations you&#8217;d have to randomly generate (a la generation 0) a new tail, though it really shouldn&#8217;t be that hard to actually implement given that i assume you have the subroutines for these already in your combinations and as part of your initial population generation, respectively&#8230;</p>
<p>just to make sure i&#8217;m making sense, it would be like if you had solution &#8220;a,b,b,u,d,l,l,l,r,d&#8221; and instead of mutating it at the fourth &#8216;move&#8217; of &#8216;u&#8217;, &#8220;amputating&#8221; it at, say, the first &#8216;d&#8217; and regenerating a new tail&#8230;</p>
<p>the only reason i bring this up is that since video games, especially old school Nintendo ones, are fairly linear in their gameplay, and you may get stuck with solutions that, while &#8216;best&#8217;, just aren&#8217;t going to get you there&#8230; and while this is typically picked up by mutations, well&#8230; like i said, i don&#8217;t know how your mutations work so i can&#8217;t really speculate&#8230;</p>
<p>all in all, though, looks good&#8230;  and is pretty impressive&#8230;</p>
<p>oh, and by the by, it&#8217;s about time you excluded start/select&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ryan</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1121</link>
		<dc:creator>Ryan</dc:creator>
		<pubDate>Tue, 27 Feb 2007 18:59:20 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1121</guid>
		<description>Awesome awesome awesome!</description>
		<content:encoded><![CDATA[<p>Awesome awesome awesome!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Paul Kuliniewicz</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1120</link>
		<dc:creator>Paul Kuliniewicz</dc:creator>
		<pubDate>Tue, 27 Feb 2007 04:30:44 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1120</guid>
		<description>If you compile Wallace with some fairly aggressive &lt;a href=&quot;http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html&quot;&gt;optimization flags&lt;/a&gt; (-O3 -fomit-frame-pointer -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS), the emulation runs at about 5x normal speed inside the evolver (on my system, at least).  If you assume a typical solution takes 30 seconds of NES time (which may be optimistic in the long run, but reasonable for the first few generations), that&#039;s about 6 seconds of real time per solution.  For 1800 new solutions per generation, that comes to about 3 hours per generation, which sounds about right from experience.

So assuming you can crunch through 8 generations per day, 100 generations will take a little under two weeks, and 100,000 will take a bit over 34 years.

(These numbers are reasonably valid for a 1.7 GHz Pentium M; a faster processor would do better.)

I haven&#039;t done any real work trying to optimize the code, but I strongly suspect most of the time is being spent in the emulator itself, so even streamlining my additions to the codebase probably wouldn&#039;t shave off much time.  (Then again, humans are notoriously bad at optimizing code through intuition.)  Parallelism is one potential alternative to crunching through more solutions in less time, but that&#039;s a topic for another post....</description>
		<content:encoded><![CDATA[<p>If you compile Wallace with some fairly aggressive <a href="http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html">optimization flags</a> (-O3 -fomit-frame-pointer -DG_DISABLE_ASSERT -DG_DISABLE_CHECKS), the emulation runs at about 5x normal speed inside the evolver (on my system, at least).  If you assume a typical solution takes 30 seconds of NES time (which may be optimistic in the long run, but reasonable for the first few generations), that&#8217;s about 6 seconds of real time per solution.  For 1800 new solutions per generation, that comes to about 3 hours per generation, which sounds about right from experience.</p>
<p>So assuming you can crunch through 8 generations per day, 100 generations will take a little under two weeks, and 100,000 will take a bit over 34 years.</p>
<p>(These numbers are reasonably valid for a 1.7 GHz Pentium M; a faster processor would do better.)</p>
<p>I haven&#8217;t done any real work trying to optimize the code, but I strongly suspect most of the time is being spent in the emulator itself, so even streamlining my additions to the codebase probably wouldn&#8217;t shave off much time.  (Then again, humans are notoriously bad at optimizing code through intuition.)  Parallelism is one potential alternative to crunching through more solutions in less time, but that&#8217;s a topic for another post&#8230;.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Wesley Allen</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1119</link>
		<dc:creator>Wesley Allen</dc:creator>
		<pubDate>Tue, 27 Feb 2007 03:33:55 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1119</guid>
		<description>How long does it take to get through 6 generations?  Just wondering because I&#039;d like to see the 100(000)th generation&#039;s results.  Could that be done in a day(week[month{year}])?</description>
		<content:encoded><![CDATA[<p>How long does it take to get through 6 generations?  Just wondering because I&#8217;d like to see the 100(000)th generation&#8217;s results.  Could that be done in a day(week[month{year}])?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Jamie</title>
		<link>http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/comment-page-1/#comment-1118</link>
		<dc:creator>Jamie</dc:creator>
		<pubDate>Tue, 27 Feb 2007 03:17:38 +0000</pubDate>
		<guid isPermaLink="false">http://www.kuliniewicz.org/blog/archives/2007/02/26/wallace-0991-released/#comment-1118</guid>
		<description>Kulini... wait a second, wrong project.

But seriously awesome-sauce Paul</description>
		<content:encoded><![CDATA[<p>Kulini&#8230; wait a second, wrong project.</p>
<p>But seriously awesome-sauce Paul</p>
]]></content:encoded>
	</item>
</channel>
</rss>
