อ่านบทความฉบับเต็มโดยใช้ปัญญาประดิษฐ์เพื่อเขียนโปรแกรมการปรับเปลี่ยน/ปรับปรุงตัวเอง
อ่านโปรแกรมเมอร์วิจัย AI: การสร้างโปรแกรมซอฟต์แวร์โดยอัตโนมัติโดยใช้อัลกอริทึมทางพันธุกรรม
AI-Programmer เป็นการทดลองที่ใช้ปัญญาประดิษฐ์และอัลกอริทึมทางพันธุกรรมเพื่อสร้างโปรแกรมโดยอัตโนมัติ สร้างโปรแกรมที่ประสบความสำเร็จโดย AI ได้แก่ : Hello World, Hello, Addits, Subtraction, Reversing A String, Fibonnaci ลำดับ, เบียร์ 99 ขวดบนผนังและอีกมากมาย มันฉลาดขึ้น กล่าวโดยย่อคือการใช้อัลกอริทึมทางพันธุกรรม AI ด้วยรหัสดัดแปลงตนเอง
เป็นไปได้ไหมที่คอมพิวเตอร์จะเขียนโปรแกรมของตัวเอง? ต้องการประมวลผลคำหรือไม่? ให้คอมพิวเตอร์สร้างให้คุณ ต้องการเครื่องมือจับภาพหน้าจอหรือไม่? ให้คอมพิวเตอร์สร้างให้คุณ ก้าวไปอีกขั้นและให้คอมพิวเตอร์สร้างโปรแกรมที่ทำให้ชีวิตของคุณง่ายขึ้นซึ่งคุณไม่ได้รู้ด้วยซ้ำว่าคุณต้องการ!
นี่คือแนวคิดเบื้องหลังการทดลอง AI-Programmer เป้าหมายคือการสร้างโปรแกรมคอมพิวเตอร์ที่สามารถเขียนโปรแกรมคอมพิวเตอร์ของตัวเองเพื่อแก้ปัญหาการคำนวณที่เฉพาะเจาะจง ในขณะที่ความสามารถของคอมพิวเตอร์ที่ตัดสินใจว่าโปรแกรมประเภทใดที่จะเขียนอยู่นอกเหนือวิธีการในปัจจุบันของเราเรายังสามารถมีคอมพิวเตอร์สร้างโปรแกรมเพื่อแก้ปัญหาที่เฉพาะเจาะจงมากเช่นส่งข้อความ "Hello World" โปรแกรมเมอร์ AI ใช้ภาษาการเขียนโปรแกรมลึกลับสำหรับการสร้างโปรแกรมซอฟต์แวร์
ภาษาการเขียนโปรแกรมพื้นฐานประกอบด้วยคำแนะนำเพียง 8 คำแนะนำในขณะที่ทัวริงสมบูรณ์ ในทางทฤษฎีมันมีความสามารถในการแก้ปัญหาการคำนวณใด ๆ สิ่งนี้ทำให้ง่ายต่อการพัฒนาล่ามสามารถใช้งานโปรแกรม Ai-Generated ในสภาพแวดล้อมที่จำลองได้ ในลักษณะนี้แต่ละโปรแกรมที่สร้างขึ้นอาจถูกดำเนินการและประสิทธิภาพการทำงานเป็นคะแนนการออกกำลังกาย เนื่องจาก 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 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 ประสบความสำเร็จในการเขียนโปรแกรมเพื่อส่งออก "สวัสดี" หลังจาก 5,700 รุ่นในเวลาประมาณ 1 นาที มันผลิตรหัสต่อไปนี้:
+[+++++-+>++>++-++++++<<]>++.[+.]-.,-#>>]<]
ในขณะที่รหัสข้างต้นมีข้อผิดพลาดในการแยกวิเคราะห์เช่นวงเล็บที่ไม่จับคู่การจำลองล่ามของเราคำนวณผลลัพธ์จนกระทั่งโปรแกรมล้มเหลวดังนั้นในกรณีข้างต้นข้อผิดพลาดทางไวยากรณ์ (ซึ่งต่อมาในรหัสหลังจากพบโซลูชัน ) ไม่ส่งผลกระทบต่อความฟิต
คุณสามารถลองวางรหัสด้านบนลงในล่ามออนไลน์ คลิก "เริ่มดีบักเกอร์" ไม่สนใจคำเตือนจากนั้นคลิกเรียกใช้เพื่อเบรกพอยต์ สังเกตเอาต์พุต
หากเราตัดรหัสส่วนเกินออกเราจะเห็นรหัสวากยสัมพันธ์ต่อไปนี้:
+[+++++-+>++>++-++++++<<]>++.[+.]
AI ประสบความสำเร็จในการเขียนโปรแกรมเพื่อส่งออก "สวัสดี" หลังจาก 252,0000 รุ่นในเวลาประมาณ 29 นาที มันผลิตรหัสต่อไปนี้:
+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+][[[.+.,,+].-
ในระหว่างกระบวนการสร้าง AI เข้ามาใกล้กับการแก้ปัญหา แต่ตัวอักษรสองตัวถูกผูกไว้ซึ่งกันและกันภายในวง AI สามารถเอาชนะสิ่งนี้ได้โดยการสร้างวงในภายในที่มีปัญหาซึ่งประสบความสำเร็จในการส่งออกอักขระที่ถูกต้องและการประมวลผลอย่างต่อเนื่อง
ในอีกตัวอย่างหนึ่ง AI ได้เขียนโปรแกรมเพื่อส่งออก "สวัสดี!" สำเร็จ หลังจาก 1,219,400 รุ่นในเวลาประมาณ 2 ชั่วโมง 7 นาที มันผลิตรหัสต่อไปนี้:
>-----------<++[[++>++<+][]>-.+[+++++++++++++++++++++++++++++><+++.<><-->>>+].]
AI ประสบความสำเร็จในการเขียนโปรแกรมเพื่อส่งออก "ฉันรักมนุษย์ทุกคน" หลังจาก 6,057,200 รุ่นในเวลาประมาณ 10 ชั่วโมง มันผลิตรหัสต่อไปนี้:
+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.--------.------------.+++++++++++++.+++++.
โปรแกรมที่ซับซ้อนมากขึ้นน่าจะถูกสร้างขึ้นในขณะที่ใช้พีซีที่เร็วขึ้น ขั้นตอนต่อไปรวมถึงการพยายามยอมรับการป้อนข้อมูลของผู้ใช้และผลลัพธ์กระบวนการ
โดยค่าเริ่มต้นรหัสจะถูกกำหนดค่าให้ใช้ชุดคำสั่งคลาสสิกและเพื่อเขียนโปรแกรมเพื่อส่งออกสตริง หากต้องการเปลี่ยนสตริงที่สร้างขึ้นเพียงขยายส่วน "ตัวแปรส่วนตัว" และเปลี่ยนข้อความสำหรับ TargetString เป็นค่าที่คุณต้องการ
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 ผลิตโปรแกรมได้เร็วขึ้นมาก ไม่เกี่ยวกับรหัสสำหรับ functionGenerator ดังต่อไปนี้:
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>
เมื่อใช้รอบนอกต้องใช้รหัสน้อยกว่า ดังนั้นคุณสามารถใช้จีโนมขนาดเล็กกว่าสำหรับความเร็ว ขยายส่วนการตั้งค่าอัลกอริทึมทางพันธุกรรมและเปลี่ยน _genomesize เป็นค่าที่น้อยกว่า:
private static int _genomeSize = 50;
ทดลองและสนุก!
Kory Becker http://www.primaryobjects.com/kory-becker
การใช้ปัญญาประดิษฐ์เพื่อเขียนโปรแกรมปรับเปลี่ยน/ปรับปรุงตัวเอง
ผลักดันขีด จำกัด ของการเขียนโปรแกรมด้วยตนเองปัญญาประดิษฐ์
การเขียนโปรแกรมด้วยตนเองปัญญาประดิษฐ์เรียนรู้ที่จะใช้ฟังก์ชั่น
BF-Programmer: วิธีการที่ใช้งานง่ายในการสร้างโปรแกรมง่ายๆโดยใช้อัลกอริทึมทางพันธุกรรม
ดู @ github https://github.com/primaryobjects/ai-programmer
ลิขสิทธิ์ (c) 2018 Kory Becker http://primaryobjects.com/kory-becker