我想开发一个基因程序,可以解决一般问题,例如在电脑游戏中生存。因为这是为了娱乐/教育,我不想使用现有的库。
我想出了以下想法:
输入是一个由 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 中常见的一些问题?
从我的角度来看,系统的图灵完备性并不是这里的主要问题。当使用遗传算法来演化某种应用于某些游戏环境的策略时,该算法的一个特征(这将是有帮助的)是——我相信——解决方案的“基因组”的微小变化会导致行为上相当小的变化。如果情况并非如此,那么每次突变或交叉都会产生一个行为完全不同的实体,在这种情况下,遗传算法达到某些最佳值可能会出现问题 - 因为适应度函数的情况不够连续。
话虽如此,尝试以某种方式在基因组中编码一种形式的决策树并对其进行进化对我来说是有意义的。然而,根据我的经验,游戏人工智能中的遗传算法在用于“计算”某些特定行为的某些参数的最佳值,然后“进化”行为本身时效果最佳。
抽象语法树(AST)相当于用特定领域语言制定的程序流程。如果语言包含可能的命令:上、左、下、右,则可能的 AST 将为:上、上、上、左。遗传编程试图做的是进化AST,这意味着找出许多不同的程序流程来解决一个游戏。更好的想法是进化语法,而不是仅仅进化 AST。这意味着,要修改制定 AST 的领域特定语言。例如,通过添加诸如“gocenter”之类的附加命令。新语言现在包含 5 种可能的操作:gocenter、上、左、下、右,并且可以测试新类型的群体。为了系统地发展语法,需要通过交互来学习语法。这意味着,我们从一个空语法开始,并仔细添加新的可能的操作命令。在文献中,这被描述为“语法归纳”,意味着从人类交互中获取输入流并从头开始生成新语言。通过这个语法,可以演化出可能的 AST。
引用:“语法进化(GE)是一种基于语法的遗传形式 通过编程指定可能解决方案的语法 上下文无关语法”来源:Perez、Diego 等人。 “不断进化的行为 使用语法进化为马里奥人工智能竞赛设计树。” 欧洲进化计算应用会议。 施普林格,柏林,海德堡,2011 年。
在创建生成人工智能时,您可以为其提供的内容越多,记住它可以创建的生成结果越多,并且在创建儿童游戏时,请确保拥有孩子在玩游戏时会感兴趣的所有内容。