使用人工智能閱讀完整的文章來編寫自我修改/改進程序
閱讀研究論文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