什么是遗传algorithm/遗传编程解决scheme的好例子?

遗传algorithm (GA)和遗传编程 (GP)是有趣的研究领域。

我想知道你使用GA / GP解决的具体问题,以及如果你没有推出自己的库,你使用了哪些库/框架。

问题:

  • 您使用GA / GP解决了哪些问题?
  • 你使用了什么库/框架?

我正在寻找第一手的经验,所以请不要回答,除非你有这个。

不是作业。

我作为专业程序员(1995)的第一份工作是为S&P500期货编写基于遗传algorithm的自动交易系统。 该应用程序是用Visual Basic 3编写的,我不知道自己当时是怎么做的,因为VB3甚至没有类。

应用程序从随机生成的固定长度string(“基因”部分)开始,每个string对应于标普500期货的逐分钟价格数据中的特定形状,以及特定顺序(买入或卖出)以及止损和止损价值。 每个string(或“基因”)通过3年的历史数据来评估其盈利绩效; 每当指定的“形状”与历史数据相匹配时,我就假定相应的买入或卖出订单,并对交易结果进行评估。 我补充说明,每个基因都是以一笔固定的金额开始的,因此可能会被破坏并完全从基因库中移除。

在对每个人群进行评估之后,将幸存者随机杂交(通过混合来自两个父母的比特),select一个基因作为父母的可能性与其产生的利润成正比。 我还增加了点突变的可能性,使事情变得更加有趣。 在经过几百代之后,我终于得到了一个基因数量可以达到5000美元的平均数,大约10000美元,没有死亡/破产的机会(当然是历史数据)。

不幸的是,我从来没有机会使用这个系统,因为我的老板在不到三个月的时间里就以传统的方式交易了近10万美元,而且他失去了继续这个项目的意愿。 回想起来,我认为这个系统本来可以赚取巨额利润,并不是因为我一定在做任何事情,而是因为我产生的基因群体偏向于买入订单(而不是卖出订单),大约是5: 1的比例。 正如我们20/20事后所知,1995年后市场上涨了一点。

我在这个小小的世界里生活了一些小动物。 他们有一个neural network大脑,接收来自世界的一些input,输出是一个在其他动作之间移动的向量。 他们的大脑是“基因”。

该计划开始随机人口与随机大脑的生物。 input和输出神经元是静止的,但是两者之间不是。

环境包含食物和危险。 食物增加能量,当你有足够的能量时,你可以交配。 危险会降低能量,如果能量为0,则会死亡。

最终,这些生物发展到世界各地,寻找食物,避免危险。

然后我决定做一个小实验。 我给生物脑子一个叫做“嘴巴”的输出神经元和一个叫做“耳朵”的input神经元。 开始了,惊奇地发现他们进化到最大化的空间,每个生物都留在其各自的部分(食物被随机放置)。 他们学会了相互合作而不是彼此相处。 总是有例外。

然后我尝试了一些有趣的。 我死的生物会成为食物。 试着猜猜发生了什么事! 有两种types的生物进化,如蜂群中攻击的生物,以及高回避的生物。

那么这里的教训是什么? 沟通意味着合作。 只要你介绍一个伤害另一个意味着你获得的东西,那么合作就会被破坏。

我想知道这是如何反映在自由市场和资本主义制度上的。 我的意思是,如果企业能够损害竞争力, 摆脱这种竞争,那么他们就会尽其所能,以损害竞争。

编辑:

我用C ++编写而不使用框架。 写了我自己的neural network和GA代码。 埃里克,谢谢你说这是有道理的。 人们通常不相信GA的能力(虽然局限性是显而易见的),直到他们玩弄它。 GA简单但不简单。

对于怀疑者,neural network已经被certificate能够模拟任何function,如果他们有一个以上的层次。 GA是一种非常简单的方式来浏览解决scheme空间,find本地和潜在的全球最小值。 结合遗传algorithm和neural network,你有一个很好的方法来find函数,寻找近似解决scheme的一般问题。 因为我们正在使用neural network,所以我们正在优化一些input的函数,而不是像其他人使用GA那样input函数

