
في هذه المقالة ، سأشارك تجربة نمو الذكاء الاصطناعي البسيط (AI) باستخدام خوارزمية جينية ، وسأتحدث أيضًا عن الحد الأدنى من الأوامر المطلوبة لتشكيل أي سلوك.
كانت نتيجة العمل هي أن الذكاء الاصطناعي ، دون معرفة القواعد ، أتقن لعبة تيك تاك تو بشكل مستقل ووجد نقاط ضعف الروبوتات التي لعبت ضدها. لكنني بدأت بمهمة أبسط.
مجموعة التعليمات
بدأ كل شيء بإعداد مجموعة من الأوامر التي يمكن أن يكون لدى الذكاء الاصطناعي. تحتوي اللغات عالية المستوى على المئات من عوامل التشغيل المختلفة. لتسليط الضوء على الحد الأدنى الضروري ، قررت أن أنتقل إلى لغة المجمع. ومع ذلك ، اتضح أنه يحتوي على العديد من الأوامر.
كنت بحاجة إلى الذكاء الاصطناعي لقراءة البيانات وإخراجها ، والعمل مع الذاكرة ، وإجراء العمليات الحسابية والعمليات المنطقية ، وإجراء التحولات والحلقات. لقد صادفت لغة Brainfuck ، التي تحتوي على 8 أوامر فقط ويمكنها إجراء أي حسابات (أي أن Turing مكتمل). من حيث المبدأ ، إنها مناسبة للبرمجة الجينية ، لكنني ذهبت أبعد من ذلك.
تساءلت: ما هو الحد الأدنى من الأوامر اللازمة لتنفيذ أي خوارزمية؟ كما اتضح - واحد!
يحتوي معالج URISC على أمر واحد فقط: طرح وتخطي التعليمات التالية إذا كان المطرح أكثر من الأمر الذي تم إنقاصه. هذا يكفي لبناء أي خوارزمية.
ذهب Oleg Mazonka إلى أبعد من ذلك ، فقد طور فريق
BitBitJump وأثبت أنه مكتمل وفقًا لـ Turing. يحتوي الأمر على ثلاثة عناوين ، وينسخ بتة من العنوان الأول إلى عنوان الذاكرة الثاني وينقل التحكم إلى العنوان الثالث.
بعد اقتراض أفكار أوليغ ، لتبسيط العمل ، قمت بتطوير فريق SumIfJump. يحتوي الأمر على أربعة معاملات: A و B و C و D ويقوم بتنفيذ ما يلي: إضافة بيانات من الخلية إلى العنوان A إلى العنوان B ، إذا كانت القيمة أكبر من القيمة المحددة * ، فإنها تذهب إلى العنوان C ، وإلا فإنها تذهب إلى العنوان D.
ملاحظة* في هذه الحالة ، تم استخدام 128 - نصف طول الجينوم.
عندما يصل المعامل A إلى خلية الذاكرة N0 ، يتم إدخال البيانات ، وعندما تنتقل إلى الخلية N1 ، ثم الإخراج.
أدناه هو رمز SumIfJump على FreePascal (نظير حر لدلفي).
procedure RunProg(s: TData); var a, b, c, d: TData; begin Inc(NStep); if NStep > MaxStep then begin ProgResult := 'MaxStep'; Exit; end; a := s; b := s + 1; c := s + 2; d := s + 3; a := Prog[a]; b := Prog[b]; c := Prog[c]; d := Prog[d]; if a = 0 then begin ProgResult := 'Input'; Exit; end; if a = 1 then begin ProgResult := 'Output'; Exit; end; Prog[b] := Prog[b] + Prog[a]; if Prog[b] < ProgLength div 2 then RunProg(c) else RunProg(d); end;
يطبق SumIfJump كود التعديل الذاتي. يمكنه تنفيذ أي خوارزميات متوفرة بلغة البرمجة المعتادة. الكود سهل التعديل ويقاوم أي تلاعب.
مهمة بسيطة
لذا ، فإن الذكاء الاصطناعي لدينا لديه فريق واحد فقط. في حين أن لعبة tic-tac-toe هي لعبة صعبة للغاية بالنسبة له ، فقد بدأت بلعبة أبسط.

يعطي البوت رقمًا عشوائيًا ، ويجب على منظمة العفو الدولية قراءة البيانات وإعطاء إجابة. إذا كان الرقم أكبر من المتوسط (من نطاق الأرقام العشوائية) ، فيجب أن يعطي الذكاء الاصطناعي رقمًا أقل من المتوسط والعكس صحيح.
يتكون الجينوم الخاص بالذكاء الاصطناعي من 256 خلية بقيم من 0 إلى 255. كل قيمة هي ذاكرة ورمز وعنوان. عدد خطوات تنفيذ التعليمات البرمجية يقتصر على 256. يتم قراءة المعاملات واحدة تلو الأخرى.
في البداية ، يتكون الجينوم من مجموعة من الأرقام العشوائية ، لذلك لا يعرف الذكاء الاصطناعي ما يحتاجه للعب. علاوة على ذلك ، لا يعرف أنه بحاجة إلى إدخال البيانات وإخراجها بالتسلسل ، رداً على البوت.
السكان والاختيار
يتكون السكان الأول من 256 AIs تبدأ اللعب مع الروبوت. إذا قام الذكاء الاصطناعي بتنفيذ الإجراءات الصحيحة ، على سبيل المثال ، يطلب إدخال البيانات ، ثم يعرض شيئًا ، ثم يتلقى الذكاء الاصطناعي نقاطًا. الإجراءات الأكثر صحة ، والمزيد من النقاط.
تمنح الـ 16 منظمة AI التي سجلت أكبر عدد من النقاط 15 ذرية وتستمر في المشاركة في اللعبة. السليل متحولة. تحدث الطفرة عن طريق استبدال خلية عشوائية واحدة في النسخة الأصلية بقيمة عشوائية.

