AI-程序员

                              AI-程序员

阅读完整的文章使用人工智能编写自我修改/改进程序

阅读研究论文BF-Programmer:一种使用遗传算法自主构建简单程序的违反直觉的方法。

AI-Programmer是一个使用人工智能和遗传算法自动生成程序的实验。 AI成功创建的程序包括:hello worldhello,加法,减法,反转字符串,fibonnaci序列,墙上的99瓶啤酒,等等。它变得越来越聪明。简而言之,它是一个具有自修改代码的AI遗传算法实现。

动机

计算机可以编写自己的程序吗?需要一个文字处理器?让计算机为你创建一个。需要一个屏幕捕获工具?让计算机为你创建一个。更进一步,让计算机创建简化您的生活的程序,您甚至不知道您需要!这是AI-Programmer实验背后的想法。目标是最终创建一个计算机程序,可以编写自己的计算机程序来解决特定的计算问题。虽然计算机决定写什么类型的程序的能力超出了我们目前的意愿,但我们仍然可以通过计算机生成程序来解决非常具体的任务,例如输出文本“Hello World”。 AI程序员使用一种深奥的编程语言来生成软件程序。

细节

底层的编程语言只包含8条指令,而Turing是完整的。理论上,它能够解决任何计算问题。这使得开发解释器变得容易,能够在模拟环境中运行AI生成的程序。以这种方式,可以执行每个生成的程序并将其性能排序为健身分数。由于AI使用图灵完整编程语言,AI本身在理论上也能够解决任何计算问题。但是,对于这个实验,AI会专注于向控制台输出一个简单的字符串。

怎么运行的

AI-Programmer的工作原理如下:

  • 基因组由一系列双打组成。
  • 每个基因都对应于编程语言中的一条指令。
  • 从一群随机基因组开始。
  • 将每个双基因组转换成相应的指令并执行程序,将每个基因组解码为一个结果程序。
  • 根据它写入控制台的输出(如果有)获取每个程序的健身评分,并对它们进行排名。
  • 使用轮盘选择,交叉和变异将最好的基因组拼接在一起,以产生新一代。
  • 用新一代重复这个过程,直到达到目标健身评分。

 

健身方法

适应性方法通过对生成的程序的输出进行评分来工作。通过查看程序输出的每个字符并从所需字符中减去它的值来计算分数:

fitness += 256- Math.Abs(console[i] - targetString[i]);

翻译指令集

>        Increment the pointer.

<        Decrement the pointer.

+        Increment the byte at the pointer.

-        Decrement the byte at the pointer.

.        Output the byte at the pointer.

,        Input a byte and store it in the byte atthe pointer.

[        Jump forward past the matching ] if thebyte at the pointer is zero.

]        Jump backward to the matching [ unlessthe byte at the pointer is zero.

结果吗?

请记住,这是一个概念证明。到目前为止,该计划已经成功用目标编程语言编写了几个程序。您可以在/ Results文件夹中查看所有结果的屏幕截图。这些测试是在Intel Core 2 Quad 2.5GHz上运行的。

AI成功编写了一个程序,在大约1分钟后输出“hi”,经过5,700代。它产生了以下代码:

+[+++++-+>++>++-++++++<<]>++.[+.]-.,-#>>]<]

虽然上面的代码包含解析错误,比如不匹配的括号,但是我们的模拟解释器计算结果直到程序失败,所以在上面的例子中,语法错误(在代码后面,在找到解决方案之后)不影响健身。您可以尝试将上述代码粘贴到在线翻译器中。点击“开始调试器”,忽略警告,然后点击运行到断点。注意输出。如果我们修剪掉多余的代码,我们会看到以下语法有效的代码:

+[+++++-+>++>++-++++++<<]>++.[+.]

你好

AI成功编写了一个程序,在大约29分钟后输出“hello252,000万代。它产生了以下代码:

+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+][[[.+.,,+].-

在生成过程中,AI非常接近解决方案,但是一个字母在一个循环内相互绑定。人工智能能够通过创建一个内部循环来解决这个问题,在成功输出正确字符的情况下,继续处理。

问声好!

在另一个例子中,AI成功编写了一个程序来输出“Hi!”在约2小时7分钟后进行1,219,400代。它产生了以下代码:

>-----------<++[[++>++<+][]>-.+[+++++++++++++++++++++++++++++><+++.<><-->>>+].]

我爱所有人

人工智能在10个小时内成功编写了一个程序,输出“我爱所有人类”6,057,200次。它产生了以下代码:

+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.--------.------------.+++++++++++++.+++++.

使用更快的PC时可能会产生更复杂的程序。接下来的步骤包括尝试接受用户输入和处理结果。

使用代码的快速入门指南

默认情况下,代码被配置为使用Classic指令集并编写程序来输出字符串。要更改生成的字符串,只需展开“专用变量”部分,然后将TargetString的文本更改为所需的值。

private staticTargetParams _targetParams = new TargetParams { TargetString = "hello world"};

要更改AI写入的程序类型,请更改GetFitnessMethod()内的适合度方法。

private staticIFitness GetFitnessMethod()

{return newStringStrictFitness(_ga, _maxIterationCount, _targetParams.TargetString,_appendCode);

}

您可以将其更改为AI.Programmer.Fitness/Concrete项目中的任何类。例子:

return newStringStrictFitness(_ga, _maxIterationCount, _targetParams.TargetString,_appendCode);

return newAddFitness(_ga, _maxIterationCount);

return newSubtractFitness(_ga, _maxIterationCount);

return newReverseStringFitness(_ga, _maxIterationCount);

return newHelloUserFitness(_ga, _maxIterationCount, _targetString);

要使用子例程,您需要启用函数。这将让AI更快地制作节目。取消注释functionGenerator的代码,如下所示:

private staticIFunction _functionGenerator = new StringFunction(() => GetFitnessMethod(),_bestStatus, fitnessFunction, OnGeneration, _crossoverRate, _mutationRate,_genomeSize, _targetParams);

App.config设置为使用BrainPlus,以便AI可以访问子例程指令:

<appSettings>

<addkey="BrainfuckVersion" value="2"/> <!-- 1 = BFClassic, 2 = BrainPlus (BF Extended Type 3, Functions, Faster) -->

</appSettings>

使用子例程时,需要较少的代码。所以,你可以使用更小的基因组大小来提高速度。展开遗传算法设置部分并将_genomeSize更改为较小的值:

private staticint _genomeSize = 50;

 

试玩,玩得开心!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值