这里是生存例子的演示代码: http : //www.mempko.com/darcs/neural/demos/eaters/构build说明:

  • 安装darcs,libboost,liballegro,gcc,cmake,make
  • darcs clone --lazy http://www.mempko.com/darcs/neural/
  • cd neural
  • cmake .
  • make
  • cd demos/eaters
  • ./eaters

食者屏幕截图

我使用GA来优化我的结婚招待会上的座位分配。 超过10桌的80位客人。 评估function是基于让人们注意date,把人们的共同点放在一起,并在不同的桌子上让人们反其道而行之。

我跑了好几次 每一次,我都得到了九张好桌子,还有一张是所有奇怪的球。 最后,我的妻子做了座位分配。

我的旅行推销员优化器使用染色体到行程的新映射,这使得繁殖和变异染色体毫无价值,而没有任何产生无效行程的风险。

更新 :因为有几个人问如何…

从一些客人(或城市)开始,以一些随意但一致的顺序排列,例如按字母顺序排列。 将其称为参考解决scheme。 把客人的索引当作自己的座位号码。

我们不是直接在染色体中尝试编码这种sorting,而是将参考解决scheme转换为新的解决scheme。 具体而言,我们将染色体视为数组中的索引列表进行交换。 为了解码染色体,我们从参考解开始,并应用染色体指示的所有交换。 交换数组中的两个条目始终会产生一个有效的解决scheme:每个访客(或城市)仍然只出现一次。

因此,染色体可以随机产生,突变,并与其他人交叉,并将始终产生有效的解决scheme。

2004年1月,我与飞利浦新显示技术公司联系,他们正在创造第一台商用电子墨水的电子产品,索尼Librie,这个电子墨水在亚马逊Kindle和其他人在美国市场上市几年前才在日本发行。一个欧洲。

飞利浦工程师有一个主要问题。 在产品推出前几个月,他们在更换页面时仍然在屏幕上出现鬼影。 问题是造成静电场的200名司机。 每个驱动器都有一定的电压,必须设置在0到1000 mV之间或类似的东西。 但是如果你改变了其中一个,它会改变一切。

因此,单独优化每个驾驶员的电压是不可能的。 可能的数值组合的数量是数十亿,而特殊的相机花费大约1分钟来评估单个组合。 工程师们尝试了很多标准的优化技术,但是没有什么可以接近的。

首席工程师与我联系,因为我之前已经向开源社区发布了遗传编程库。 他问GP / GA是否会帮助,如果我能介入。 我做了,大概一个月,我们一起工作,编写和调整GA库,合成数据,并将他整合到他们的系统中。 然后,一个周末,他们让它与真实的东西一起生活。

接下来的星期一,我收到了他和他们的硬件devise师发来的这些发光的电子邮件,告诉大家没有人会相信GA发现的惊人结果。 就是这样。 该产品当年晚些时候投放市场。

我没有得到一分钱,但我有“吹牛”的权利。 他们从开始就说已经超出了预算,所以在我开始研究之前我就知道这笔交易了。 对于GAs的应用来说这是一个很棒的故事。 🙂

我使用遗传algorithm(以及一些相关的技术)来确定一个风险pipe理系统的最佳设置,该系统试图阻止黄金农民使用被盗的信用卡来支付MMO。 该系统将采取“已知”价值(欺诈与否)的数千交易,并找出什么最好的组合设置是正确识别欺诈性交易,而没有太多的误报。

我们有几十个(布尔)特性的交易数据,每个数据都被赋予了一个值并且总计了一个数值。 如果总额高于门槛,交易就是欺诈行为。 遗传algorithm会创build大量的随机数值,根据已知数据的语料库对其进行评估,select得分最高的数据(在欺诈检测和限制假阳性数量上),然后将最好的数据从每一代都会产生新一代的候选人。 经过一定的代数后,最好的得分值被视为胜利者。

