我想知道您使用GA / GP解决的特定问题,以及如果您不自己动手使用的库/框架。
问题:
- 您使用GA / GP解决了哪些问题?
- 您使用了哪些库/框架?
我正在寻找第一手经验,因此,除非您有经验,否则请不要回答。
我想知道您使用GA / GP解决的特定问题,以及如果您不自己动手使用的库/框架。
问题:
我正在寻找第一手经验,因此,除非您有经验,否则请不要回答。
Answers:
不是功课。
我作为专业程序员的第一份工作(1995年)是为S&P500期货编写基于遗传算法的自动交易系统。该应用程序是用Visual Basic 3 [!]编写的,当时我不知道该怎么做,因为VB3甚至都没有类。
该应用程序从大量随机生成的固定长度字符串(“基因”部分)开始,每个字符串都对应于S&P500期货的按分钟定价数据中的特定形状和特定定单(买或卖)以及止损和止盈金额。每个字符串(或“基因”)的利润表现都经过3年的历史数据评估;只要指定的“形状”与历史数据匹配,我就假定相应的买入或卖出订单并评估交易结果。我补充了一个警告,每个基因都以固定的金额开始,因此有可能破产并从基因库中完全删除。
在对种群进行每次评估后,将幸存者随机进行杂交(仅混合来自两个亲本的位),选择基因作为亲本的可能性与其产生的利润成正比。我还添加了点突变的可能性,以使事情更加有趣。经过几百代的研究,我最终得到了一组基因,这些基因可以将5000美元变成大约10000美元的平均水平,而没有死亡/折损的机会(当然,根据历史数据)。
不幸的是,我从来没有机会现场使用该系统,因为我的老板在不到3个月的时间里以传统方式交易损失了近100,000美元,并且他失去了继续进行该项目的意愿。回想起来,我认为该系统本来可以赚取巨额利润-不是因为我必须做正确的事,而是因为我生产的基因数量偏向于购买订单(而不是卖出订单)大约5: 1个比例。以我们20/20的事后观察,我们知道市场在1995年以后有所上涨。
each of which corresponded to a specific shape in the minute-by-minute price data
?
我做了一个生活在这个小世界中的小动物。他们有一个神经网络的大脑,可以从世界上获得一些输入,输出是其他动作之间运动的媒介。他们的大脑是“基因”。
该计划从随机的小动物和随机的大脑开始。输入和输出神经元是静态的,但中间不是。
环境包含食物和危险。食物增加了能量,当您有足够的能量时,就可以交配。这些危险会减少能量,如果能量为0,它们就会死亡。
最终,这些生物进化为在世界各地移动并寻找食物并避免了危险。
然后,我决定做一个小实验。我给了生物大脑一个称为“嘴”的输出神经元和一个称为“耳朵”的输入神经元。重新开始,惊奇地发现它们进化到最大空间,每个生物都停留在其各自的部位(食物被随机放置)。他们学会了互相合作,而不是互相干涉。总是有例外。
然后我尝试了一些有趣的事情。我死了的生物将成为食物。尝试猜测发生了什么!有两种类型的生物进化出来,一种像成群结队地攻击,另一种则高度回避。
那么这里的课程是什么?交流意味着合作。一旦引入一种因素,而伤害另一种因素意味着您有所收获,那么合作就会被破坏。
我不知道这如何反映在自由市场和资本主义制度上。我的意思是,如果企业能够损害竞争并摆脱竞争,那么很明显,他们将尽一切力量损害竞争。
编辑:
我用C ++编写,没有任何框架。编写了我自己的神经网络和GA代码。埃里克(Eric),谢谢您说这是合理的。人们通常不相信GA的力量(尽管局限性显而易见),直到他们开始使用它。GA很简单,但不简单。
对于怀疑者来说,神经网络已被证明能够模拟任何功能(如果它们具有多个层)。GA是一种非常简单的导航解决方案空间的方法,可以找到局部和潜在的全局最小值。将GA与神经网络结合起来,您就有了很好的方法来找到可以找到通用问题的近似解决方案的函数。由于我们使用的是神经网络,因此我们正在针对某些输入优化函数,而不是像其他函数使用GA那样优化函数的某些输入
以下是生存示例的演示代码:http : //www.mempko.com/darcs/neural/demos/eaters/ 构建说明:
darcs clone --lazy http://www.mempko.com/darcs/neural/
cd neural
cmake .
make
cd demos/eaters
./eaters
2004年1月,飞利浦新显示技术公司与我联系,后者正在为首款商业电子墨水电子产品Sony Librie创造电子产品,该产品仅在日本发布,比亚马逊Kindle和其他产品在美国上市早了几年。欧洲。
飞利浦的工程师遇到了一个主要问题。在该产品推向市场之前的几个月,他们在换页时仍然在屏幕上出现鬼影。问题是200个驱动器正在产生静电场。这些驱动器中的每一个都有一定的电压,必须将其设置在零到1000 mV之间或类似的电压。但是,如果您更改其中之一,则将更改所有内容。
因此,单独优化每个驱动器的电压是不可能的。值的可能组合数以十亿计,用特殊的相机评估单个组合大约需要1分钟。工程师们尝试了许多标准的优化技术,但是没有什么比这更接近。
首席工程师联系了我,因为我以前已经向开放源代码社区发布了基因编程库。他问GP / GA是否会有所帮助,我是否可以参与其中。我做到了,并且大约一个月的时间我们一起工作,我编写和调整GA库,使用合成数据,然后将其集成到他们的系统中。然后,一个周末,他们让它与真实事物一起运行。
在接下来的星期一,我收到了他和他们的硬件设计师发出的热情洋溢的电子邮件,内容是关于没人能相信GA所发现的惊人结果的。就是这样 那年下半年,该产品投放市场。
我没有为此得到一分钱的报酬,但我却拥有“吹牛”的权利。他们说,从一开始他们就已经超出预算,所以我在开始工作之前就知道这笔交易是什么。对于GA的应用来说,这是一个伟大的故事。:)
我在婚礼招待会上使用了GA优化座位分配。10张桌子有80位客人。评估功能的基础是让人们与他们的约会保持一致,将有共同点的人们聚在一起,并把观点截然相反的人们放在分开的桌子上。
我跑了好几次。每次,我有9张好桌子,一张有所有奇数球。最后,我的妻子做了座位分配。
我的旅行推销员优化程序使用了染色体到行程的新颖映射,这使得繁殖和变异染色体变得微不足道,而没有产生无效旅行的风险。
更新:因为有几个人问过...
从以一系列任意但一致的顺序(例如,按字母顺序)的来宾(或城市)数组开始。将此称为参考解决方案。将客人的索引视为他/她的座位号。
我们没有尝试直接在染色体中编码此顺序,而是编码了将参考溶液转换为新溶液的指令。具体来说,我们将染色体视为要交换的数组中的索引列表。为了解码一条染色体,我们从参考解决方案开始,并应用该染色体指示的所有交换。在数组中交换两个条目始终会得出有效的解决方案:每个来宾(或城市)仍然只出现一次。
因此,染色体可以随机产生,变异并与他人杂交,并且将始终产生有效的解。
temp = a[c1]; a[c1] = a[c2]; a[c2] = temp
)。两个索引是否相同并不重要,因为a仍然将每个访客(或城市)仅包含一次。
我使用遗传算法(以及一些相关技术)来确定风险管理系统的最佳设置,该系统试图阻止金农使用盗窃的信用卡支付MMO费用。该系统将接收具有“已知”值(无论是否欺诈)的数千笔交易,并找出设置的最佳组合是什么,以便正确识别欺诈交易而不会产生太多误报。
我们有关于交易的几十个(布尔)特征的数据,每个特征都有一个值并累加起来。如果总数高于阈值,则说明该交易是欺诈。遗传算法会创建大量随机值集,根据已知数据集对其进行评估,选择得分最高的值(在欺诈检测和限制误报数量上),然后从每一代产生新一代的候选人。经过几代人的努力之后,最好的一组得分值被认为是赢家。
创建已知数据语料库以进行测试是该系统的致命弱点。如果您等待拒付,那么您在回应欺诈者时就落后了几个月,因此有人必须手动审查大量交易以建立该数据集,而不必等待太久。
最终确定了绝大多数欺诈行为,但是在大多数欺诈行为最容易发生的项目上,它并不能完全使其低于1%(假设90%的传入交易可能是欺诈行为,这做得很好)。
我使用perl完成了所有这些工作。在相当旧的linux机器上运行该软件将需要1-2个小时来运行(通过WAN链接加载数据需要20分钟,其余时间用于处理)。给定代的大小受可用RAM的限制。我会一遍又一遍地对参数进行一些更改,以寻找特别好的结果集。
总而言之,它避免了一些手动调整一些欺诈指标的相对价值所带来的失误,并且始终能提供比我手工创建的更好的解决方案。AFAIK,它仍然在使用中(我写它大约三年后)。
足球小费。我建立了一个GA系统来预测AFL(澳大利亚足球规则)每周比赛的结果。
几年前,我对标准的足球场感到厌烦,每个人都只是上网,并从媒体中挑选一些专家来挑选。因此,我认为击败一群广播新闻专业并不难,对吧?我首先想到的是从梅西评级公司(Massey Ratings)获得结果,然后在赢得名声和荣誉后在本赛季结束时透露我的策略。但是,出于某种原因,我从未发现梅西没有追踪AFL。我的愤世嫉俗者认为,这是因为每场AFL比赛的结果基本上都变成了随机机会,但是我对最近规则变化的抱怨属于另一个论坛。
该系统基本上考虑了进攻强度,防守强度,主场优势,每周改进(或缺乏改进)以及每项变化的速度。这为赛季中的每个团队创建了一组多项式方程。可以计算给定日期的每场比赛的获胜者和得分。目的是找到最接近所有过去比赛结果的系数集,并使用该系数集预测即将到来的几周比赛。
在实践中,系统会找到能够准确预测90%以上过去比赛结果的解决方案。然后,它将在接下来的一周(即不在训练集中的那一周)成功选择大约60-80%的游戏。
结果:刚好在包装盒的中间。没有重大的现金奖励,也没有可以用来击败维加斯的系统。虽然很有趣。
我从头开始构建了所有内容,没有使用任何框架。
除一些常见问题外,例如旅行推销员和Roger Alsing的Mona Lisa程序的变体,我还编写了一个演化Sudoku求解器(我需要更多的原创思想,而不仅仅是重新实现)别人的想法)。有更可靠的算法可以解决Sudokus问题,但进化方法效果很好。
在最近的几天里,我在Reddit上看到了这篇文章后,一直在研究一个进化程序来为扑克找到“冷盘” 。目前还不太令人满意,但我认为我可以改善它。
我在1992年为公司为货运业开发的3D激光表面轮廓系统开发了家用酿造GA。该系统依赖于3D三角剖分,并使用了定制的激光线扫描仪,512x512摄像头(带有定制的捕获硬件)。相机和激光之间的距离永远不会精确,并且在您希望的256,256位置找不到相机的焦点!
尝试使用标准几何图形和模拟退火样式方程式求解来确定校准参数是一场噩梦。
遗传算法在一个晚上起了作用,我创建了一个校准立方体来对其进行测试。我非常了解立方体的尺寸,因此我的想法是我的遗传算法可以为每个扫描单元开发一套自定义的三角测量参数,从而克服生产变化。
这个招很有效。至少我感到惊讶!在大约十代内,我的“虚拟”多维数据集(从原始扫描生成并从校准参数重新创建)实际上看起来就像一个多维数据集!大约50代之后,我进行了所需的校准。
当您计划粉刷房屋时,通常很难获得确切的颜色组合。通常,您会想到一些颜色,但这不是颜色之一,供应商会向您显示。
昨天,我的一位GA研究人员教授提到了德国的一个真实故事(对不起,我没有其他参考,是的,如果有人要求,我可以找到答案)。这个人(我们称他为有色人种)曾经从门到门去帮助人们找到确切的颜色代码(以RGB表示)。与客户所想的壁橱)。这是他的做法:
那个有色人种经常带一个使用GA的软件程序。他曾经从4种不同的颜色开始-每种颜色都编码为一种编码的染色体(其解码后的值为RGB值)。消费者从4种颜色中选择1种(最接近他/她所想到的颜色)。然后,程序将分配最大值个体适应度,并使用mutation / crossover向下一代移植。重复上述步骤,直到消费者找到确切的颜色,然后再找到颜色专家告诉他RGB组合!
通过什么消费者心目中分配最大的健身效果颜色关闭,在颜色的家伙的节目越来越多的机会收敛到颜色,消费者心中都有完全相同。我发现它很有趣!
现在我有了-1,如果您打算增加-1,请。阐明这样做的原因!
几周前,我提出了一种使用遗传算法的SO解决方案,以解决图形布局问题。这是约束优化问题的一个示例。
同样在机器学习领域,我从头开始在c / c ++中实现了基于GA的分类规则框架。
我还曾在示例项目中使用GA来训练人工神经网络(ANN),而不是使用著名的反向传播算法。
另外,作为我的研究生研究的一部分,我使用遗传算法训练隐马尔可夫模型,作为基于EM的Baum-Welch算法的另一种方法(再次在c / c ++中)。
作为我的本科计算机科学学位的一部分,我们被分配了为Jikes研究虚拟机寻找最佳jvm标志的问题。这是使用Dicappo基准套件评估的,该套件将时间返回到控制台。我编写了一个分布式遗传算法,以切换这些标志以改善基准套件的运行时间,尽管要花几天时间来补偿影响结果的硬件抖动。唯一的问题是我没有正确了解编译器理论(这是分配的意图)。
我本可以用初始的默认标志为初始种群植入种子,但有趣的是该算法发现的配置与O3优化级别非常相似(但实际上在许多测试中速度更快)。
编辑:同样,我用Python编写了自己的遗传算法框架来进行分配,只是使用popen命令来运行各种基准测试,尽管如果这不是经过评估的分配,我会研究pyEvolve。
首先是乔纳森·科扎(Jonathan Koza)的“基因编程”(Genetic Programming)(在亚马逊上)撰写的)是一本有关遗传和进化算法/编程技术的书,其中有许多示例。我强烈建议您检查一下。
至于我自己使用的遗传算法,我使用了一种(自家种植的)遗传算法来发展用于对象收集/破坏场景的群体算法(实际目的可能是清除雷区)。这里是一个链接的文件。我做过的最有趣的部分是多阶段适应度函数,这是必需的,因为简单适应度函数无法为遗传算法提供足够的信息以充分区分人群。
我是一个研究使用进化计算(EC)自动修复现有程序中的错误的团队的成员。我们已经成功修复了现实软件项目中的许多实际错误(请参见该项目的主页)。
此EC修复技术有两个应用程序。
首先 (可通过项目页面获得代码和再现信息)发展了从现有C程序解析的抽象语法树,并使用我们自己的自定义EC引擎在Ocaml中实现。
第二个(代码和再现信息可通过项目页面获得),这是我对项目的个人贡献,它演化了x86汇编代码或Java字节代码,这些代码是用多种编程语言编写的程序编译而成的。该应用程序在Clojure中实现,并且还使用其自己的自定义构建的EC引擎。
进化计算的一个不错的方面是该技术的简单性使得可以编写自己的自定义实现而没有太多困难。有关基因编程的免费良好介绍文字,请参见基因编程现场指南。
我制作了一个名为“ GALAB”的完整GA框架,以解决许多问题:
我曾经使用GA来优化内存地址的哈希函数。地址的页面大小为4K或8K,因此它们在地址的位模式中显示出一定的可预测性(最低有效位全为零;中间位定期递增等)。原始哈希函数为“矮胖”-倾向于聚类命中在每个第三个哈希存储桶上。改进的算法具有近乎完美的分布。
我不知道家庭作业是否有价值...
在学习期间,我们推出了自己的程序来解决旅行推销员问题。
这个想法是要在几个标准上进行比较(难以映射问题,性能等),我们还使用了其他技术,例如模拟退火。
它工作得很好,但是花了我们一段时间来理解如何正确地进行“复制”阶段:将手头的问题建模为适合遗传编程的东西确实让我感到最难。
这是一门有趣的课程,因为我们还涉猎了神经网络等。
我想知道是否有人在“生产”代码中使用过这种编程。
作为论文的一部分,我为多目标优化算法mPOEMS(具有改进的改进步骤的多目标原型优化)编写了一个通用的Java框架,该框架是使用演化概念的GA。它是通用的,已将所有独立于问题的部分从独立于问题的部分中分离出来,并且接口被认为使用该框架而仅添加了独立于问题的部分。因此,想要使用该算法的人不必从零开始,这极大地简化了工作。
您可以在此处找到代码。
在科学工作中,您已经将使用该算法找到的解决方案与最新的算法SPEA-2和NSGA进行了比较,并且已证明该算法的性能可比甚至更好,具体取决于您使用的指标衡量性能,尤其是根据您要查找的优化问题。
你可以在这里找到它。
另外,作为我的论文和工作证明的一部分,我将此框架应用于了投资组合管理中的项目选择问题。它是关于选择为公司增加最大价值,支持公司最大战略或支持任何其他任意目标的项目。例如,从特定类别中选择一定数量的项目,或最大化项目协同作用,...
我的论文将这个框架应用于项目选择问题:http : //www.ub.tuwien.ac.at/dipl/2008/AC05038968.pdf
之后,我在《财富》 500强公司之一的投资组合管理部门工作,在那里他们使用了商业软件,该软件还将GA应用于项目选择问题/投资组合优化。
更多资源:
框架的文档:http : //thomaskremmel.com/mpoems/mpoems_in_java_documentation.pdf
mPOEMS演示文稿:http ://portal.acm.org/citation.cfm?id=1792634.1792653
实际上,只要有一点热情,每个人都可以轻松地将通用框架的代码用于任意多目标优化问题。
在学校的一个研讨会中,我们开发了一种基于音乐模式生成音乐的应用程序。该程序是用Java构建的,输出是带有歌曲的midi文件。我们使用GA的独特方式来生成音乐。我认为该程序对探索新构图可能很有用。
我开发了一个基于多线程摆动的机器人导航模拟,该导航通过一组随机分布的食物来源和矿山的网格地形进行,并开发了一种基于遗传算法的策略,旨在探索机器人行为的优化和适合机器人染色体的适体基因的生存。使用每个迭代周期的图表和映射完成此操作。
从那以后,我开发了更多的游戏行为。我最近为自己建立的一个示例应用程序是一种遗传算法,用于解决英国的寻路中的旅行商问题,该算法考虑了起点和目标状态以及一个/多个连接点,延误,取消,建筑工程,高峰时间,公开罢工,要考虑最快和最便宜的路线。然后为在特定日期采取的路线提供平衡的建议。
通常,我的策略是使用基于POJO的基因表示,然后将特定的接口实现应用于选择,突变,交叉策略和标准点。然后,根据我需要作为启发式度量应用的策略和标准,我的适应度函数基本上变得非常复杂。
我还研究了使用系统的变异周期将遗传算法应用于代码内的自动化测试,其中算法理解逻辑并尝试确定错误报告以及代码修复建议。基本上,这是一种优化我的代码并提供改进建议的方法,以及一种自动发现新程序代码的方法。除其他应用程序外,我还尝试将遗传算法应用于音乐制作。
通常,我发现像大多数元启发式/全局优化策略一样的演化策略,起初学习起来很慢,但是随着解决方案越来越接近目标状态并且您的适应度函数和启发式方法能够很好地协调一致时,它们就会开始发展您的搜索空间内的融合。
不久前,但我推出了一种遗传算法以发展有效的图像处理内核,以从哈勃太空望远镜(HST)图像中删除宇宙射线的痕迹。标准方法是使用哈勃望远镜进行多次曝光,并仅保留所有图像中相同的东西。由于HST时间非常宝贵,我是一个天文爱好者,并且最近参加了进化计算大会,因此我考虑使用GA来清理单次曝光。
这些个体采用树木的形式,以3x3像素区域作为输入,进行了一些计算,并做出了有关是否以及如何修改中心像素的决定。通过将输出结果与以传统方式清理的图像(即堆叠曝光)进行比较来判断适应性。
它实际上是可行的,但还不足以保证超越原始方法。如果我的论文不受时间限制,那么我可能已经扩展了该算法可用的遗传部分bin。我很确定我可以对其进行重大改进。
使用的库:如果我没记错的话,可以使用IRAF和cfitsio进行天文图像数据处理和I / O。
我年轻时曾尝试过GA。我用Python编写了一个模拟器,其工作方式如下。
这些基因编码了神经网络的权重。
神经网络的输入是检测触摸的“天线”。较高的值表示非常接近,0表示不接触。
输出到两个“轮子”。如果两个轮子都向前,那家伙就向前。如果方向相反,那家伙就转过身来。输出的强度决定了车轮转动的速度。
产生了一个简单的迷宫。这真的很简单-甚至很愚蠢。屏幕的底部是起点,顶部是目标,中间有四堵墙。每堵墙都有一个随机取出的空间,因此总会有一条小路。
我从一开始就开始随机人(我认为他们是错误)。只要一个人达到目标或达到时间限制,就可以计算出适合度。它与当时到目标的距离成反比。
然后,我将它们配对并“繁殖”来创建下一代。被选择繁殖的概率与其适应性成正比。有时,这意味着如果一个人具有很高的相对适应性,就会反复繁殖自己。
我以为他们会表现出“抱抱左墙”的行为,但是他们似乎总是遵循一些不太理想的做法。在每个实验中,虫子都收敛为螺旋状。他们会向外盘旋,直到碰到右边的墙。他们会遵循,然后到达差距时,它们会螺旋下降(远离差距)并四处走动。他们将向左转270度,然后通常进入间隙。这将使他们穿过大多数障碍,并经常达到目标。
我添加的一个功能是将颜色载体放入基因中,以追踪个体之间的相关性。几代之后,它们都将是相同的颜色,这告诉我应该有一个更好的育种策略。
我试图让他们制定更好的策略。我使神经网络复杂化-增加了内存和所有内容。它没有帮助。我总是看到相同的策略。
我尝试了各种事情,例如拥有单独的基因库,这些基因库只能在100代后才能重组。但是没有什么可以推动他们采取更好的策略。也许那是不可能的。
另一个有趣的事情是绘制一段时间内的适应度。有确定的模式,例如最大适应度在上升之前就下降了。我从未见过关于这种可能性的进化书。