遗传算法/遗传编程解决方案的好例子有哪些?

232

遗传算法(GA)和遗传规划(GP)是有趣的研究领域。

我想知道您使用GA / GP解决过哪些具体问题,如果您没有自己开发,您使用了哪些库/框架。

问题:

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

我在寻找第一手经验,所以除非您有这种经验,请不要回答。


29
@Jason:感谢您建议使用Google。虽然它似乎有些有用,但我不明白它如何回答这个问题,因为它专门针对具有GA/GP经验的SO用户。 - knorv
3
https://dev59.com/xXVC5IYBdhLWcg3wZwTj - Dan Dyer
15
"我们期望答案得到具体专业知识的支持。" 确认!"[此问题]可能会引发辩论、争论、投票或延长的讨论。" 不正确。虽然有很多答案,但这不是一次投票,评论中也没有太多的讨论或辩论。为什么会被关闭呢?" - Adrian McCarthy
Eureqa程序非常适合遗传编程:http://www.nutonian.com/products/eureqa/ - Simon
我为某项医学研究项目编写了一个使用CUDA加速的GA来折叠蛋白质。使用8块高端GPU(Tesla系列)足以在几秒内折叠一个5000原子的蛋白质。但是需要一个大型适应度函数。由于CUDA没有内核随机数生成(和其他功能),我必须自己编写所有的代码。 - huseyin tugrul buyukisik
34个回答

153

不是作业。

我作为一名专业程序员的第一份工作(1995年),是编写一个基于遗传算法的自动交易系统,用于S&P500期货的交易。该应用程序是用Visual Basic 3编写的[!],而我不知道如何在那个时候完成任何任务,因为VB3甚至没有类。

该应用程序以由随机生成的固定长度字符串(“基因”部分)组成的群体开始,每个字符串对应于S&P500期货逐分钟价格数据中的特定形状,以及特定的买入或卖出订单、止损和止盈金额。每个字符串(或“基因”)通过对历史数据进行3年运行来评估其利润表现;每当指定的“形状”与历史数据相匹配时,我就假设相应的买入或卖出订单并评估交易结果。我还添加了一个附加条件,即每个基因都有一定数量的初始资金,并且可能潜在地破产并完全从基因库中删除。

在评估每个群体之后,幸存者会被随机交叉培育(仅通过混合两个父代的比特),选择作为父代的基因的可能性与其产生的利润成比例。我还添加了点突变的可能性,以增加一些乐趣。经过几百代的演化后,我得到了一个基因群体,可以将5000美元转变为平均约10000美元,而没有死亡或破产的风险(当然是在历史数据上)。

不幸的是,我从未有机会在实时市场上使用这个系统,因为我的老板在不到3个月的时间里以传统方式交易亏损了近10万美元,并失去了继续进行该项目的意愿。回顾起来,我认为该系统会获得巨大的利润-不是因为我一定做对了什么,而是因为我产生的基因群体大约以5:1的比率偏向于买入订单(而不是卖出订单)。随着我们对市场的20/20的预见,1995年之后市场上涨了一些。


10
“我认为这个系统本来可以获得巨额利润” - 是的,我敢打赌它在回测环境中运作得非常完美;-) - Joel
32
@Joel: 当然有影响,但这不是我认为它会盈利的原因。它之所以能赚钱,是因为买进的倾向比卖出的倾向更加强烈。一个系统只需要在1995年到1999年之间的随机时间购买S&P500期货(不需要进行任何遗传算法等复杂的操作),就可以赚取大量的利润,但这只是事后的判断。 - MusiGenesis
11
乔尔可能在提到“过拟合”(overfitting)。 - Eric Normand
10
你需要保留一部分历史数据用于测试。最好使用交叉验证方法。 - Eric Normand
...将会触发与形状相关联的任何操作(买入或卖出以及止损)。 - MusiGenesis
显示剩余2条评论

90

我创造了一些生活在小世界中的小生物,它们拥有一个神经网络大脑,可以从世界中接收一些输入,并输出一个向量用于移动等其他行为。它们的大脑就是“基因”。

程序从具有随机大脑的随机生物群开始运行。输入和输出神经元是静态的,但中间的内容不是。

环境包含食物和危险。食物增加能量,当你有足够的能量时,你可以繁殖。危险会减少能量,如果能量为0,它们就会死亡。

最终生物进化到能够在世界中移动、寻找食物并避免危险。

然后我决定进行一项小实验。我给了生物的大脑一个名为“嘴巴”的输出神经元以及一个名为“耳朵”的输入神经元。重新开始,惊讶地发现它们进化出最大化空间的方式,每个生物都呆在自己的部分(食物是随机放置的)。它们学会相互合作,不互相干扰。总是有例外。