创build已知数据的语料库来testing是系统的致命弱点。 如果您等待退款,您在尝试回应欺诈者时已经落后了几个月,所以有人不得不手动审查大量交易,以便build立该数据集,而不必等太久。

这最终确定了大部分的欺诈行为,但是却不能把欺诈行为最多的情况弄到1%以下(考虑到90%的新来的交易可能是欺诈行为,而且performance相当好)。

我用perl做了所有这些。 在一个相当老的Linux机器上运行一个软件需要1-2个小时才能运行(20分钟通过WAN连接加载数据,剩下的时间花在计算上)。 任何一代人的规模都受到可用RAM的限制。 我会一遍又一遍的对参数进行一些改动,寻找一个特别好的结果集。

总而言之,它避免了手动试图调整数十个欺诈指标的相对价值的一些弊端,并始终提出比我手工创build更好的解决scheme。 AFAIK,它仍然在使用(大约3年后,我写了)。

足球小费。 我build立了一个GA系统来预测AFL(澳式足球)中每周的比赛结果。

几年前,我对标准足球池感到厌倦,每个人都只是上网,并从新闻界的一些专家那里挑选。 所以,我觉得打败一批广播新闻专业不是很难,对吗? 我的第一个想法是取得梅西评级的结果,然后在赛季结束后透露我赢得名望和荣誉后的战略。 然而,由于我从未发现的原因,梅西不跟踪AFL。 我的愤世嫉俗是因为每个AFL比赛的结果基本上都是随机的,但是我对最近规则变化的抱怨属于不同的论坛。

该体系基本上考虑了进攻实力,防守实力,主场优势,逐周改善(或缺乏)以及这些变化的速度。 这为本赛季的每支球队创build了一组多项式方程。 可以计算给定date的每场比赛的获胜者和得分。 我们的目标是find最接近所有过去比赛结果的一组系数,并用它来预测未来几周的比赛。

在实践中,该系统将find能准确预测90%以上游戏结果的解决scheme。 然后,它将成功挑选即将到来的一周(即不在训练集中的一周)的约60-80%的比赛。

结果:在包的中间。 没有主要的现金奖,也没有一个我可以用来击败拉斯维加斯的系统。 虽然这很有趣。

我从头开始构build一切,没有使用框架。

除了一些常见的问题,比如旅行推销员和Roger Alsing的Mona Lisa程序的变体,我还写了一个进化的Sudoku求解器 (这需要更多的原创思想,而不是仅仅重新实现别人的想法)。 有更可靠的algorithm来解决Sudokus,但演化的方法工作得很好。

在过去的几天里,我一直在玩一个进化的程序,在Reddit上看到这篇文章后,find扑克的“冷板”。 目前还不是很满意,但我想我可以改进它。

我有我自己的框架 ,我用于进化algorithm。

我开发了一种家用酿造GA,用于我公司1992年为货运业开发的3D激光表面轮廓系统。该系统依靠三维三angular测量,并使用定制的激光线扫描仪,512×512相机(具有自定义捕捉function)。 相机和激光之间的距离永远不会很精确,相机的焦点也不在您预期的256,256位置!

尝试使用标准几何和模拟退火方式求解校准参数是一场噩梦。

遗传algorithm在一个晚上被掀起,我创build了一个校准立方体来testing它。 我知道立方体尺寸的准确性很高,因此我的遗传algorithm可以为每个扫描单元发展一套自定义三angular测量参数,以克服生产变化。

诀窍工作的一种享受。 我至less大惊小怪! 在大约10代以后,我的“虚拟”立方体(从原始扫描生成并从校准参数重新创build)实际上看起来像一个立方体! 经过大约50代后,我需要校准。

