اقرأ المقال الكامل باستخدام الذكاء الاصطناعي لكتابة البرامج التعديل/تحسين الذات
اقرأ مبرمج ورقة البحث AI: إنشاء برامج برامج بشكل مستقل باستخدام الخوارزميات الجينية.
AI-Programmer هي تجربة مع استخدام الذكاء الاصطناعي والخوارزميات الجينية لإنشاء البرامج تلقائيًا. تشمل البرامج التي تم إنشاؤها بنجاح من قبل الذكاء الاصطناعي: Hello World ، Hello ، إضافة ، الطرح ، عكس سلسلة ، تسلسل Fibonnaci ، 99 زجاجة من البيرة على الحائط ، وأكثر من ذلك. إنه يزداد ذكاءً. باختصار ، إنه تطبيق خوارزمية وراثية منظمة العفو الدولية مع رمز تعديل الذات.
هل من الممكن لجهاز الكمبيوتر أن يكتب برامجه الخاصة؟ هل تحتاج إلى معالج كلمات؟ دع الكمبيوتر ينشئ واحدة لك. هل تحتاج إلى أداة التقاط الشاشة؟ دع الكمبيوتر ينشئ واحدة لك. خذها خطوة إلى الأمام ، ودع الكمبيوتر ينشئ برامج تبسيط حياتك ، حتى أنك لم تعرف أنك بحاجة!
هذه هي الفكرة وراء تجربة AI-Programmer. الهدف من ذلك هو إنشاء برنامج كمبيوتر في النهاية يمكنه كتابة برامج الكمبيوتر الخاصة به لحل مشاكل حسابية محددة. على الرغم من أن قدرة الكمبيوتر التي تقرر نوع البرنامج الذي يجب كتابته يتجاوز وسائلنا الحالية ، لا يزال بإمكاننا الحصول على برامج إنشاء كمبيوتر لحل مهام محددة للغاية ، مثل إخراج النص "Hello World". يستخدم مبرمج الذكاء الاصطناعى لغة برمجة باطنية لإنشاء برامج.
تتكون لغة البرمجة الأساسية من 8 تعليمات فقط ، في حين أن Turing كاملة. من الناحية النظرية ، فإنه قادر على حل أي مشكلة حسابية. هذا يجعل من السهل تطوير مترجم ، قادر على تشغيل البرامج التي تم إنشاؤها في الذكاء الاصطناعى في بيئة محاكاة. وبهذه الطريقة ، قد يتم تنفيذ كل برنامج تم إنشاؤه وتصنيف أدائه كنتيجة للياقة البدنية. نظرًا لأن الذكاء الاصطناعى يستخدم لغة برمجة كاملة ، فإن الذكاء الاصطناعى نفسه ، قادر أيضًا على حل أي مشكلة حسابية. ومع ذلك ، في هذه التجربة ، ستركز الذكاء الاصطناعى على إخراج سلسلة بسيطة إلى وحدة التحكم.
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.5 جيجا هرتز.
كتب الذكاء الاصطناعى بنجاح برنامجًا لإخراج "مرحبًا" بعد 5700 جيل في حوالي دقيقة واحدة. أنتجت الرمز التالي:
+[+++++-+>++>++-++++++<<]>++.[+.]-.,-#>>]<]
على الرغم من أن الكود أعلاه يحتوي على أخطاء التحليل ، مثل قوسين غير متطابق ، فإن مترجم المحاكاة الخاص بنا يحسب النتيجة حتى فشل البرنامج ، لذلك في الحالة أعلاه ، خطأ بناء الجملة (الذي يكون لاحقًا في الكود ، بعد العثور على الحل ) لا يؤثر على اللياقة.
يمكنك محاولة لصق الرمز أعلاه في مترجم عبر الإنترنت. انقر فوق "ابدأ Debugger" ، وتجاهل التحذيرات ، ثم انقر فوق Run to Breakpoint. لاحظ الإخراج.
إذا قمنا بإزالة الكود الزائد ، فإننا نرى رمزًا جديدًا من الناحية النحوية:
+[+++++-+>++>++-++++++<<]>++.[+.]
كتب الذكاء الاصطناعى بنجاح برنامجًا لإخراج "Hello" بعد 252،0000 جيل في حوالي 29 دقيقة. أنتجت الرمز التالي:
+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].+]],]<-+<+,.+>[[.,],+<.+-<,--+.]],+][[[.+.,,+].-
خلال عملية التوليد ، اقترب الذكاء الاصطناعى من الحل ، ولكن تم ربط خطابين ببعضهما البعض ، داخل حلقة. تمكنت الذكاء الاصطناعى من التغلب على هذا من خلال إنشاء حلقة داخلية ، ضمن الإشكالية ، والتي نجحت في إخراج الشخصية الصحيحة ، والمعالجة المستمرة.
في مثال آخر ، كتب الذكاء الاصطناعى بنجاح برنامجًا لإخراج "مرحبًا!" بعد 1،219،400 جيل في حوالي ساعتين و 7 دقائق. أنتجت الرمز التالي:
>-----------<++[[++>++<+][]>-.+[+++++++++++++++++++++++++++++><+++.<><-->>>+].]
كتب الذكاء الاصطناعى بنجاح برنامجًا لإخراج "أنا أحب جميع البشر" بعد 6،057200 جيل في حوالي 10 ساعات. أنتجت الرمز التالي:
+[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++.+++.+++++++.-----------------.--<.>--.+++++++++++..---<.>-.+++++++++++++.--------.------------.+++++++++++++.+++++.
من المحتمل أن يتم إنشاء برامج أكثر تعقيدًا أثناء استخدام أجهزة كمبيوتر أسرع. تتضمن الخطوات التالية محاولة قبول نتائج إدخال المستخدم وعمليات المعالجة.
بشكل افتراضي ، تم تكوين الرمز لاستخدام مجموعة التعليمات الكلاسيكية وكتابة برنامج لإخراج سلسلة. لتغيير السلسلة التي يتم إنشاؤها ، ما عليك سوى توسيع قسم "المتغيرات الخاصة" وتغيير النص لـ TargetString إلى القيمة المطلوبة.
private static TargetParams _targetParams = new TargetParams { TargetString = "hello world" };
لتغيير نوع البرنامج الذي يكتبه الذكاء الاصطناعي ، تغيير طريقة اللياقة داخل 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);
لاستخدام الرواد الفرعي ، ستحتاج إلى تمكين الوظائف. هذا سيسمح للمنظمة العفوبية بمنتج برامج أسرع بكثير. Uncomment هو رمز المولد الدالة ، على النحو التالي:
private static IFunction _functionGenerator = new StringFunction(() => GetFitnessMethod(), _bestStatus, fitnessFunction, OnGeneration, _crossoverRate, _mutationRate, _genomeSize, _targetParams);
قم بتعيين App.Config لاستخدام BrainPlus ، وبالتالي فإن الذكاء الاصطناعى يمكنه الوصول إلى تعليمات الروتين الفرعي:
<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: نهج غير بديهي لبناء برامج مبسطة بشكل مستقل باستخدام الخوارزميات الوراثية
عرض @ github https://github.com/primaryobjects/ai-programmer
حقوق الطبع والنشر (C) 2018 Kory Becker http://primaryobjects.com/kory-becker