Tag: 遗传算法

Scala遗传算法(GA)库中的模拟二进制交叉(SBX)交叉算子

我在一个很小的研究团队工作,用Scala创建/改编遗传算法库,用于使用Scientific Worklow System进行分布式计算,在我们的例子中,我们使用开源OpenMole软件( http://www.openmole.org/ )。 最近,我尝试理解并重新实现在JMetal Metaheuristics库( http://jmetal.sourceforge.net/ )中编写的SBX交叉运算符,以使其在我们的Scala库中的function版本中进行调整。 我写了一些代码,但是我需要我们的建议或者你对在Java库中定义的SBX的validation,因为源代码( svn中的src )看起来不像这里写的原始等式: http : //citeseerx.ist。 psu.edu/viewdoc/download?doi=10.1.1.33.7291&rep=rep1&type=pdf ,第30页,附件A 第一个问题,我不了解JMetal的java版本,为什么他们使用两个不同的beta值? beta1在方程中使用min [(y1-yL),…]和的第一个arg 使用min […,(yu – y2)]的第二个arg的beta2 ) Beta 1和2用于计算alpha值和2(所以这里和jmetal我们还有两个alpha不同的值alpha1和2)… 同样的问题/问题,我们在jmetal两个计算betaq (java代码)或Deb方程,结果: 第二个问题,符号的含义是什么 用于(2)和(3)程序中的SBX伪算法,与简单β的区别? 特别是当我们想要计算交叉父母的孩子/后代时,就像这里: 编辑 更正no-op if / else块 jmetal中的代码作者给了我Nsga-II算法原始源代码的链接,他解释我Deb的SBX描述与他的实现不同:/ http://www.iitk.ac.in/kangal/codes.shtml 我不明白jmetal和原始源代码中的描述和实现之间的区别,你有解释吗? 正确if / else返回map 开始翻译成scala class SBXBoundedCrossover[G <: GAGenome, F Double = _.nextDouble) extends CrossOver [G, […]

如何“交叉”两个字符串(1234&abcd – > 12cd&ab34)

我正在开发一种Java中的遗传算法,就像所有这些算法一样,它需要两条父染色体的交叉。 这些染色体可以很长,从30到500不等(但无论它们长度如何,它们都将具有相同的大小,因此如果长度为80,则GA运行中的全部将为80)。 我想以不同的方式发展,但他们在我看来都非常低效,所以我想我可能会要求新的,不同的观点和建议。 例如,我认为的方法之一是将字符串转换为字符数组并从交叉轨迹的起点到终点迭代(即从s1 & s2[25]到s1 & s2[40] )复制将这些点之间的每个数组字符转换为时间数组,然后再次迭代并使用“伙伴”的时间数组中的字符交换它们。 但就像我说的那样,一个拥有大约1000条染色体并且大约1000代的人群的计划似乎非常缓慢。 以下是两点交叉的图示: 还有一个更简单的点交叉: 因为在Java中根本不是很先进,你可以建议我采取什么方法,可能是一个我不知道的Java函数,或者我可以实现的一些算法?

如何在Java中实现遗传算法的高斯变异算子

我尝试为我的项目学习并实现一个简单的遗传算法库。 此时,人口的进化,选择已经准备就绪,我正在尝试为Java和Scala中的遗传进化引擎实现一个简单的好变异算子,如高斯变异算子 (GMO)。 我在基于多目标进化算法的Pareto排名 (PM Mateo,I。Alberto),第6页和第7页的论文A变异算子中找到了关于高斯变异算子(GMO)的一些信息。 但我有一些问题需要找到有关如何在Java中实现此高斯变异算子和此运算符的其他有用变体的其他信息。 我该怎么办? 我正在使用随机Java util的random.nextGaussian()函数,但此方法仅返回0到1之间的随机数。 所以, a)在这种情况下,如何修改返回编号的精度? (例如,我想获得一个介于0和1之间的随机双数,步长等于0.00001。) b)我如何为这个函数指定mu和sigma ,因为我想在本地搜索我的基因组的值,而不是在-1和1之间。我怎样才能调整我的基因组价值的本地研究? 经过研究,我找到了b)问题的答案。 似乎我可以取代高斯随机数,如下所示: newGenomeValue = oldGenomeValue + (( gaussiandRndNumber * sigma ) + mean ) 其中mean =我的基因组值。 (参见底部的方法如何生成具有正态或高斯分布的随机数? )

如何防止遗传算法收敛于局部最小值?