当你打算画房子时,往往很难得到准确的颜色组合。 通常情况下,你有一些颜色,但它不是颜色之一,供应商给你看。

昨天,我的一位研究员教授提到德国的一个真实的故事(对不起,我没有进一步的参考,是的,如果有人要求,我可以找出来)。 这个家伙(让我们称他为色彩家伙 )曾经从门外走,帮助人们find确切的颜色代码( RGB ),这将是客户想要的东西。 以下是他将如何做到这一点:

颜色家伙曾经带着一个使用GA的软件程序。 他曾经开始使用4种不同的颜色,每种颜色编码为一个编码的染色体(其解码值将是一个RGB值)。 消费者select4种颜色中的一种(这是他/她心目中最接近的)。 然后该程序将为该个体分配最大适应度 ,并使用突变/交叉移至下一代 。 上述步骤将重复,直到消费者find确切的颜色,然后颜色的家伙用来告诉他的RGB组合!

通过对颜色赋予最大的适应度,关注消费者的心理, 颜色家伙的计划正在增加融合到颜色的机会,消费者已经牢记在心。 我觉得它很有趣!

现在我已经有了一个-1,如果你计划多一个-1,请。 阐明这样做的理由!

作为我本科CompSci学位的一部分,我们被分配了为Jikes研究虚拟机寻找最佳jvm标志的问题。 这是使用Dicappo基准套件进行评估的,该套件将时间返回到控制台。 我写了一个分布式的gentic alogirthm来切换这些标志来改善基准testing套件的运行时间,尽pipe为了补偿影响结果的硬件抖动需要数天的时间。 唯一的问题是我没有正确地学习编译器理论(这是作业的意图)。

我可以使用现有的默认标志来播种最初的种群,但有趣的是algorithm发现了与O3优化级别非常类似的configuration(但在许多testing中实际上更快)。

编辑:另外,我写了我自己的遗传algorithm框架在Python的作业,只是用popen命令来运行各种基准,但如果它不是一个评估任务,我会看pyEvolve。

首先,Jonathan Koza的“遗传编程”( 关于亚马逊 )几乎是关于遗传和进化algorithm/编程技术的书籍,有很多例子。 我强烈build议检查一下。

至于我自己使用的一种遗传algorithm,我使用了一个(本土种植的)遗传algorithm来演化一个对象收集/销毁场景(实际目的可能是清除雷区)的一个群体algorithm。 这是一篇文章的链接。 我所做的最有趣的部分是多阶段适应度函数,因为简单的适应度函数没有为遗传algorithm提供足够的信息来充分区分群体成员,所以这是必须的。

几个星期前,我提出了一个使用遗传algorithm来解决graphics布局问题的解决scheme。 这是一个约束优化问题的例子。

同样在机器学习领域,我从零开始在c / c ++中实现了基于遗传algorithm的分类规则框架。
我也在一个样本项目中使用GA来训练人工neural network (ANN),而不是使用着名的反向传播algorithm 。

另外,作为我的研究生研究的一部分,我使用遗传algorithm训练隐马尔可夫模型作为基于EM的Baum-Welchalgorithm(再次以c / c ++)的附加方法。

我是调查使用演化计算(EC)的团队的一部分,自动修复现有程序中的错误。 我们已经成功地修复了现实世界软件项目中的一些真正的错误(参见这个项目的主页 )。

我们有这种EC修复技术的两个应用程序。

  • 第一个( 通过项目页面可用的代码和复制信息 )演化从现有C程序parsing的抽象语法树,并使用我们自己的自定义EC引擎在Ocaml中实现。

  • 第二个( 通过项目页面提供的代码和复制信息 )是我个人对该项目的贡献,演变了x86程序集或Java编码的程序,这些程序是用许多编程语言编写的。 这个应用程序在Clojure中实现,也使用自己定制的EC引擎。

Evolutionary Computation的一个很好的方面就是技术的简单性使得可以在不太困难的情况下编写自己的定制实现。 关于遗传编程的一个很好的免费介绍性文本,请参阅遗传编程实地指南

