遗传算法(GA)和遗传规划(GP)是一个有趣的研究领域。
我想知道你使用GA/GP解决的具体问题,以及如果你没有自己的库/框架,你使用了什么库/框架。
问题:
你用GA/GP解决过什么问题? 你使用了哪些库/框架?
我在寻找第一手的经验,所以请不要回答,除非你有。
遗传算法(GA)和遗传规划(GP)是一个有趣的研究领域。
我想知道你使用GA/GP解决的具体问题,以及如果你没有自己的库/框架,你使用了什么库/框架。
问题:
你用GA/GP解决过什么问题? 你使用了哪些库/框架?
我在寻找第一手的经验,所以请不要回答,除非你有。
我不知道家庭作业算不算…
在我学习期间,我们推出了自己的程序来解决旅行推销员问题。
我们的想法是对几个标准进行比较(映射问题的难度,性能等),我们还使用了其他技术,如模拟退火。
它运行得很好,但我们花了一段时间来理解如何正确地进行“复制”阶段:将手头的问题建模成适合遗传编程的东西,这对我来说是最难的部分……
这是一门有趣的课程,因为我们也涉猎了神经网络之类的知识。
我想知道是否有人在“生产”代码中使用这种编程。
没有家庭作业。
1995年,我作为专业程序员的第一份工作是为标准普尔500指数期货编写一个基于遗传算法的自动交易系统。该应用程序是用Visual Basic 3 [!我不知道我当时是怎么做的,因为VB3甚至没有课程。
The application started with a population of randomly-generated fixed-length strings (the "gene" part), each of which corresponded to a specific shape in the minute-by-minute price data of the S&P500 futures, as well as a specific order (buy or sell) and stop-loss and stop-profit amounts. Each string (or "gene") had its profit performance evaluated by a run through 3 years of historical data; whenever the specified "shape" matched the historical data, I assumed the corresponding buy or sell order and evaluated the trade's result. I added the caveat that each gene started with a fixed amount of money and could thus potentially go broke and be removed from the gene pool entirely.
在对种群的每一次评估之后,幸存者被随机杂交(通过混合来自两个亲本的片段),一个基因被选择为亲本的可能性与它产生的利润成正比。我还添加了点突变的可能性,让事情变得有趣一点。经过几百代这样的基因,我最终得到了一个基因群,它可以把5000美元变成平均约10000美元,而且没有死亡/破碎的可能性(当然是在历史数据上)。
Unfortunately, I never got the chance to use this system live, since my boss lost close to $100,000 in less than 3 months trading the traditional way, and he lost his willingness to continue with the project. In retrospect, I think the system would have made huge profits - not because I was necessarily doing anything right, but because the population of genes that I produced happened to be biased towards buy orders (as opposed to sell orders) by about a 5:1 ratio. And as we know with our 20/20 hindsight, the market went up a bit after 1995.
除了一些常见的问题,如《旅行推销员》和Roger Alsing的《蒙娜丽莎》程序的变体,我还编写了一个进化数独求解器(这需要我自己更多的原创想法,而不仅仅是重新实现别人的想法)。解决数独游戏有更可靠的算法,但进化方法效果相当好。
在过去的几天里,在Reddit上看到这篇文章后,我一直在玩一个进化程序来寻找扑克的“冷牌”。目前还不太令人满意,但我想我可以改进。
我有自己的进化算法框架。
当你打算粉刷你的房子时,通常很难得到一个确切的颜色组合。通常,你脑海中有一些颜色,但它不是其中一种颜色,供应商向你展示。
昨天,我的GA研究员教授提到了一个发生在德国的真实故事(对不起,我没有更多的参考资料,是的,如果有人要求我可以找到它)。这个家伙(让我们称他为配色员)曾经挨家挨户地帮助人们找到确切的颜色代码(RGB),这将是客户心目中的衣柜。下面是他的做法:
The color guy used to carry with him a software program which used GA. He used to start with 4 different colors- each coded as a coded Chromosome (whose decoded value would be a RGB value). The consumer picks 1 of the 4 colors (Which is the closest to which he/she has in mind). The program would then assign the maximum fitness to that individual and move onto the next generation using mutation/crossover. The above steps would be repeated till the consumer had found the exact color and then color guy used to tell him the RGB combination!
通过将最大适应度分配给接近消费者想法的颜色,配色员的程序增加了收敛到消费者想法的颜色的机会。我发现它很有趣!
现在我已经得到了一个-1,如果你计划更多的-1,请说明这样做的原因!
首先,Jonathan Koza的《遗传编程》(在亚马逊上)几乎是一本关于遗传和进化算法/编程技术的书,有很多例子。我强烈建议你去看看。
As for my own use of a genetic algorithm, I used a (home grown) genetic algorithm to evolve a swarm algorithm for an object collection/destruction scenario (practical purpose could have been clearing a minefield). Here is a link to the paper. The most interesting part of what I did was the multi-staged fitness function, which was a necessity since the simple fitness functions did not provide enough information for the genetic algorithm to sufficiently differentiate between members of the population.
我做了一些生活在这个小世界里的小动物。他们有一个神经网络大脑,从世界上接收一些输入,输出是其他行动的运动矢量。他们的大脑就是基因。
该项目从随机的动物群体开始,它们的大脑是随机的。输入和输出神经元是静止的,但中间的神经元不是。
环境中有食物和危险。食物可以增加能量,当你有足够的能量时,你就可以交配了。危险会降低能量,如果能量为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演示/吃 吃。/
在工作中,我遇到了这样一个问题:给定M个任务和N个dsp,如何将任务分配给dsp是最好的?“最佳”定义为“最大负载DSP的负载最小化”。有不同类型的任务,不同的任务类型有不同的性能分支,这取决于它们被分配到哪里,所以我将一组工作到dsp的分配编码为“DNA字符串”,然后使用遗传算法来“培育”我所能“培育”的最佳分配字符串。
它运行得相当好(比我之前的方法好得多,之前的方法是评估每个可能的组合……对于非平凡问题的大小,它将需要数年才能完成!),唯一的问题是无法判断是否已经达到了最优解。你只能决定当前的“最大努力”是否足够好,或者让它运行更长时间,看看它是否可以做得更好。
我曾经尝试制作一个围棋电脑播放器,完全基于基因编程。每个程序都将被视为一系列动作的评估函数。即使是在一个相当小的3x4板上,制作的程序也不是很好。
我使用Perl,并自己编写了所有代码。我今天会做不同的事情。
在读完《盲人钟表匠》之后,我对道金斯所说的帕斯卡程序产生了兴趣,他开发了一个可以随着时间进化的生物模型。我对使用Swarm编写自己的程序很感兴趣。我没有画出他画的那些奇特的生物图形,但我的“染色体”控制着影响生物体生存能力的特征。他们生活在一个简单的世界里,可以与彼此和环境决一死战。
生物的生存或死亡部分取决于偶然性,但也取决于它们如何有效地适应当地环境,如何有效地消耗营养物质以及如何成功地繁殖。这很有趣,但也向我妻子证明了我是一个极客。
几周前,我提出了一个关于SO的解决方案,使用遗传算法来解决图布局的问题。这是一个约束优化问题的例子。
同样在机器学习领域,我用c/c++从头开始实现了一个基于ga的分类规则框架。 我还在一个示例项目中使用了GA来训练人工神经网络(ANN),而不是使用著名的反向传播算法。
此外,作为我研究生研究的一部分,我已经使用GA来训练隐马尔可夫模型,作为基于em的Baum-Welch算法的额外方法(还是在c/c++中)。
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 300x300 and search would've taken too long.
足球引爆。我建立了一个GA系统来预测每周澳式足球比赛的结果。
A few years ago I got bored of the standard work football pool, everybody was just going online and taking the picks from some pundit in the press. So, I figured it couldn't be too hard to beat a bunch of broadcast journalism majors, right? My first thought was to take the results from Massey Ratings and then reveal at the end of the season my strategy after winning fame and glory. However, for reasons I've never discovered Massey does not track AFL. The cynic in me believes it is because the outcome of each AFL game has basically become random chance, but my complaints of recent rule changes belong in a different forum.
该系统基本上考虑了进攻强度、防守强度、主场优势、每周的改进(或缺乏)以及这些方面的变化速度。这为每支球队在整个赛季中建立了一组多项式方程。可以计算给定日期的每场比赛的获胜者和分数。我们的目标是找到最接近过去所有游戏结果的系数集,并使用该集合来预测接下来几周的游戏。
在实践中,该系统将找到能够准确预测过去90%以上游戏结果的解决方案。然后,它会成功地为即将到来的一周(即不在训练集中的那一周)挑选大约60-80%的比赛。
结果是:略高于中游水平。没有巨额奖金也没有能打败维加斯的系统。不过很有趣。
我从零开始构建一切,没有使用任何框架。
我和一个同事正在研究一种解决方案,使用我们公司要求的各种标准将货物装载到卡车上。我一直在研究遗传算法的解决方案,而他正在使用具有激进修剪的分支和绑定。我们仍在实施这个解决方案的过程中,但到目前为止,我们已经取得了良好的结果。
我使用遗传算法(以及一些相关技术)来确定风险管理系统的最佳设置,该系统试图阻止淘金者使用偷来的信用卡来购买mmo游戏。该系统将接收数千笔具有“已知”值的交易(欺诈与否),并找出最佳设置组合,以正确识别欺诈交易,而不会产生太多误报。
We had data on several dozen (boolean) characteristics of a transaction, each of which was given a value and totalled up. If the total was higher than a threshold, the transaction was fraud. The GA would create a large number of random sets of values, evaluate them against a corpus of known data, select the ones that scored the best (on both fraud detection and limiting the number of false positives), then cross breed the best few from each generation to produce a new generation of candidates. After a certain number of generations the best scoring set of values was deemed the winner.
创建用于测试的已知数据语料库是该系统的阿喀琉斯之踵。如果你等待退款,你在试图回应欺诈者时就会落后几个月,所以有人必须手动审查大量交易,以建立数据库,而不必等待太长时间。
这最终确定了绝大多数的欺诈行为,但在最容易欺诈的项目上,这一比例无法低于1%(考虑到90%的交易可能是欺诈,这已经相当不错了)。
我用perl完成了所有这些。在一个相当旧的linux机器上运行一次软件需要1-2个小时(20分钟通过WAN链路加载数据,其余时间用于处理)。任何给定代的大小都受到可用RAM的限制。我会一遍又一遍地运行它,稍微改变参数,寻找一个特别好的结果集。
总而言之,它避免了手动调整数十个欺诈指标的相对值所带来的一些失误,并且始终能够提出比我手动创建的更好的解决方案。AFAIK,它仍然在使用(大约3年后我写了它)。
As part of my undergraduate CompSci degree, we were assigned the problem of finding optimal jvm flags for the Jikes research virtual machine. This was evaluated using the Dicappo benchmark suite which returns a time to the console. I wrote a distributed gentic alogirthm that switched these flags to improve the runtime of the benchmark suite, although it took days to run to compensate for hardware jitter affecting the results. The only problem was I didn't properly learn about the compiler theory (which was the intent of the assignment).
我本可以用现有的默认标志来播种初始种群,但有趣的是,算法发现了一个与O3优化级别非常相似的配置(但实际上在许多测试中更快)。
编辑:我还用Python写了我自己的遗传算法框架,只是使用popen命令来运行各种基准测试,尽管如果不是评估作业,我会看看pyEvolve。
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.
在我的婚宴上,我使用GA来优化座位分配。80位客人超过10张桌子。评估功能是基于让人们和他们的约会对象在一起,把有共同点的人放在一起,把观点完全相反的人放在不同的桌子上。
我运行了几次。每次我都有九张好桌子,还有一张都是怪球。最后,我妻子安排了座位。
我的旅行推销员优化器使用了一种新的染色体到行程的映射,这使得繁殖和变异染色体变得很简单,没有产生无效行程的风险。
更新:因为一些人问了…
以任意但一致的顺序(如按字母顺序排列)的客人(或城市)数组开始。称之为参考溶液。把客人的座位号看作是他/她的座位号。
我们没有尝试直接在染色体中编码这种顺序,而是编码将参考溶液转化为新溶液的指令。具体来说,我们将染色体视为数组中要交换的索引列表。为了解码染色体,我们从参考溶液开始,并应用由染色体指示的所有交换。交换数组中的两个条目总是会得到一个有效的解决方案:每个来宾(或城市)仍然只出现一次。
因此,染色体可以随机生成,突变,并与其他染色体交叉,总是会产生有效的解决方案。
在学校的一次研讨会上,我们开发了一个基于音乐模式生成音乐的应用程序。该程序是在Java中构建的,输出是一个midi文件与歌曲。我们使用不同的GA方法来生成音乐。我认为这个程序可以用来探索新的组合。
我做了一个完整的GA框架,命名为“GALAB”,解决了很多问题:
定位GSM ANTs (BTS)以减少重叠和空白位置。 资源约束项目调度。 进化图景的创造。(Evopic) 旅行推销员问题。 n -皇后和n -颜色问题。 骑士之旅和背包问题。 魔方和数独谜题。 字符串压缩,基于超字符串问题。 二维包装问题。 微型人工生命APP。 鲁比克难题。
我为我的公司在1992年为货运业开发的3D激光表面轮廓系统开发了一个家庭酿造GA。 该系统依赖于三维三角测量,并使用了定制的激光线扫描仪,512x512相机(具有定制的捕获hw)。相机和激光之间的距离永远不会是精确的,相机的焦点也不会在你期望的256,256的位置找到!
尝试使用标准几何和模拟退火式方程求解来计算校准参数是一场噩梦。
遗传算法在一个晚上就完成了,我创建了一个校准立方体来测试它。我知道立方体的精度很高,因此我的想法是,我的遗传算法可以为每个扫描单元进化一组自定义三角测量参数,以克服生产变化。
这招很管用。退一步说,我简直目瞪口呆!在大约10代的时间里,我的“虚拟”立方体(由原始扫描生成并根据校准参数重新创建)实际上看起来像一个立方体!经过大约50代之后,我得到了我需要的校准。
这是一段时间以前的事了,但我滚动了一个GA来进化实际上是图像处理内核的东西,以从哈勃太空望远镜(HST)图像中去除宇宙射线痕迹。标准的方法是用哈勃望远镜进行多次曝光,只保留所有图像中相同的东西。由于HST时间是如此宝贵,我是一个天文学爱好者,最近参加了进化计算大会,我考虑使用GA来清理单次曝光。
这些个体以树的形式存在,以3x3像素的区域作为输入,执行一些计算,并决定是否以及如何修改中心像素。通过将输出图像与用传统方法(即叠加曝光)清理的图像进行比较来判断适合度。
这实际上是可行的,但还不足以让我们放弃原来的方法。如果我的论文没有时间限制,我可能已经扩展了算法可用的遗传部分。我很确定我可以大大提高它。
使用的库:如果我没记错的话,用于天文图像数据处理和I/O的IRAF和cfitsio。
进化计算研究生班: 开发了TopCoder马拉松比赛49:megpartty的解决方案。我的小组正在测试不同的域表示法,以及不同的表示法如何影响ga找到正确答案的能力。我们为这个问题编写了自己的代码。
Neuroevolution and Generative and Developmental Systems, Graduate Class: Developed an Othello game board evaluator that was used in the min-max tree of a computer player. The player was set to evaluate one-deep into the game, and trained to play against a greedy computer player that considered corners of vital importance. The training player saw either 3 or 4 deep (I'll need to look at my config files to answer, and they're on a different computer). The goal of the experiment was to compare Novelty Search to traditional, fitness-based search in the Game Board Evaluation domain. Results were relatively inconclusive, unfortunately. While both the novelty search and fitness-based search methods came to a solution (showing that Novelty Search can be used in the Othello domain), it was possible to have a solution to this domain with no hidden nodes. Apparently I didn't create a sufficiently competent trainer if a linear solution was available (and it was possible to have a solution right out of the gates). I believe my implementation of Fitness-based search produced solutions more quickly than my implementation of Novelty search, this time. (this isn't always the case). Either way, I used ANJI, "Another NEAT Java Implementation" for the neural network code, with various modifications. The Othello game I wrote myself.
我年轻时就尝试过GA。我用Python写了一个模拟器,工作原理如下。
这些基因编码了神经网络的权重。
神经网络的输入是检测触摸的“天线”。较高的数值表示非常接近,0表示不接触。
输出是两个“轮子”。如果两个轮子都向前,这个人也向前。如果轮子方向相反,他就会转向。输出的强度决定了车轮转动的速度。
生成了一个简单的迷宫。这真的很简单,甚至很愚蠢。屏幕下方是起点,上方是球门,中间有四面墙。每面墙都有一个随机的空间,所以总是有一条路。
一开始我只是随机挑选一些人(我认为他们是bug)。只要有一个人达到了目标,或者达到了时间限制,就会计算适合度。它与当时到目标的距离成反比。
然后我把它们配对,“培育”它们来创造下一代。被选择繁殖的概率与它的适应性成正比。有时,这意味着如果一个人具有非常高的相对适应性,就会与自己反复繁殖。
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.
我添加的一个功能是在基因中放入一个颜色矢量来跟踪个体之间的相关性。几代之后,它们的颜色都是一样的,这说明我应该有更好的繁殖策略。
我试着让他们制定更好的策略。我把神经网络复杂化了——增加了记忆和其他东西。这没有用。我总是看到同样的策略。
我尝试了各种方法,比如建立单独的基因库,在100代之后才重新组合。但没有什么能促使他们采取更好的策略。也许这是不可能的。
另一个有趣的事情是绘制适应度随时间变化的图表。有明确的模式,比如最大适合度在上升之前会下降。我从未见过一本进化论的书谈到这种可能性。
我曾经使用一个GA来优化内存地址的哈希函数。这些地址的页面大小为4K或8K,因此它们在地址的位模式中显示出一定的可预测性(最低有效位全为0;最初的哈希函数是“粗笨的”——它倾向于每第三个哈希桶聚集一次命中。改进后的算法具有近乎完美的分布。
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.
这个系统完全是从零开始编写的,我没有使用任何其他库。我并不反对使用这些东西,只要它们能提供可靠的结果,但是您必须注意许可兼容性和代码可移植性问题。
2004年1月,飞利浦新显示技术公司(Philips New Display Technologies)联系了我,他们正在为有史以来第一款商业电子墨水——索尼Librie——制造电子产品。索尼Librie只在日本上市,比亚马逊Kindle和其他电子墨水在美国和欧洲上市早了好几年。
飞利浦的工程师遇到了一个大问题。在产品上市的几个月前,他们在换页面时仍然会出现重影。问题是产生静电场的200个驱动器。每个驱动器都有一个特定的电压,必须设置在0到1000mv之间。但如果你改变其中一个,就会改变一切。
因此,单独优化每个驱动器的电压是不可能的。可能的值组合的数量以数十亿计,一个特殊的相机大约需要1分钟来评估一个组合。工程师们尝试了许多标准的优化技术,但都没有达到预期的效果。
首席工程师联系了我,因为我之前已经向开源社区发布了一个遗传编程库。他问全科医生/全科医生是否会帮忙,以及我是否能参与其中。我这样做了,在大约一个月的时间里,我们一起工作,我在合成数据上编写和调整GA库,他则将其集成到他们的系统中。然后,有一个周末,他们让它和真人一起直播。
接下来的周一,我收到了他和他们的硬件设计师发来的溢美之词,说没人会相信GA发现的惊人结果。就是这样。同年晚些时候,该产品上市了。
我没有为此得到一分钱,但我有“吹嘘”的权利。他们从一开始就说他们已经超出预算了,所以我在开始工作之前就知道是什么交易。这对于气体的应用是一个很好的例子。:)
Several years ago I used ga's to optimize asr (automatic speech recognition) grammars for better recognition rates. I started with fairly simple lists of choices (where the ga was testing combinations of possible terms for each slot) and worked my way up to more open and complex grammars. Fitness was determined by measuring separation between terms/sequences under a kind of phonetic distance function. I also experimented with making weakly equivalent variations on a grammar to find one that compiled to a more compact representation (in the end I went with a direct algorithm, and it drastically increased the size of the "language" that we could use in applications).
最近,我将它们用作默认假设,以此来测试由各种算法生成的解决方案的质量。这主要涉及分类和不同类型的拟合问题(即创建一个“规则”,解释审查员对数据集所做的一组选择)。
我是一个研究使用进化计算(EC)来自动修复现有程序中的错误的团队的成员。我们已经在现实世界的软件项目中成功地修复了一些真实的错误(参见本项目的主页)。
这种EC修复技术有两种应用。
The first (code and reproduction information available through the project page) evolves the abstract syntax trees parsed from existing C programs and is implemented in Ocaml using our own custom EC engine. The second (code and reproduction information available through the project page), my personal contribution to the project, evolves the x86 assembly or Java byte code compiled from programs written in a number of programming languages. This application is implemented in Clojure and also uses its own custom built EC engine.
进化计算的一个优点是技术的简单性,使得编写自己的自定义实现不太困难。有关遗传规划的一个很好的免费的介绍性文本,请参阅遗传规划的现场指南。
我构建了一个简单的GA,用于在音乐播放时从频谱中提取有用的模式。输出用于驱动winamp插件中的图形效果。
输入:一些FFT帧(想象一个二维浮点数组) 输出:单个浮点值(输入的加权和),阈值为0.0或1.0 基因:输入权重 适应度函数:占空比、脉宽、BPM在合理范围内的组合。
我将一些ga调整到频谱的不同部分以及不同的BPM限制,所以它们不会趋向于收敛到相同的模式。来自每个种群的前4个的输出被发送到渲染引擎。
一个有趣的副作用是,整个人群的平均健康状况是音乐变化的一个很好的指标,尽管通常需要4-5秒才能发现。
我几周前做了这个有趣的小玩意。它生成有趣的互联网图像使用GA。有点傻,但很好笑。
http://www.twitterandom.info/GAFunny/
对此有一些见解。它是一些mysql表。一个用于图像列表及其评分(即适合度),另一个用于子图像及其在页面上的位置。
子图像可以有几个细节,但不是全部实现:+大小,倾斜,旋转,+位置,+image_url。
当人们投票决定这张照片有多有趣时,它或多或少会流传到下一代。如果它存活下来,它会产生5-10个带有轻微突变的后代。目前还没有交叉。
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
实际上,只要有一点热情,每个人都可以很容易地将通用框架的代码适应任意的多目标优化问题。
在我的本科论文中,我使用遗传编程来开发用于空中搜索和救援的合作搜索策略。我使用一个名为NetLogo(基于StarLogo)的开源代理建模平台作为世界模型。NetLogo是用java写的,因此提供了java api -所以GP框架需要基于java -我使用的一个叫做JGAP,还有另一个开源GP框架在java中,我知道叫做ECJ。
模拟运行起来非常慢(我认为这是由于NetLogo模型),所以我的功能/终端集非常有限,限制了搜索空间。尽管如此,我还是想出了一些很好的解决办法。如果你有这种冲动,你可以在我的论文http://www.cse.unsw.edu.au/~ekjo014/z3157867_Thesis.pdf的第三章读到
我开发了一个基于多线程摆动的模拟机器人导航通过一组随机网格地形的食物源和矿山,并开发了一个基于遗传算法的策略,探索机器人行为的优化和机器人染色体的适者生存基因。这是使用每个迭代周期的图表和映射来完成的。
从那以后,我发展了更多的游戏行为。我最近为自己构建的一个示例应用程序是一个遗传算法,用于解决在英国寻找路线时的旅行销售人员问题,考虑到起始和目标状态,以及一个/多个连接点,延误,取消,建筑工程,高峰时间,公共罢工,考虑最快和最便宜的路线。然后为某一天的路线提供一个平衡的建议。
一般来说,我的策略是使用基于POJO的基因表示,然后为选择、突变、交叉策略和标准点应用特定的接口实现。我的适应度函数就会变得非常复杂,这是基于我需要作为启发式测量应用的策略和标准。
我还研究了将遗传算法应用于代码中的自动化测试,使用系统突变周期,其中算法理解逻辑,并尝试确定带有代码修复建议的错误报告。基本上,这是一种优化我的代码并提供改进建议的方法,以及一种自动发现新编程代码的方法。我还尝试将遗传算法应用于音乐制作和其他应用。
一般来说,我发现进化策略就像大多数元启发式/全局优化策略一样,一开始学习很慢,但随着解决方案越来越接近目标状态,只要你的适应度函数和启发式很好地对齐,在你的搜索空间内产生收敛,它们就会开始学习。