使用人工智能阅读完整的文章来编写自我修改/改进程序
阅读研究论文AI程序员:使用遗传算法自主创建软件程序。
AI-Programmer是使用人工智能和遗传算法自动生成程序的实验。 AI成功创建的程序包括:Hello World,Hello,加法,减法,逆转弦,斐波那奇序列,墙上99瓶啤酒等等。越来越聪明。简而言之,这是具有自修改代码的AI遗传算法实现。
计算机可以编写自己的程序吗?需要文字处理器吗?让计算机为您创建一个。需要屏幕捕获工具吗?让计算机为您创建一个。更进一步,让计算机创建简化您的生活的程序,甚至不知道自己需要!
这是AI-Programmer实验背后的想法。目标是最终创建一个可以编写自己的计算机程序来解决特定计算问题的计算机程序。虽然计算机的功能决定要编写的程序类型超出了我们当前的手段,但我们仍然可以拥有一个计算机生成的程序来求解非常具体的任务,例如输出文本“ Hello World”。 AI程序员使用深奥的编程语言来生成软件程序。
基础编程语言仅包含8个说明,而图灵完成。从理论上讲,它能够解决任何计算问题。这使得开发能够在模拟环境中运行AI生成的程序的解释器变得容易。以这种方式,每个生成的程序都可以执行,其性能将其排名为健身得分。由于AI使用Turing完整的编程语言,因此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 at the pointer.
[ Jump forward past the matching ] if the byte at the pointer is zero.
] Jump backward to the matching [ unless the byte at the pointer is zero.
请记住,这是概念证明。到目前为止,该计划已成功地使用其目标编程语言编写了几个程序。您可以在 /结果文件夹中查看所有结果的屏幕截图。这些测试是在Intel Core 2 Quad 2.5GHz上进行的。
AI在大约1分钟内成功地编写了一个程序,以在5700代后输出“ HI”。它产生了以下代码:
+[+++++-+>++>++-++++++<<]>++.[+.]-.,-#>>]<]
虽然上述代码包含解析错误(例如非匹配括号),但我们的仿真解释器计算结果直到程序失败,因此在上述情况下,语法错误(在代码中稍后,在找到解决方案之后,该错误是在代码中的, )不影响健身。
您可以尝试将上述代码粘贴到在线解释器中。单击“启动调试器”,忽略警告,然后单击“运行到断点”。注意输出。
如果我们修剪多余的代码,我们会看到以下句法valid代码:
+[+++++-+>++>++-++++++<<]>++.[+.]
AI在大约29分钟内成功编写了一个程序,以输出252,0000代后输出“ Hello”。它产生了以下代码:
+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+][[[.+.,,+].-
在生成过程中,AI非常接近解决方案,但是几个字母在一个循环中彼此绑定。 AI能够通过在有问题的人中创建内环,成功地输出正确的字符并继续处理。
在另一个示例中,AI成功编写了一个程序来输出“ HI!”在大约2小时7分钟内1,219,400代后。它产生了以下代码:
>-----------<++[[++>++<+][]>-.+[+++++++++++++++++++++++++++++><+++.<><-->>>+].]
AI成功编写了一个程序,以在大约10个小时内6,057,200代后输出“我爱所有人”。它产生了以下代码:
+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.--------.------------.+++++++++++++.+++++.
使用更快的PC时,可能会生成更复杂的程序。下一步包括尝试接受用户输入和过程结果。
默认情况下,代码被配置为使用经典指令集并编写程序以输出字符串。要更改生成的字符串,只需扩展“私有变量”部分,然后将目标串的文本更改为您所需的值。
private static TargetParams _targetParams = new TargetParams { TargetString = "hello world" };
要更改AI编写的程序类型,请更改GetFitnessMethod()内的健身方法。
private static IFitness GetFitnessMethod()
{
return new StringStrictFitness(_ga, _maxIterationCount, _targetParams.TargetString, _appendCode);
}
您可以将其更改为ai.programmer.fitness/concrete项目中的任何类。示例:
return new StringStrictFitness(_ga, _maxIterationCount, _targetParams.TargetString, _appendCode);
return new AddFitness(_ga, _maxIterationCount);
return new SubtractFitness(_ga, _maxIterationCount);
return new ReverseStringFitness(_ga, _maxIterationCount);
return new HelloUserFitness(_ga, _maxIterationCount, _targetString);
要使用子行驶点,您需要启用功能。这将使AI生产程序更快。输入功能加工机的代码,如下:
private static IFunction _functionGenerator = new StringFunction(() => GetFitnessMethod(), _bestStatus, fitnessFunction, OnGeneration, _crossoverRate, _mutationRate, _genomeSize, _targetParams);
将app.config设置为使用brainplus,因此AI可以访问子例程指令:
<appSettings>
<add key="BrainfuckVersion" value="2"/> <!-- 1 = BF Classic, 2 = BrainPlus (BF Extended Type 3, Functions, Faster) -->
</appSettings>
使用子口台时,需要更少的代码。因此,您可以使用较小的基因组来速度。扩展遗传算法设置部分,然后将_基因组更改为较小的值:
private static int _genomeSize = 50;
实验并玩得开心!
Kory Becker http://www.primaryobjects.com/kory-becker
使用人工智能编写自我修改/改进程序
推动自我编程的人工智能的极限
自我编程的人工智能学会使用功能
BF程序员:一种使用遗传算法自主构建简单程序的违反直觉方法
查看 @ github https://github.com/primaryobjects/ai-programmer
版权(C)2018 Kory Becker http://primaryobjects.com/kory-becker