这是我上一个问题的延续.我想解析一个方程式并按照我得到的方式工作.我想要做的基本上是随机加扰它,所以我得到一个新的等式,它必须也是一个有效的函数.这将用于遗传算法.
这是我开始的地方:
class Py2do(ast.NodeTransformer):
def __init__(self):
self.tree=[]
def generic_visit(self, node):
print type(node).__name__
self.tree.append(type(node).__name__)
ast.NodeVisitor.generic_visit(self, node)
depth=3
s = node.__dict__.items()
s = " ".join("%s %r" % x for x in sorted(node.__dict__.items()))
print( "%s%s\t%s" % (depth, str(type(node)), s) )
for x in ast.iter_child_nodes(node):
print (x, depth)
def visit_Name(self, node):
# print 'Name :', node.id
pass
def visit_Num(self, node):
print 'Num :', node.__dict__['n']
def visit_Str(self, node):
print "Str :", node.s
def visit_Print(self, node):
print "Print :"
ast.NodeVisitor.generic_visit(self, node)
def visit_Assign(self, node):
print "Assign …Run Code Online (Sandbox Code Playgroud) 假设您必须编写一个程序来测试所有程序以搜索完成特定任务的程序.例如,考虑这个JavaScript函数:
function find_truth(){
for(n=0;;++n){
try {
var fn = Function(string(n));
if (fn() == 42)
return fn;
} catch() {
continue;
}
}
}
Run Code Online (Sandbox Code Playgroud)
只要string(n)返回第n个字符串("a","b","c",......"aa","ab"......),该程序最终将输出一个求值的函数42.此方法的问题在于它枚举的字符串可能是也可能不是有效的程序.我的问题是:是否可以自己枚举程序?怎么样?
我认为这个问题可以用ML解决,因为我想要实现输出空间的一些属性.
问题:D1 < - > D2其中D1是输入空间,D2是一个空间,使得:D2将具有更多的维度(可能是数量级),其中每个维度被约束为0到N之间的自然数,并且存在概率P表示+ -1变为D2中的随机维度对映射回D1没有影响.存在概率P2,这种变化将仅影响D1中的单个维度,概率P3将影响2个维度,以及其他此类规则......
我们的目标是创建一种映射方法,以便将遗传算法应用于D2空间,理由是这就是DNA的工作方式,而且显然是有效的.
如果维度之间存在隐藏关系,那么应用于D1的遗传算法可能是无用的,这是D2需要的主要原因,这种关系将被最小化,并且在它们确实存在的情况下,它们的影响幅度将被随机化.
mapping machine-learning genetic-programming genetic-algorithm
我正在为JVM寻找一个好的遗传编程库.(不是遗传算法,而是遗传编程)我尝试了JGAP(jgap.sourceforge.net)和Watchmaker(watchmaker.uncommons.org).不幸的是,这些工具只对遗传编程提供了实验性和不成熟的支持(它们主要集中在遗传算法上).
也许你知道任何更好的遗传编程工具,JVM(可以用Java或任何其他编译语言编写的JVM).
我不是在寻找一个全面的GP工具列表,我宁愿寻找一个好的,流行的工具(就像流行的操作系统是Windows,Linux和Mac,流行的Java IDE是Eclipse,IDEA和NetBeans).
它不一定是遗传编程库(GP),它也可以(并且可能更好)基因表达编程库(GEP).
编辑(自问题起两个月后):我分析了您发布的大部分链接以及Wiki中可用的链接,我必须说每个库至少存在以下一个问题:
没有开源,或开源,但非常严格(GPL);
没有文件(或非常差的文件);
没有内置支持遗传编程或基因表达编程(或实验一个;
有些使用起来太复杂了.
在这篇文章中,我最终为项目编写了自己的简单库(使用基因表达式编程方法,这使得它非常简单).
这对于遗传编程很有用,遗传编程通常使用Lisp子集作为程序的表示.
我在网上找到了一个名为Liskell(Lisp语法,Haskell里面)的东西,但链接坏了,我找不到它上面的文件......
我正在写一个遗传编程(GP)系统(在C中,但这是一个小细节).我已经阅读了很多文献(Koza,Poli,Langdon,Banzhaf,Brameier等),但有一些我从未见过的实现细节.例如:
我使用稳定状态而不是代际方法,主要是使用计算机的所有内存,而不是为临时人口预留一半.
Q1.在GP中,与GA相反,当您执行交叉时,您选择两个父母,但是您创建了一个或两个孩子,或者您是自由选择吗?
Q2.在稳定的GP中,与世代系统相反,人口中的哪些成员通过交叉创建的孩子取而代之?这是我没有见过的.是两个父母,还是其他两个随机选择的成员?我可以理解,如果是后者,并且您可以使用负面锦标赛选择来选择要替换的成员,但是这不会产生过早收敛吗?(在交叉事件发生后,人口中包含两个原始父母和两个父母的子女,另外两个随机成员被移除.精英主义是固有的.)
Q3.是否有专注于GP的网络论坛或邮件列表?奇怪的是我没有找到一个.雅虎的GP小组几乎专门用于公告,Poli/Langdon Field Guide论坛几乎是无声的,而对于像gamedev.net这样的通用/游戏编程网站的GP讨论非常基础.
感谢您的任何帮助,您可以提供!
artificial-intelligence genetic-programming genetic-algorithm evolutionary-algorithm crossover
在进化计算中令人讨厌的是,略有不同和重叠的概念倾向于选择截然不同的名称.我最近的困惑是因为基因表达编程似乎与笛卡尔遗传编程非常相似.
大约一年来,我一直在考虑编写一个编写程序的程序.这主要是一个有趣的练习,可能会教我一些新的概念.我的灵感来自于negentropy和秩序从混乱和新的混乱中出现的能力,无序地连续出现.
更具体地说,程序将从编写一个短随机字符串开始.如果字符串编译程序将记录它以供以后比较.如果字符串没有编译,程序将尝试重写它,直到它编译.随着更多字符串(迷你'无用'程序)被记录,可以解析它们的相似性并用于生成语法.然后可以使用该语法编写更多的字符串,这些字符串具有比纯随机字符串更高的编译概率.
这显然不仅仅是一点点愚蠢,但我认为尝试发展这样的程序会很有趣.作为副产品,我得到了许多独特的程序,我可以想象并称之为艺术.
由于其简单的语法和动态编译,我可能会在Ruby中编写这个,然后我将在使用ruby处理的处理中进行可视化.
我想知道的是:
我知道这不是元编程,从我对AI和生成算法的了解很少,他们通常比我想的更注重目标.什么是最优的是一个不断重写和改进自己的程序,所以我没有必要^ _ ^
ruby grammar metaprogramming machine-learning genetic-programming
在进化算法中,维持了两个主要的能力,即探索和开发.
在探索中,搜索新区域中的新解决方案的算法,而剥离意味着使用已存在的解决方案并对其进行细化,以便提高其适应性.
在我的情况下,我担心遗传算法,我的问题是我阅读了许多不同的文章,我找出了三个不同的解释,探索和利用这些观点如下:
在一篇文章中,它谈到了探索是通过突变进行的交叉和利用来完成的
在一篇文章中,第一篇文章的逆转,通过突变和交叉开发进行探索
最后一篇是由AE Eiben和CA Schippers撰写的论文"On Evolutionary Exploration and Exploitation"(1998),它说开发是通过选择过程完成的,而探索是由操作员完成的,无论它是交叉还是突变
我从我的小观点看,交叉和变异都为我们提供了一种新的解决方案,这种解决方案在人群中不存在,这是算法的随机部分,因此它是探索过程,当选择个体进行交配或繁殖时,我从中选择现有的解决方案,并根据它的健身,这是启发式的部分,所以它的利用.
哪个是正确的?哪个步骤或操作员负责勘探和负责开采?
请为此我需要推理合理的答案.
对于遗传编程的研究,我想在llvm的基础上实现一个进化系统并应用代码突变(可能在IR级别).
我发现了llvm-mutate,这是非常有用的执行点突变.据我所知,指令得到计数/编号,然后可以删除编号的指令.
但是,作为代码中的可用语句之一,似乎可以引入新指令.然而,真正的突变将允许插入任何允许的IR指令,而不管它是否在要变异的代码中使用.此外,应该可以插入链接库的库函数调用(不在当前代码中使用,但可能可用,因为lib已在clang中链接).
我是否在llvm-mutate中忽略了这一点,或者到目前为止真的不可能?
是否有任何项目试图/已经为llvm实施(ed)此类突变?
llvm有许多代码分析工具,应该允许实现上述方法.llvm很大,所以我有点迷失方向.任何提示哪些工具可能有用(例如获取可用库函数列表等)?
谢谢Alex