是否有迭代编写新程序的程序?

时间:2010-06-15 18:14:27

标签: ruby metaprogramming machine-learning grammar genetic-programming

大约一年来,我一直在考虑编写一个编写程序的程序。这主要是一个有趣的练习,可能会教我一些新的概念。我的灵感来自negentropy,以及从混乱和新的混乱中产生的秩序无限连续出现的能力。

更具体地说,该程序将从写一个短随机字符串开始。如果字符串编译程序将记录它以供以后比较。如果字符串没有编译,程序将尝试重写它,直到它编译。随着更多字符串(迷你'无用'程序)被记录,可以解析它们的相似性并用于生成语法。然后可以使用该语法编写更多编译概率比纯随机字符串更多的字符串。

这显然不仅仅是一点点愚蠢,但我认为尝试发展这样的程序会很有趣。作为副产品,我得到了许多独特的程序,我可以想象并称之为艺术。

由于其简单的语法和动态编译,我可能会在Ruby中编写它,然后我将在使用ruby处理的处理中进行可视化。

我想知道的是:

  • 这种类型的编程有名称吗?
  • 此字段目前存在哪些内容?
  • 谁是主要贡献者?
  • 奖金! - 在编译(y / n)之外,我可以通过哪些方式在输出程序中进行程序化分配?我可能希望扩展该程序的功能以生成基于参数的程序,但我希望程序通过运行编译程序并为程序输出分配含义来定义这些参数。对于奖金来说,这个问题可能比合理的更为复杂,但是如果你能想到一个简单的方法来在不到23行或一个超链接中完成这样的事情,请将其投入到你的回复中。

我知道这不是元编程,从我对AI和生成算法的了解很少,他们通常比我想的更注重目标。什么是最优的是一个不断重写和改进自己的程序,所以我没有必要^ _ ^

6 个答案:

答案 0 :(得分:6)

查找“遗传编程”。

编辑以回复评论:

@chris,@ Kasturi:是的。 OP中描述的是一个用于通过强力尝试来推断语法的系统,以使得一些具体的语法编译,然后从语法中反向生成新的具体语法。如果你必然会有一些与这个描述非常接近的东西...我最好的建议就是用一些语言用非常小的语法从具体语法中构建一个隐藏的Markov模型。我考虑使用最小的组合逻辑(类似于Unlambda语言的精神)。

另一方面,遗传编程是一种具有一些发达实践和文献的技术,并不是“确定性的”,而是一个随机过程。这也是一个相当广泛的术语---可以说OP的系统是GP的限制性案例,0%交叉和100%突变。

答案 1 :(得分:5)

您听说过nanopond吗?这个概念与你的概念相似。每个像素都有一个随机生成的字符串,该字符串通过编译器运行。通常,这不会产生任何有效的程序。然而,每隔一段时间,随机生成的字符串将以某种方式被完美地格式化以便能够将其自身复制到相邻像素中。很快,它就变成了一个程序可以比其他程序更好地再现的战斗。

你所谈论的是遗传算法,是的,但最大化一件事,一件事就是:重现的能力。

这是所有自然发生的negentropic现象的重要起源:随机形成的复杂实体具有繁殖能力。

经典遗传算法强加人工繁殖标准 - 人工选择繁殖的程序最佳。

你所暗示的是一种计算自然选择。也就是说,程序将根据其自我复制的能力而发展,仅此而已。

这会创造一些有用的东西吗?也许不是。除非您允许您的程序访问互联网或其他可以随机访问的外部API,并且可能通过互联网传播。

不幸的是,您描述的系统仍然有一些人为的复制标准:编译能力。

因为编译能力=复制能力,所以你人为地设置你的程序以进行编译。

编译什么?这没关系,因为任何编译的程序都可能像最后一个一样重现。假设你以某种方式生成了一个输出Fibonacci序列的程序。或者一个可以击败国际象棋大师的程序。凉!不幸的是,它会被复制吗?它会特别吗?

完全没有;它被视为“适合”复制为程序print('k')

我建议运行一个随机运行的程序字符串框架,这些程序可以访问API,可以:

  • 读取/写入硬盘驱动器,突然之间,您可以自己编写随机字符串作为程序的程序。
  • 删除/修改硬盘上的其他文件;这允许程序可能相互竞争。您的API可以设计为只有在程序的“强度”(任意值...可能是字符长度)强于文件时才能删除文件。
  • 在硬盘上运行其他脚本......甚至可能是他们自己编写的脚本
  • 访问互联网;到网络服务器?能够编写/附加/发送/阅读电子邮件吗?

我认为编写可以自我复制的程序的程序可以产生比编写可编译程序的程序更好的结果。

除非你只想要后者;那么也许你可以最大化程序长度。但有可能发生一些有趣的事情吗?没有那么多;任何“编译”一定长度的程序都与“复制”一样可能。

答案 2 :(得分:1)

您可以做的另一个项目是处理从未通过某个单元测试到通过单元测试而变异的内容。

例如,给定一个实现

def add(a,b)
  a
end

您可以添加测试

assert_equal 3, Foo.new.add(1,2)

并要求您的计划在a adda.-(b)上尝试任意方法组合(例如,a.to_sa.+(b),{{1}})突变体通过了测试和现有的测试。

您可能想看看heckle(或Zentest?)有关更改正在测试的代码的示例。

答案 3 :(得分:1)

答案 4 :(得分:0)

  

最优的是程序   不断改写和改进   本身所以我没有

执行以下步骤:

  1. 在程序集中写入伪随机数生成器。 (实模式)
  2. 修改程序,使其写出(例如)64k的随机数,并对第一个字节执行FAR JMP。
  3. (可选)为看门狗计时器创建驱动程序以防止无限循环
  4. 加载到某些设备的bootsector上。
  5. 获取多台计算机。配置,以便如果它们三重故障,它们将重新启动并从设备的引导扇区启动
  6. 启动计算机并等待几十年(或几个世纪,无论如何),以便生成有用的东西
  7. 利润!

答案 5 :(得分:0)

早期但非常有趣的作品是Doug Lenat的“AM”(数学家)和Eurisko(AM的概括)。

Eurisko通过研究边界条件如何影响解决问题来演化一套测量学。它没有产生垃圾而不是尝试它,相反,它采用了一种弱问题解决方法,并找到了可以做得更好的情况,并生成了问题解决方案的修补版本。