然后我尝试了一些有趣的事情。死亡的生物将成为食物。猜猜会发生什么!进化出两种类型的生物,一种像群居那样攻击,另一种则高度回避。

所以这里的教训是什么?通信意味着合作。一旦你引入一个伤害另一个人就可以得到好处的元素,那么合作就被破坏了。

我想知道这对自由市场和资本主义系统有什么影响。我的意思是,如果企业能够伤害他们的竞争对手而且“逃脱”的话,那么显然他们会尽一切努力伤害竞争对手。

编辑:

我用C++编写了它,没有使用框架。我编写了自己的神经网络和GA代码。Eric,谢谢您说它是可行的。人们通常不相信GA的力量(虽然局限性很明显),直到他们开始使用它。GA很简单,但并不简单。

对于怀疑者来说,只要神经网络有超过一个层次,它们就被证明能够模拟任何函数。GA是一种很简单的方法,可以在解决方案空间中寻找局部和潜在的全局最小值。将GA与神经网络结合起来,就可以找到为通用问题找到近似解的函数的相当好的方法。因为我们使用的是神经网络,所以我们正在优化某些输入的函数,而不是像其他人一样在输入的函数中使用GA。
这是生存示例的演示代码:http://www.mempko.com/darcs/neural/demos/eaters/。 构建说明: - 安装darcs、libboost、liballegro、gcc、cmake和make。 - darcs clone --lazy http://www.mempko.com/darcs/neural/ - cd neural - cmake . - make - cd demos/eaters - ./eaters Eaters Screenshot

11
你的图灵奖在哪里呢?你一定有某些疯狂的科学进展,才能让这样的实验得以进行,甚至不用RoadRunner。 - San Jacinto
3
这绝对不是虚假的……在我大一暑假时,我为了好玩做了一个非常类似于这个项目的东西,使用的是 C# 中的 XNA,但没有神经网络,而是使用遗传算法和一个拥有多种特征的生物族群。例如,一个基因控制它们的视力-高表示视野更远,低表示视野范围更广。随机放置障碍物和食物,生物通过吃食物来补充能量。特征会通过向它们添加随机生成的高斯数值来进行突变,从而导致像实际进化一样的正态分布基因。 - Philip Guin
4
我在一个研究小组工作,这种(ALife)事情是人们每天所做的。你的故事十分可信,说实话,我有点震惊,因为有人认为它是假的。不过,通常做这些的目的是指出复杂的行为可以从非常简单的系统中产生 - 我想重点没有表达得足够好。 - Lucas
2
如果我没记错的话,使用遗传算法来优化神经网络可以完全替代训练。在这个例子中,实际上没有进行神经网络训练;生物生活的世界实际上是“在职”培训。由于遗传算法涉及到代数,我想知道这个例子是否有一个阈值,通过该阈值从现有幸存者中重新构建新一代,或者这些代仅通过生物的“交配”而创建,没有全局的“重置/循环”用于新一代。 - johnbakers
显示剩余3条评论

55

2004年1月,飞利浦新显示技术联系了我,他们正在为首个商用电子墨水产品索尼Librie的电子部件开发技术。索尼Librie在Amazon Kindle和其他产品进入美国和欧洲市场多年之前,已经在日本上市。

飞利浦工程师遇到了一个严重的问题。就在该产品即将上市的几个月前,当翻页时屏幕仍会出现残影。问题出在创造静电场的200个驱动器上。每个驱动器都有一定的电压值,必须在0到1000mV之间进行正确设置。但如果更改其中任何一个驱动器的电压,那么所有驱动器的状态都会变化。

因此,单独优化每个驱动器的电压是不可能的。可能的数值组合数量为数十亿,而特殊摄像头要评估一个组合需要约1分钟时间。工程师们尝试了许多标准的优化技术,但都没有取得实质性进展。

由于我之前发布了一个基因编程库到开源社区,所以主管工程师联系了我。他问我基因编程/遗传算法是否能够帮忙,以及我是否能够参与其中。我接受了邀请,我们在合成数据上共同工作了一个月,我编写和调整了遗传算法库,而他则将其整合到他们的系统中。然后,在一个周末,他们让遗传算法库与实际硬件运行。

随后的星期一,我收到了他和他们的硬件设计师发来的赞许邮件,谈到没有人能够相信遗传算法找到的惊人结果。这就是它的全部。那一年晚些时候,该产品上市了。

我没有因此得到任何报酬,但我获得了“吹嘘”的权利。他们从一开始就说他们已经超出预算了,所以我开始工作之前就知道了这笔交易。这是一个关于遗传算法应用的绝佳案例故事。 :)


27
“超支预算”的说法是虚假的。当然,他们有钱付你的工资,但他们选择不付。这真的很糟糕,显示了大企业如何利用好心的程序员。 - Martin Capodici