我和同事正在制定一个解决scheme,使用我们公司要求的各种标准将货物装载到卡车上。 我一直在研究一个遗传algorithm解决scheme,而他正在使用一个分支和束缚与积极的修剪。 目前我们还在实施这个解决scheme,但到目前为止,我们已经取得了不错的成绩。

几年前,我用ga's来优化asr(自动语音识别)语法以获得更好的识别率。 我从相当简单的select列表开始(其中ga正在testing每个时隙的可能项的组合),并开始使用更加开放和复杂的语法。 通过在一种语音距离函数下测量术语/序列之间的分离来确定健身。 我也尝试在语法上做一个弱等价的变体,find一个编译成更紧凑的表示(最后我用一个直接的algorithm,并大大增加了我们可以在应用程序中使用的“语言”的大小) 。

最近,我用它们作为默认假设,用来testing各种algorithm产生的解决scheme的质量。 这在很大程度上涉及分类和不同types的拟合问题(即创build一个“规则”,解释审阅者对一个或多个数据集做出的一系列select)。

我制作了一个名为“GALAB”的完整的GA框架,来解决很多问题:

  • 定位GSM ANT(BTS)以减less重叠和空白位置。
  • 资源约束项目调度。
  • 进化的图片创作。 ( Evopic )
  • 旅行推销员问题。
  • N皇后&N颜色问题。
  • 骑士的旅游和背包问题。
  • 魔方与数独谜题。
  • string压缩,基于Superstring问题。
  • 2D包装问题。
  • 微小的人造生命APP。
  • 魔方之谜。

我曾经使用GA来优化内存地址的哈希函数。 地址是4K或8K页面大小,所以它们在地址的位模式(最低有效位全部为零,中间位有规律地增加等等)中显示出一定的可预测性。原始的散列函数是“矮胖的” – 它倾向于聚集命中每隔三个哈希桶。 改进的algorithm具有近乎完美的分布。

我不知道功课是否值得…

在我的学习期间,我们推出了自己的程序来解决旅行商问题。

这个想法是对几个标准进行比较(难以描绘问题,性能等),还使用了其他技术,如模拟退火 。

它工作得很好,但是我们花了一段时间才明白如何正确地进行“再生产”阶段:将手头的问题模拟成适合遗传编程的东西,这真的让我感到最为困难。

这是一个有趣的课程,因为我们还涉猎了neural network等。

我想知道是否有人在“生产”代码中使用这种编程。

我创build了一个简单的GA,用于从音乐的频谱中提取有用的模式。 输出用于驱动winamp插件中的graphics效果。

  • input:几个FFT帧(想象一个浮点数的二维数组)
  • 输出:单个浮点值(input的加权和),阈值为0.0或1.0
  • 基因:input权重
  • 健身function:将占空比,脉宽和BPM组合在合理的范围内。

我有几个GAs根据频谱的不同部分以及不同的BPM限制调整,所以他们不倾向于趋同于相同的模式。 来自每个人群的前4名的输出被发送到渲染引擎。

一个有趣的副作用是,整个人群的平均适应度是音乐变化的一个很好的指标,尽pipe通常需要4-5秒才能发现。

作为论文的一部分,我为多目标优化algorithmmPOEMS(多目标原型优化和演化改进步骤)编写了一个通用的Java框架,这是一个使用进化概念的遗传algorithm。 所有与问题无关的部分都与问题相关的部分是分开的,而且一个接口被强制使用,只添加与问题相关的部分。 因此,想要使用该algorithm的人不必从零开始,并且使得工作非常方便。

你可以在这里find代码。

在这个algorithm中可以find的解决scheme已经在科学研究中与最先进的algorithmSPEA-2和NSGA进行了比较,并且已经certificatealgorithm的性能相当甚至更好,这取决于你的指标采取措施来衡量的性能,特别是取决于你正在寻找的优化问题。

