我想开发一种遗传程序,可以解决通用问题,例如在计算机游戏中生存。因为这是出于娱乐/教育目的,所以我不想使用现有的库。
我想到了以下想法:
输入是N个整数的数组。 该遗传程序最多包含N个AST,每个AST从某些数组元素中获取输入并将其输出写入单个特定的数组元素中。
AST可以是任意复数,并且仅由四个算术运算符(+,-,*,/)组成,并且可以对给定数组的常量和固定元素进行操作(无随机访问)。
因此,对于[N = 3],我们有3个AST,例如:
a[0] = {a[0] + 1}
a[1] = {a[0] + a[1]}
a[2] = {a[0] * 123 + a[1]}
N个AST一次又一次执行,并且无限次重复。
现在我的问题是,这个系统“足够强大”(图灵完善吗?)还是无法解决游戏AI常见的某些问题?
答案 0 :(得分:3)
从我的角度来看,系统的图灵完备性不是这里的主要问题。当使用遗传算法来进化适用于某些游戏环境的某种策略时,该算法的特征之一(可能会有所帮助)是-我认为-解决方案的“基因组”中的微小变化会导致行为上的合理变化很小。如果这不是真的话,那么每个突变或交叉都会产生一个行为完全不同的实体,并且在这种情况下,遗传算法难以达到某个最佳值可能会遇到问题-因为适应度函数的状态不够连续。
说过,对我来说,尝试以某种方式在基因组中编码一种决策树并进行进化对我来说很有意义。但是,根据我的经验,当用于“计算”某些特定行为的某些参数的最优值然后“演化”行为本身时,用于游戏的AI的遗传算法效果最佳。
答案 1 :(得分:1)
抽象语法树(AST)等于以特定于领域的语言制定的程序流。如果语言由可能的命令组成:上,左,下,右,则可能的AST是:上,上,上,左。基因编程正试图发展AST,这意味着要找出解决游戏的许多不同程序流程。不仅发展AST,更好的主意是发展语法。这意味着,要修改制定AST的领域特定语言。例如,通过添加其他命令,例如“ gocenter”。新语言现在包含5种可能的操作:gocenter,向上,向左,向下,向右,并且可以测试新的种群。为了系统地发展语法,需要通过交互来学习语法。这意味着,我们从一个空语法开始,并仔细添加新的可能的动作命令。在文献中,这被称为“语法归纳”,是指从人类交互中获取输入流并从头开始生成新语言。有了这种语法,就有可能发展出可能的AST。
quote:“语法演变(GE)是遗传的基于语法的形式 通过以下方式指定可能解决方案的语法的编程 上下文无关语法”来源:Perez,Diego等人。 “不断演变的行为 运用语法演变为mario ai竞赛树。” 欧洲进化计算应用会议。 施普林格,柏林,海德堡,2011年。