53
我在婚礼上使用了遗传算法来优化座位安排。有80个客人需要分配到10张桌子上。评估准则基于让情侣坐在一起,将有共同点的人放在一起,同时保证持极端相反观点的人坐在不同的桌子上。
我运行了多次,每次都得到九张好桌子和一张混杂的桌子。最终,我的妻子做了座位安排。
我的旅行商优化器使用了一种新颖的染色体映射到行程的方法,使得繁殖和变异染色体轻而易举,并且不会产生无效的旅行路线。
更新:因为有几个人问过如何开始,我们先用任意但一致的顺序(例如按字母排序)创建一个客人(或城市)数组,称之为参考解决方案。把客人的索引看作他/她的座位号。
我们不是直接在染色体中编码这个顺序,而是编码用于将参考解决方案转换为新解决方案的指令。具体地,我们将染色体视为要交换的数组索引列表。对于染色体的解码,我们从参考解决方案开始,应用染色体指示的所有交换。在数组中交换两个条目总是会得到有效的解决方案:每个客人(或城市)仍然只出现一次。
因此,染色体可以随机生成、突变和与其他染色体交叉,并且始终会产生有效的解决方案。

那是什么新颖的映射方式? - Manuel Araoz
4
与其直接将旅游路线编码在“染色体”中,我编码了一个转换,将参考路线转化为解决方案。这些转换只是索引中城市之间的交换。因此,它们可以以任何方式重新组合,仍然始终生成一条恰好访问每个城市一次的旅游路线。 - Adrian McCarthy
谢谢!我对交换方面有点困惑。每个染色体编码一个要交换的索引列表 - 这不意味着一个索引可以在染色体中出现多次吗? - user3019612
1
染色体具有索引c1,c2,c3,...,cn。 “Solution”是一个数组a。使用您的参考列表初始化a。然后,对于染色体中的每一对索引,在解决方案中交换两个元素(temp = a[c1]; a[c1] = a[c2]; a[c2] = temp)。如果两个索引相同,也没关系,因为a仍将恰好包含每个客人(或城市)一次。 - Adrian McCarthy

35
我使用遗传算法(以及一些相关技术),为风险管理系统确定最佳设置,以防止盗用信用卡的游戏代练购买MMO游戏。该系统将输入数千个具有“已知”价值(欺诈或非欺诈)的交易,并计算出最佳设置组合,以正确识别欺诈交易,同时不会产生太多误报。
我们拥有关于交易的几十个(布尔类型)特征的数据,每个特征都被赋予一个值并进行总和。如果总和高于阈值,则该交易为欺诈交易。遗传算法将创建大量随机值集,对其进行评估,然后选择得分最高的值(在欺诈检测和限制错误报告数量方面都表现最佳),然后交叉培育每一代中最好的几个来生成候选新一代。经过一定数量的代之后,得分最高的值设置被认为是获胜者。
创建已知数据语料库进行测试是该系统的致命缺点。如果等待付款返还,你就会落后几个月,因此必须手动审查大量交易,以便在不用等待太长时间的情况下建立数据语料库。
这最终识别出了大部分欺诈行为,但无法将最易受欺诈的项目降至1%以下(考虑到90%的收款交易可能是欺诈交易,这已经做得很好了)。
我使用Perl完成了所有这些工作。在相当旧的Linux计算机上运行软件需要1-2个小时(20分钟用于通过广域网连接加载数据,其余时间用于计算)。每个给定世代的大小都受可用RAM的限制。我会一遍又一遍地运行它,并对参数进行轻微更改,以寻找特别好的结果集。
总的来说,它避免了手动调整数十个欺诈指标的相对值所带来的麻烦,并始终产生比我手工创建的更好的解决方案。据我所知,它仍在使用中(我编写它后约3年)。

我认为你可以使用神经网络来进行参数调整(虽然这样做比手动调整需要更长的时间,但效果会更好)。 - alexpinho98

22

除了一些常见问题,比如旅行商问题和Roger Alsing的蒙娜丽莎程序的变体,我还编写了一个进化数独求解器(这需要我自己进行一些原创性思考,而不仅仅是重新实现别人的想法)。虽然有更可靠的算法来解决数独,但进化方法也能够很好地工作。

在过去的几天里,我一直在使用进化程序寻找扑克牌中的“冷牌”,之前看到了Reddit上的这篇文章。目前还不太令人满意,但我认为我可以改进它。

我有自己的框架用于进化算法。


22

足球竞猜。我建立了一个遗传算法系统,用于预测澳式足球联赛(AFL)每周比赛的结果。

几年前,我厌倦了标准的足球池,每个人都只是在网上选一些媒体专家的选择。所以,我想打败一群广播新闻专业的人一定不难,对吧?我的第一个想法是从Massey Ratings获取结果,然后在赢得名声和荣耀后公开我的策略。但是,由于我从未发现Massey跟踪AFL的原因,因此我心中的怀疑者认为这是因为每场AFL比赛的结果基本上已经变成随机事件,但是我对最近规则变化的抱怨属于另一个论坛。

