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

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

问题:

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

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


当前回答

2004年1月,飞利浦新显示技术公司(Philips New Display Technologies)联系了我,他们正在为有史以来第一款商业电子墨水——索尼Librie——制造电子产品。索尼Librie只在日本上市,比亚马逊Kindle和其他电子墨水在美国和欧洲上市早了好几年。

飞利浦的工程师遇到了一个大问题。在产品上市的几个月前,他们在换页面时仍然会出现重影。问题是产生静电场的200个驱动器。每个驱动器都有一个特定的电压,必须设置在0到1000mv之间。但如果你改变其中一个,就会改变一切。

因此,单独优化每个驱动器的电压是不可能的。可能的值组合的数量以数十亿计,一个特殊的相机大约需要1分钟来评估一个组合。工程师们尝试了许多标准的优化技术,但都没有达到预期的效果。

首席工程师联系了我,因为我之前已经向开源社区发布了一个遗传编程库。他问全科医生/全科医生是否会帮忙,以及我是否能参与其中。我这样做了,在大约一个月的时间里,我们一起工作,我在合成数据上编写和调整GA库,他则将其集成到他们的系统中。然后,有一个周末,他们让它和真人一起直播。

接下来的周一,我收到了他和他们的硬件设计师发来的溢美之词,说没人会相信GA发现的惊人结果。就是这样。同年晚些时候,该产品上市了。

我没有为此得到一分钱,但我有“吹嘘”的权利。他们从一开始就说他们已经超出预算了,所以我在开始工作之前就知道是什么交易。这对于气体的应用是一个很好的例子。:)

其他回答

我做了一些生活在这个小世界里的小动物。他们有一个神经网络大脑,从世界上接收一些输入,输出是其他行动的运动矢量。他们的大脑就是基因。

该项目从随机的动物群体开始,它们的大脑是随机的。输入和输出神经元是静止的,但中间的神经元不是。

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

最终,这些生物进化到可以在世界各地移动,寻找食物和躲避危险。

于是我决定做一个小实验。我给这个生物的大脑一个输出神经元叫做“嘴”,一个输入神经元叫做“耳朵”。重新开始,惊讶地发现它们进化到最大化空间,每个生物都呆在各自的部分(食物是随机放置的)。他们学会了相互合作,不妨碍彼此。凡事总有例外。

然后我尝试了一些有趣的事情。死去的生物将成为食物。猜猜发生了什么事!进化出了两种生物,一种是成群攻击,另一种是高度回避。

那么这里的教训是什么呢?沟通意味着合作。一旦你引入了一个元素,即伤害他人意味着你获得了一些东西,那么合作就会被破坏。

我想知道这对自由市场和资本主义体系有何影响。我的意思是,如果企业可以伤害他们的竞争并侥幸逃脱,那么很明显,他们会尽其所能来伤害竞争。

编辑:

我用c++写的,没有使用框架。我自己写了神经网络和GA代码。埃里克,谢谢你这么说。人们通常不相信GA的力量(尽管其局限性很明显),直到他们玩过它。GA很简单,但不过分简单化。

对于怀疑者来说,神经网络已经被证明能够模拟任何功能,只要它们有不止一层。遗传算法是一种非常简单的方法,可以在解空间中找到局部和全局最小值。将遗传算法与神经网络结合起来,你就有了一个很好的方法来寻找函数,为一般问题找到近似解。因为我们使用的是神经网络,所以我们是针对某些输入优化函数,而不是像其他人使用遗传算法那样对某个函数的某些输入进行优化

下面是生存示例的演示代码:http://www.mempko.com/darcs/neural/demos/eaters/ 建立产品说明:

安装darcs, libboost, liballegro, gcc, cmake, make Darcs克隆——懒惰http://www.mempko.com/darcs/neural/ cd神经 cmake。 使 cd演示/吃 吃。/

在大学期间,我们使用NERO(神经网络和遗传算法的结合)来教游戏中的机器人做出智能决策。非常酷。

As part of my thesis I wrote a generic java framework for the multi-objective optimisation algorithm mPOEMS (Multiobjective prototype optimization with evolved improvement steps), which is a GA using evolutionary concepts. It is generic in a way that all problem-independent parts have been separated from the problem-dependent parts, and an interface is povided to use the framework with only adding the problem-dependent parts. Thus one who wants to use the algorithm does not have to begin from zero, and it facilitates work a lot.

你可以在这里找到代码。

你可以用这个算法找到的解决方案已经在科学工作中与最先进的算法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

实际上,只要有一点热情,每个人都可以很容易地将通用框架的代码适应任意的多目标优化问题。

在我的婚宴上,我使用GA来优化座位分配。80位客人超过10张桌子。评估功能是基于让人们和他们的约会对象在一起,把有共同点的人放在一起,把观点完全相反的人放在不同的桌子上。

我运行了几次。每次我都有九张好桌子,还有一张都是怪球。最后,我妻子安排了座位。

我的旅行推销员优化器使用了一种新的染色体到行程的映射,这使得繁殖和变异染色体变得很简单,没有产生无效行程的风险。

更新:因为一些人问了…

以任意但一致的顺序(如按字母顺序排列)的客人(或城市)数组开始。称之为参考溶液。把客人的座位号看作是他/她的座位号。

我们没有尝试直接在染色体中编码这种顺序,而是编码将参考溶液转化为新溶液的指令。具体来说,我们将染色体视为数组中要交换的索引列表。为了解码染色体,我们从参考溶液开始,并应用由染色体指示的所有交换。交换数组中的两个条目总是会得到一个有效的解决方案:每个来宾(或城市)仍然只出现一次。

因此,染色体可以随机生成,突变,并与其他染色体交叉,总是会产生有效的解决方案。

In 2007-9 I developed some software for reading datamatrix patterns. Often these patterns were difficult to read, being indented into scratched surfaces with all kinds of reflectance properties, fuzzy chemically etched markings and so on. I used a GA to fine tune various parameters of the vision algorithms to give the best results on a database of 300 images having known properties. Parameters were things like downsampling resolution, RANSAC parameters, amount of erosion and dilation, low pass filtering radius, and a few others. Running the optimisation over several days this produced results which were about 20% better than naive values on a test set of images unseen during the optimisation phase.

这个系统完全是从零开始编写的,我没有使用任何其他库。我并不反对使用这些东西,只要它们能提供可靠的结果,但是您必须注意许可兼容性和代码可移植性问题。