我正在尝试使用遗传算法构建一个4 x 4数独求解器。 我有一些问题,价值收敛到局部最小值。 我正在使用排名方法并删除最后两个排名的答案可能性,并用两个排名最高的答案可能性之间的交叉替换它们。 为了避免局部mininma的额外帮助,我也使用变异。 如果在特定的生成量内未确定答案,则我的人口中充满了全新的随机状态值。 但是,我的算法似乎陷入局部最小值。 作为健身function,我正在使用: (开放平方的总金额* 7(每个方格可能违规;行,列和方框)) – 违规总数 population是整数数组的ArrayList,其中每个数组都是基于输入的sudoku的可能结束状态。 确定人群中每个arrays的适应度。 有人能够帮助我确定为什么我的算法会收敛于局部最小值,或者可能会推荐一种技术来避免局部最小值。 任何帮助是极大的赞赏。 健身function: public int[] fitnessFunction(ArrayList population) { int emptySpaces = this.blankData.size(); int maxError = emptySpaces*7; int[] fitness = new int[populationSize]; for(int i=0; i<population.size();i++) { int[] temp = population.get(i); int value = evaluationFunc(temp); fitness[i] = maxError – value; System.out.println("Fitness(i)" + […]

使用遗传算法的高中时间表

我正在将java中的高中时间表遗传算法作为一个项目,但我有几个问题,我可以在哪个方向处理这个问题。 我的染色体编码应该是什么? 包含每个值或可能是字符串的ArrayList? 我该如何输入和输出数据? 我应该将数据保存在Excel中并输出时间表作为GUI吗? 新手程序员在实现算法时应该记住哪些基本知识? 到目前为止,我与GA的经验是创建一个解决旅行销售人员问题并将随机字符串演变为“Hello World”的人,但我担心我对数据库和高级概念缺乏知识会使我陷入困境完成这个项目。

使用JGAp(遗传算法库)和重复的染色体

我使用了JGAp java遗传算法库。 当我评估染色体时,我在人口样本运行中有染色体重复: evaluation 0 ABC ADF SFW evaluation 1: ABC ADF ADF evaluation 2: ADF ADF ADF 我使用的配置是: conf.setKeepPopulationSizeConstant(true); conf.setRandomGenerator(new StockRandomGenerator()); conf.verifyStateIsValid(); 我可以使用任何配置来获得独特的染色体吗?

AI如何为战列舰建立遗传规划模型

我有一个关于遗传编程的问题。 我将为一款名为Battleships的游戏开发一种遗传算法。 我的问题是:我如何决定人工智能的“决策”模型? 这是如何工作的? 我已经阅读了多篇论文和多个答案,只是谈论使用不同的模型,但找不到具体的东西,不幸的是,我显然需要围绕这个问题。 我希望它能够在多次迭代中进化并“学习”最有效的方法,但不确定如何以一种好的方式保存这些“决定”(我知道一个文件,但“编码”如何?),所以它会学会采取先前行动的立场,并根据当前董事会状态的信息。 我一直在考虑为人工智能制定“树结构”,但我实际上并不知道如何开始。 如果有人可以指出我正确的方向(一个链接?一些伪代码?类似的东西),非常感谢,我尽可能地尝试谷歌,观看有关该主题的多个YouTubevideo,但我想我只需要朝着正确的方向微动一点。 我也可能只是不知道究竟要搜索什么,这就是为什么我对于实现此内容以及如何实现此结果的结果空白。

哪些遗传算法的Java库/库?

我想在Java中实现一些简单的遗传算法 。 到目前为止,我发现只有JGAP 。 有人有经验吗? 你知道GA的其他Java库吗? 我不想像在用Java编写的GA那样自己编写它而我必须使用Java,那么最活跃的遗传编程库是什么? 也没那么有帮助。

用Java编写的GA

我试图根据我从“用于游戏程序员的AI技术”一书中选择的技术编写遗传算法,该技术使用二进制编码和适应度比例选择(也称为轮盘赌选择)对人群的基因进行在程序中以二维数组随机生成。 我最近遇到了一个伪代码 ,并试图实现它,但是我遇到了一些我需要做的具体问题。 我检查过一些书籍和一些开源代码,但仍在努力取得进展。 我明白我必须得到总人口的总体适应度的总和,在总和与零之间选择一个随机数,然后如果数字大于父母来覆盖它,但我正在努力实施这些想法。 由于我的Java生疏,因此非常感谢任何帮助实现这些想法。