该系统基本上考虑了进攻实力、防守实力、主场优势、每周改进(或缺乏改进)以及这些方面的变化速度。这为每支队伍在整个赛季内创建了一组多项式方程。可以计算出给定日期每场比赛的胜者和得分。目标是找到最接近所有过去比赛结果的系数集,并使用该集进行预测即将到来的比赛。

在实践中,该系统会找到准确预测过去90%以上比赛结果的解决方案。然后成功预测即将到来的一周(即不在训练集中的那一周)的大约60-80%的比赛。

结果:略高于中等水平。没有主要的现金奖励,也没有我可以用来打败拉斯维加斯的系统。不过这很有趣。

我从头开始建立了所有东西,没有使用框架。


18

我曾为我公司1992年开发的货运行业3D激光表面轮廓系统开发了一款自制遗传算法。

该系统依赖于三维三角测量技术,并使用自定义激光线扫描仪和一个512x512相机(带有自定义捕获硬件)。相机与激光之间的距离永远不可能精确,相机的焦点也不在您期望的256,256位置!

使用标准几何学和模拟退火式方程求解来计算校准参数是一场噩梦。

遗传算法是在一个晚上设计出来的,我创建了一个校准立方体进行测试。我知道立方体的尺寸非常准确,因此我的遗传算法可以为每个扫描单元进化一组定制的三角测量参数,以克服生产变异。

这个技巧起到了惊人的效果。我简直惊呆了!大约经过10代,我的“虚拟”立方体(从原始扫描生成并从校准参数重新创建)实际上看起来像一个立方体!经过大约50代后,我获得了所需的校准。


11
通常在计划粉刷房屋时很难得到完美的颜色组合。你可能有某种颜色想法,但卖家却没有展示出来。
昨天,我的教授(一位遗传算法研究者)提到了德国的一个真实故事(抱歉,我没有更多参考资料,如果有人需要,我可以找到)。这个人(我们称之为“颜色专家”)过去会挨家挨户地帮助人们找到最接近客户想法的确切颜色代码(以 RGB 形式)。他是这样做的:
“颜色专家”会携带使用遗传算法的软件程序。他会从4种不同的颜色开始,每种颜色都编码为编码染色体(其解码值将是 RGB 值)。消费者选择其中一种颜色(最接近他/她心目中的颜色)。然后程序会将最大适应度分配给该“个体”,并使用“突变/交叉”移动到下一代。重复以上步骤,直到消费者找到准确的颜色,然后“颜色专家”会告诉他 RGB 组合!
通过将最大适应度分配给最接近消费者心目中的颜色,“颜色专家”的程序增加了收敛到消费者确切想法的颜色的机会。我觉得这很有趣!

现在我得到了一个-1,如果你计划再给我更多的-1,请解释一下这样做的原因!


6
我不会给你点踩,但我猜可能是因为你没有自己做过。原帖明确要求分享自己的经历。 - jprete
这基本上是理查德·道金斯生物形态的简化版本。 - Nick Johnson
1
关于颜色的有趣之处在于你不能孤立地考虑它。色彩顾问不会只带来一个颜色 - 他们会带来调色板和方案。仅仅选择单一颜色是没有意义的。我没有投反对票,但你的答案有些扯远了遗传算法的定义。你如何变异/交叉一个颜色?这更像是迭代地缩小一个有限数据集的演示。 - Kirk Broadhurst
2
这可能解释了为什么会有负评:这似乎更像是爬山算法,而不是遗传算法。 - Eric Normand

8
几周前,我提出了一个SO上的解决方案,使用遗传算法来解决图形布局问题。这是一个约束优化问题的例子。
此外,在机器学习领域,我从头开始用c/c++实现了一个基于GA的分类规则框架。
我还在一个示例项目中使用GA来训练人工神经网络(ANN),而不是使用著名的反向传播算法
另外,在我的研究生研究中,我使用GA来训练隐马尔可夫模型,作为EM-based Baum-Welch算法的另一种方法(同样是使用c/c++)。

你好Amro。你是否对使用反向传播和遗传算法得到的结果进行了全面比较?如果是,能否与我们分享比较结果?你是如何实现两个神经网络的交叉步骤的? - lmsasu
@lmsasu:没有什么花哨的东西:种群中的每个字符串或染色体都代表网络的权重和偏置值,使用简单的1或2点交叉操作。据我回忆,使用GA训练网络需要很长时间。我的实现更多是一个概念验证,而不是其他任何东西(在这里查看控制虚拟扫雷机器人的玩具示例)......无论如何,应该有很多论文讨论使用GA不仅学习权重,还演化网络结构。 - Amro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接