你可以在这里find它。

作为我的论文和工作certificate的一部分,我将这个框架应用于项目组合pipe理中的项目select问题。 select对公司增值最大的项目,支持公司的大部分战略或支持任何其他任意目标。 例如,从特定类别中select一定数量的项目,或者最大化项目协同效应,…

我的论文将这个框架应用于项目select问题: http : //www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf

之后,我在财富500强之一的一个投资组合pipe理部门工作,在那里他们使用了一个商业软件,该软件也将GA应用于项目select问题/投资组合优化。

更多资源:

该框架的文档: http : //thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf

mPOEMS演示文稿: http ://portal.acm.org/citation.cfm?id=1792634.1792653

实际上,每个人都可以很容易地将通用框架的代码调整为任意的多目标优化问题。

在工作中,我遇到了以下问题:给定M个任务和N个DSP,将任务分配给DSP的最佳方式是什么? “最佳”被定义为“最小化负载最大的DSP”。 There were different types of tasks, and various task types had various performance ramifications depending on where they were assigned, so I encoded the set of job-to-DSP assignments as a "DNA string" and then used a genetic algorithm to "breed" the best assignment string I could.

It worked fairly well (much better than my previous method, which was to evaluate every possible combination… on non-trivial problem sizes, it would have taken years to complete!), the only problem was that there was no way to tell if the optimal solution had been reached or not. You could only decide if the current "best effort" was good enough, or let it run longer to see if it could do better.

There was an competition on codechef.com (great site by the way, monthly programming competitions) where one was supposed to solve an unsolveable sudoku (one should come as close as possible with as few wrong collumns/rows/etc as possible).

What I would do, was to first generate a perfect sudoku and then override the fields, that have been given. From this pretty good basis on I used genetic programming to improve my solution.

I couldn't think of a deterministic approach in this case, because the sudoku was 300×300 and search would've taken too long.

I used a simple genetic algorithm to optimize the signal to noise ratio of a wave that was represented as a binary string. By flipping the the bits certain ways over several million generations I was able to produce a transform that resulted in a higher signal to noise ratio of that wave. The algorithm could have also been "Simulated Annealing" but was not used in this case. At their core, genetic algorithms are simple, and this was about as simple of a use case that I have seen, so I didn't use a framework for generation creation and selection – only a random seed and the Signal-to-Noise Ratio function at hand.

In a seminar in the school, we develop an application to generate music based in the musical mode. The program was build in Java and the output was a midi file with the song. We using distincts aproachs of GA to generate the music. I think this program can be useful to explore new compositions.

in undergrad, we used NERO (a combination of neural network and genetic algorithm) to teach in-game robots to make intelligent decisions. It was pretty cool.

I developed a multithreaded swing based simulation of robot navigation through a set of randomized grid terrain of food sources and mines and developed a genetic algorithm based strategy of exploring the optimization of robotic behavior and survival of fittest genes for a robotic chromosome. This was done using charting and mapping of each iteration cycle.

Since, then I have developed even more game behavior. An example application I built recently for myself was a genetic algorithm for solving the traveling sales man problem in route finding in UK taking into account start and goal states as well as one/multiple connection points, delays, cancellations, construction works, rush hour, public strikes, consideration between fastest vs cheapest routes. Then providing a balanced recommendation for the route to take on a given day.

Generally, my strategy is to use POJO based representaton of genes then I apply specific interface implementations for selection, mutation, crossover strategies, and the criteria point. My fitness function then basically becomes a quite complex based on the strategy and criteria I need to apply as a heuristic measure.

I have also looked into applying genetic algorithm into automated testing within code using systematic mutation cycles where the algorithm understands the logic and tries to ascertain a bug report with recommendations for code fixes. Basically, a way to optimize my code and provide recommendations for improvement as well as a way of automating the discovery of new programmatic code. I have also tried to apply genetic algorithms to music production amongst other applications.