إذا لم تسجل منظمة العفو الدولية نقاطًا في المجموعة الأولى ، فسيتم تكوين المجموعة السكانية التالية. وهكذا حتى تبدأ بعض الذكاء الاصطناعي في تنفيذ الإجراءات الصحيحة وإعطاء النسل "الصحيح".
التطور
ن | معالم |
---|
1 | الذكاء الاصطناعي لا يفعل شيئاً. يأخذ البرنامج 256 خطوة وينتهي. |
2 | بدأ في طلب البيانات. |
3 | بدأ في طلب البيانات وإخراج شيء ما. تسلسل الطلبات والاستجابات فوضوي. |
4 | يحدث إدخال البيانات وإخراجها بالتتابع ، وأحيانًا تحدث الأخطاء. في نصف الحالات ، يعطي الذكاء الاصطناعي الإجابة الصحيحة. |
5 | يعطي إجابات صحيحة بانتظام ، ولكن في بعض الأحيان تحدث أخطاء. |
6 | أعطت الإجابة الصحيحة في 30 ألف تكرار. تم تحميل التحديد. |
بين الأحداث الهامة ، مرت آلاف الأجيال. تم إطلاق البرنامج في عدة مواضيع على Core i7. استغرقت الحسابات حوالي 15 دقيقة.

نقاط مثيرة للاهتمام
- عندما ارتكب "زعيم" منظمة العفو الدولية خطأً عشوائيًا ولم يسجل نقاطًا كافية ، بدأ السكان في الانحطاط ، لأنه نسل يتكون من الآباء "الثانوية".
- حدث ذلك أنه في التيار مع الغرباء الذين كانوا يميزون الوقت ، حدثت طفرة ناجحة ، مما أدى إلى زيادة متفجرة في النقاط المتراكمة. بعد ذلك ، أصبح هذا التدفق هو القائد.
- في بعض الأحيان لفترة طويلة لم تحدث طفرات ناجحة ، وحتى 500 ألف جيل لم تكن كافية لإكمال الاختيار.
الخلاصة
في الختام ، فعلت الشيء نفسه مع لعبة تيك تاك تو. تم استخدام حجم الجينوم كما في الحالة الأولى. تم زيادة عدد الخطوات إلى 1024 ، وحجم السكان إلى 64 (لحساب أسرع). استغرق الحساب وقتًا أطول قليلاً. حدث كل شيء وفقًا لنفس السيناريو.
في البداية ، لعبت منظمة العفو الدولية ضد "العشوائي". اتصلت بالبوت الذي يمشي بشكل عشوائي. سرعان ما بدأت منظمة العفو الدولية في ضربه ، ملئًا خطًا. علاوة على ذلك ، قمت بتعقيد المهمة بإضافة سبب صغير إلى أداة التوزيع العشوائي: لاحتلال الخط ، إن أمكن ، أو للدفاع. ومع ذلك ، في هذه الحالة ، وجدت منظمة العفو الدولية نقاط ضعف الروبوت وبدأت في ضربه. ربما تكون قصة هذا الموضوع موضوعًا لمقال منفصل.
طلب مني الابن أن أكتب برنامجًا بحيث يلعب الذكاء الاصطناعي فيما بينهم ، وليس مع الروبوت. كانت هناك أفكار للقيام بنفس الشيء للعب لعبة الداما أو الذهاب ، ومع ذلك ، لم يكن لدي بالفعل ما يكفي من الوقت.
الطريقة الوحيدة التي استخدمتها للحصول على أفراد جدد كانت طفرة. يمكنك أيضًا استخدام التبادل والانقلاب. ربما تسرع هذه الأساليب في الحصول على النتيجة المرجوة.
في النهاية ، ولدت الفكرة: لإعطاء الذكاء الاصطناعي القدرة على إدارة جميع العمليات على جهاز الكمبيوتر والقتال من أجل موارد الكمبيوتر. قم بتوصيل جهاز كمبيوتر بالإنترنت ، واستخدم مجموعة مزارع بيتكوين القديمة كقوة حوسبة ...
كما ذكر ، أثناء إجراء تجربة مماثلة ، المدون
ميخائيل تساركوف :
ربما سيسيطرون على العالم ، ولكن ماذا لو؟
المراجع
- الخوارزميات الجينية
- نسخة بت - أبسط آلة حوسبة / أوليغ Mazonka
- URISC - ويكيبيديا
- تورينج الاكتمال - ويكيبيديا