我想在Java中实现一些简单的遗传算法.
到目前为止,我发现只有JGAP.有人有经验吗?你知道GA的其他Java库吗?
我不想像在用Java编写的GA那样自己编写它而且我必须使用Java,那么最活跃的遗传编程库是什么?也没那么有帮助.
我正在尝试创建一个遗传算法来训练神经网络,目标是玩游戏蛇.
我遇到的问题是世代的适应性没有提高,它要么仍然保持在不给游戏任何输入的健身,或者只是在第一代之后变得更糟.我怀疑它是神经网络的一个问题,但我不知道它是什么.
24输入节点
2隐藏层
每层8个节点
4个输出节点(蛇可以采取的每个方向一个)
输入是蛇可以看到的每个方向的数组.对于每个方向,它检查距离与墙壁,水果或其自身的距离.最终结果是一个长度为的数组3*8 = 24.
权重和偏差是在创建网络时生成的-1到1之间的随机浮点数.
人口规模:50000
每代选择的父母:1000
每代保持最高:25000(新变量,看到更好的结果)
每个孩子的突变几率:5%
(我尝试了很多不同的尺寸比例,虽然我还不确定它的典型比例是多少.)
我正在使用单点交叉.每一组重量和偏差都在父母之间交叉,并传递给孩子(交叉的每个"版本"一个孩子).
我正在使用我认为轮盘选择来选择父母,我将在下面发布确切的方法.
蛇的适应性计算如下age * 2**score:(不再是更新中的更多信息),其中年龄是蛇存活了多少圈,而得分是它收集的果实数量.
下面是一些伪代码,试图总结我的遗传算法(应该)如何工作:
pop = Population(size=1000)
while True: # Have yet to implement a 'converged' check
pop.calc_fitness()
new_pop = []
for i in range(n_parents):
parent1 = pop.fitness_based_selection()
parent2 = pop.fitness_based_selection()
child_snake1, child_snake2 = parent1.crossover(parent2)
if rand() <= mutate_chance:
child_snake.mutate()
new_pop.append(child_snake1, child_snake2)
pop.population = new_pop
print(generation_statistics)
gen += 1
Run Code Online (Sandbox Code Playgroud)
这是我用来选择父级的方法:
def …Run Code Online (Sandbox Code Playgroud) python neural-network genetic-algorithm python-3.x unsupervised-learning
任何人都可以为轮盘选择功能提供一些伪代码吗?我将如何实现这一点:我真的不明白如何阅读这个数学符号.我想要通用算法.
algorithm roulette-wheel-selection genetic-algorithm evolutionary-algorithm
有一位荷兰艺术家/工程师创造了一个非常精致的步行机制.工作原理可以在这里看到:
http://www.strandbeest.com/beests_leg.php
奇怪的是,他使用自制的进化算法来计算理想的链接长度,这在页面底部有描述.
我创建了一个Python脚本来可视化地分析循环的地面接触部分,它必须满足两个必要条件:
这两个标准将产生"轮状"效应,机器在线性前进而不浪费动能.
问题是:
"你是否有任何关于优化腿长度的简单进化迭代公式的建议(通过在下面的代码中插入正确的突变),以便根据上述两个标准改善步行路径?"
编辑:关于基因组候选人的"拟合规则"的一些建议:
这是我在Python + GTK中的代码,它提供了对问题的一些视觉洞察:(编辑:现在参数化的魔术数字受到mut的值的突变)
# coding: utf-8
import pygtk
pygtk.require('2.0')
import gtk, cairo
from math import *
class Mechanism():
def __init__(s):
pass
def assemble(s, angle):
# magic numbers (unmutated)
mu = [38, 7.8, 15, 50, 41.5, 39.3, 61.9, 55.8, 40.1, 39.4, 36.7, 65.7, 49]
# mutations
mut = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
# …Run Code Online (Sandbox Code Playgroud) python math geometry genetic-algorithm evolutionary-algorithm
我已经阅读了几本书的介绍部分以及关于这两个主题的一些论文,并且我认为这两种方法几乎完全相同.也就是说,我还没有时间对主题进行深入研究,所以我可能错了.
遗传算法和进化策略之间有什么区别?是什么让他们与众不同,他们在哪里相似?
要明确我并不是说,只要序列中的最后两个数字提供下一个数字:
(2, 3, -> 5)
Run Code Online (Sandbox Code Playgroud)
但相反,给定任何索引提供斐波纳契数:
(0 -> 1) or (7 -> 21) or (11 -> 144)
Run Code Online (Sandbox Code Playgroud)
对于任何机器学习结构,添加两个数字是一项非常简单的任务,并且通过扩展计数,两个数字或任何固定数字是一个简单的加法规则.然而递归计算......
据我所知,大多数学习网络只依赖于前向评估,而大多数编程语言都有循环,跳转或循环流模式(所有这些都是某种类型的ASM跳转),从而允许递归.
当然有些网络不仅仅是前锋; 但是,使用双曲正切或sigmoid函数处理权重是否可以进入任何计算完整的状态?
即条件语句,条件跳转,强制跳转,简单循环,具有多个条件的复杂循环,提供排序顺序,元素的实际重新排序,赋值,分配额外的寄存器等等?
似乎即使是非前向唯一的网络也只能找到最佳拟合的多项式,从而减少了训练集范围内的误差,并且不再进一步.
我错过了一些明显的东西,或者大多数机器学习只是看看递归并假装那些问题不存在?
更新
从技术上讲,任何编程语言都可以被认为是遗传算法的DNA,其中编译器(以及可能的控制台测量)将是适应度函数.问题是编程(到目前为止)不能以爬山的方式表达 - 字面上,健身是0,直到健身为1.事情不是编程的一半,如果他们这样做,没有办法衡量一个程序在未知情况下的"工作"程度.即使是一个错误也可能看起来是完全不同且混乱的系统,没有输出.这正是首先学习编码非常困难的原因,学习曲线几乎是垂直的.
有些人可能会争辩说,你只需要为系统提供更强大的基础规则来利用 - 但这只会导致尝试概括所有编程问题,这些问题一直围绕着设计编程语言并且完全失去了某些学习机器的概念.沿着这条道路带您到LISP的近似变体,具有可变异的代码和几乎无意义的健身功能,这些功能可以强制"漂亮"和"简单"的代码空间,以尝试遵循人类编码最佳实践.
其他人可能会争辩说,我们根本没有使用足够的人口或动力来获得错误表面,或者朝着解决方案迈出有意义的一步.但随着你的人口接近DNA排列的数量,你实际上只是粗暴的强迫(并且非常低效).暴力强制代码排列并不是什么新鲜事,绝对不是机器学习 - 它实际上在正则表达式高尔夫中很常见,我认为甚至还有一个关于它的xkcd ......
真正的问题不是找到适用于某些特定递归函数的解决方案,而是找到一个可以以某种有用的方式包含递归域的解决方案空间.
因此,除了使用反向传播训练的神经网络,假设找到递归函数的封闭形式(如果封闭形式甚至存在,并且它们在递归有用的大多数实际情况中不存在),或者非转发网络就像伪编程语言在最好的情况下具有可怕的健身前景,加上调整退出约束以防止无限递归的几乎不可能的任务......到目前为止,机器学习和递归真的是这样吗?
recursion machine-learning neural-network genetic-algorithm evolutionary-algorithm
我目前正在阅读一篇关于在约束优化问题中使用GA的论文.在某些方面,它正在讨论将niching方案应用于个人(或他们制造的帕累托前线).
这似乎是一个典型的选择方案,但在我搜索时,我找不到一个很好的解释.
有人可以尽可能简单地向我解释一下,这是一种什么样的方案?
所以我意识到我在这里提出的问题是庞大而复杂的.
在我通过统计论坛和帖子搜索的所有内容中,我没有遇到一种科学合理的方法来考虑我遇到的数据类型,但我已经想到一个(新颖的?)潜在的解决方案来完美地解决(在我的想法)对于同一模型中的大型和小型数据集.
所提出的方法涉及使用遗传算法来改变定义构成implied strike速率的数据集的大小implied strike与要使用的百分比之间的关系的两个数字,其中模型的目标最大化1两列中的数字的同源性.以下csv.(超简化但希望证明原理)
Date,PupilName,Unique class,Achieved rank,x,y,x/y,Average xy
12/12/2012,PupilName1,UniqueClass1,1,3000,9610,0.312174818,0.08527
12/12/2012,PupilName2,UniqueClass1,2,300,961,0.312174818,0.08527
12/12/2012,PupilName3,UniqueClass1,3,1,3,0.333333333,0.08527
13/12/2012,PupilName1,UniqueClass2,1,2,3,0.666666667,0.08527
13/12/2012,PupilName2,UniqueClass2,2,0,1,0,0.08527
13/12/2012,PupilName3,UniqueClass2,3,0,5,0,0.08527
13/12/2012,PupilName4,UniqueClass2,4,0,2,0,0.08527
13/12/2012,PupilName5,UniqueClass2,5,0,17,0,0.08527
14/12/2012,PupilName1,UniqueClass3,1,1,2,0.5,0.08527
14/12/2012,PupilName2,UniqueClass3,2,0,1,0,0.08527
14/12/2012,PupilName3,UniqueClass3,3,0,5,0,0.08527
14/12/2012,PupilName4,UniqueClass3,4,0,6,0,0.08527
14/12/2012,PupilName5,UniqueClass3,5,0,12,0,0.08527
15/12/2012,PupilName1,UniqueClass4,1,0,0,0,0.08527
15/12/2012,PupilName2,UniqueClass4,2,1,25,0.04,0.08527
15/12/2012,PupilName3,UniqueClass4,3,1,29,0.034482759,0.08527
15/12/2012,PupilName4,UniqueClass4,4,1,38,0.026315789,0.08527
16/12/2012,PupilName1,UniqueClass5,1,12,24,0.5,0.08527
16/12/2012,PupilName2,UniqueClass5,2,1,2,0.5,0.08527
16/12/2012,PupilName3,UniqueClass5,3,13,59,0.220338983,0.08527
16/12/2012,PupilName4,UniqueClass5,4,28,359,0.077994429,0.08527
16/12/2012,PupilName5,UniqueClass5,5,0,0,0,0.08527
17/12/2012,PupilName1,UniqueClass6,1,0,0,0,0.08527
17/12/2012,PupilName2,UniqueClass6,2,2,200,0.01,0.08527
17/12/2012,PupilName3,UniqueClass6,3,2,254,0.007874016,0.08527
17/12/2012,PupilName4,UniqueClass6,4,2,278,0.007194245,0.08527
17/12/2012,PupilName5,UniqueClass6,5,1,279,0.003584229,0.08527
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个很小的模型数据集,其中包含一些很好的例子,说明我当前的方法不足之处,以及我觉得遗传算法可以用来解决这个问题.如果我们查看上面的数据集,它包含6个唯一的类,该算法的最终目标是在调整的排名x/y和第achieved rank3列(基于零的参考)之间创建尽可能高的对应关系.在uniqueclass1我们有两个相同的x/y值,现在这些都是比较大的x/y,如果你用的平均水平进行比较(注意是平均不从这个数据集计算)值,而这将是预期,九千六百十分之三千更显著,因此更有可能有一个常识achieved rank的1比961分之300.所以我想做的是adjusted x/y使用等式定义的对数增长关系克服数据集大小的这些差异:
adjusted xy = ((1-exp(-y*?)) * x/y)) + ((1-(1-exp(-y*?)))*Average xy)
?唯一的动态数字在哪里
如果我可以稍微解释一下我的逻辑,并打开自己(希望)建设性的批评.下图显示了数据集大小与调整后的x/y的x/y%之间的指数增长关系.基本上上面的等式所说的是随着数据集变得越大,原始x/y使用的百分比adjusted x/y …
所以我被赋予了使用遗传算法编写5x5x5井字游戏的问题.我的方法是从3x3开始,使其工作,然后扩展到5x5,然后扩展到5x5x5.
它的工作方式是这样的:
模拟一大堆游戏,并在每个游戏的每个回合中,在相应的表(X表或实现为c ++ stdlib映射的O表)中查找响应.如果电路板不存在,请将电路板添加到表中.否则,进行随机响应.
在我有完整的表格后,我初始化了一堆玩家(每个玩家都有一个董事会表格副本,用随机响应进行初始化),然后让他们互相对抗.
为3×3,贴现板即是反射/其它板的旋转,和电路板,其中所述移动可以是"取胜"或"阻断取胜",板的总数I会遇到要么53或38,这取决于是否你去第一或第二.太棒了!在一小时内生成了最佳玩家.很酷!
使用相同的5x5策略,我知道表的大小会增加,但没有意识到它会大幅增加.即使折扣旋转/反射和强制移动,我的表格约为360万条,看不到尽头.
好吧,这显然不会起作用,我需要一个新的计划.如果我不列举所有的电路板,只是一些电路板,该怎么办?好吧,似乎这也不会起作用,因为如果每个玩家只有一小部分他们可能看到的可能的板,那么他们将会做出很多随机动作,显然是在最优化的相反方向.
实现这一目标的现实方法是什么?我会被困在使用电路板功能吗?目标是尽可能少地编写游戏功能.
我一直在做研究,但我读到的所有内容都会导致最小/最大,AB修剪是唯一可行的选择.我当然可以这样做,但GA真的很酷,我现在的方法只是在这里超过现实.
编辑问题已经解决了:
使用结合开放空间的汉明距离的相似性函数,可能的获胜条件以及一些其他措施使得桌子降低到可管理的2500种可能性,其std::map在几分之一秒内处理.
从我到目前为止看到的它们看起来非常相似.差分进化使用浮点数代替,解决方案称为向量?我不太清楚这意味着什么.如果有人可以提供一些关于两者的优点和缺点的概述.
artificial-intelligence genetic-algorithm differential-evolution
python ×3
algorithm ×2
geometry ×1
java ×1
math ×1
python-2.7 ×1
python-3.x ×1
recursion ×1
scipy ×1