Generally, I find evolutionary strategies like most metaheuristic/global optimization strategies, they are slow to learn at first but start to pick up as the solutions become closer and closer to goal state and as long as your fitness function and heuristics are well aligned to produce that convergence within your search space.

I once tried to make a computer player for the game of Go, exclusively based on genetic programming. Each program would be treated as an evaluation function for a sequence of moves. The programs produced weren't very good though, even on a rather diminuitive 3×4 board.

I used Perl, and coded everything myself. I would do things differently today.

After reading The Blind Watchmaker , I was interested in the pascal program Dawkins said he had developed to create models of organisms that could evolve over time. I was interested enough to write my own using Swarm . I didn't make all the fancy critter graphics he did, but my 'chromosomes' controlled traits which affected organisms ability to survive. They lived in a simple world and could slug it out against each other and their environment.

Organisms lived or died partly due to chance, but also based on how effectively they adapted to their local environments, how well they consumed nutrients & how successfully they reproduced. It was fun, but also more proof to my wife that I am a geek.

It was a while ago, but I rolled a GA to evolve what were in effect image processing kernels to remove cosmic ray traces from Hubble Space Telescope (HST) images. The standard approach is to take multiple exposures with the Hubble and keep only the stuff that is the same in all the images. Since HST time is so valuable, I'm an astronomy buff, and had recently attended the Congress on Evolutionary Computation, I thought about using a GA to clean up single exposures.

The individuals were in the form of trees that took a 3×3 pixel area as input, performed some calculations, and produced a decision about whether and how to modify the center pixel. Fitness was judged by comparing the output with an image cleaned up in the traditional way (ie stacking exposures).

It actually sort of worked, but not well enough to warrant foregoing the original approach. If I hadn't been time-constrained by my thesis, I might have expanded the genetic parts bin available to the algorithm. I'm pretty sure I could have improved it significantly.

Libraries used: If I recall correctly, IRAF and cfitsio for astronomical image data processing and I/O.

I experimented with GA in my youth. I wrote a simulator in Python that worked as follows.

The genes encoded the weights of a neural network.

The neural network's inputs were "antennae" that detected touches. Higher values meant very close and 0 meant not touching.

The outputs were to two "wheels". If both wheels went forward, the guy went forward. If the wheels were in opposite directions, the guy turned. The strength of the output determined the speed of the wheel turning.

A simple maze was generated. It was really simple–stupid even. There was the start at the bottom of the screen and a goal at the top, with four walls in between. Each wall had a space taken out randomly, so there was always a path.

I started random guys (I thought of them as bugs) at the start. As soon as one guy reached the goal, or a time limit was reached, the fitness was calculated. It was inversely proportional to the distance to the goal at that time.

I then paired them off and "bred" them to create the next generation. The probability of being chosen to be bred was proportional to its fitness. Sometimes this meant that one was bred with itself repeatedly if it had a very high relative fitness.

I thought they would develop a "left wall hugging" behavior, but they always seemed to follow something less optimal. In every experiment, the bugs converged to a spiral pattern. They would spiral outward until they touched a wall to the right. They'd follow that, then when they got to the gap, they'd spiral down (away from the gap) and around. They would make a 270 degree turn to the left, then usually enter the gap. This would get them through a majority of the walls, and often to the goal.

One feature I added was to put in a color vector into the genes to track relatedness between individuals. After a few generations, they'd all be the same color, which tell me I should have a better breeding strategy.

I tried to get them to develop a better strategy. I complicated the neural net–adding a memory and everything. 它没有帮助。 I always saw the same strategy.

I tried various things like having separate gene pools that only recombined after 100 generations. But nothing would push them to a better strategy. Maybe it was impossible.

Another interesting thing is graphing the fitness over time. There were definite patterns, like the maximum fitness going down before it would go up. I have never seen an evolution book talk about that possibility.