برنامج بسيط لمحاكاة الحياة الاصطناعية البدائية باستخدام قواعد بسيطة للتجاذب أو التنافر بين الجسيمات الشبيهة بالذرة، مما يؤدي إلى إنتاج أنماط معقدة تشبه الحياة ذاتية التنظيم. باستثناء عناصر واجهة المستخدم الرسومية، يكون الرمز أقل من صفحة. يتوفر الفيديو التعليمي والإرشادات التفصيلية أدناه.
https://youtu.be/0Kx4Y9TVMGg
انقر هنا للحصول على عرض توضيحي مباشر (جافا سكريبت):
لا يتعين عليك أن تكون دقيقًا فيما يتعلق بالمعلمات لإعادة إنتاج هذه الأنماط. أفضل طريقة للحصول على أنماط مثيرة للاهتمام هي تجربة استكشاف المعلمات العشوائية أولاً، وبمجرد العثور على نمط مثير للاهتمام، حاول ضبطه تدريجيًا. لتجنب التعثر عند الحد الأقصى المحلي، يمكنك إجراء بعض القفزات الكبيرة في المعلمات من حين لآخر. بهذه الطريقة، يجب أن تستمر الأنماط المثيرة للاهتمام والمختلفة في الظهور.
قم بتنزيل هذا الريبو. قم بفك ضغط الملف ثم انتقل إلى المجلد /particle_life/bin/ وانقر على Particle_life.exe
الكود المصدري متاح في C++، وJavaScript، وPython. شاهد مقطع الفيديو هذا على YouTube للحصول على برنامج تعليمي تفصيلي: https://youtu.be/0Kx4Y9TVMGg
إذا كنت ترغب في المساهمة في برنامج C++، فإن الخوارزمية الأساسية هي أول 100 سطر من التعليمات البرمجية في: "/particle_life/src/ofApp.cpp". والباقي عبارة عن مكونات واجهة المستخدم الرسومية وعناصر تحكم العرض التي توفرها مكتبة openFrameworks، وهي مكتبة عرض صور مفتوحة المصدر وسهلة الاستخدام.
للبدء، قم بتنزيل هذا المستودع ثم قم بتنزيل مكتبة openFrameworks من هنا: https://openframeworks.cc/. استخدم projectGenerator الخاص بـ openFramework وقم باستيراد مجلد /particle_life/ إلى المشروع.
وبدلاً من ذلك، قم بإنشاء مشروع openFramework جديد وأضف ofxGui. بمجرد إنشاء ملفات المشروع، استبدل المجلد /src/ بالمجلد المتوفر هنا.
يمكنك الآن تجميع كود C++ على جهازك.
انظر أيضًا إلى ملف Particle_life.html للحصول على نسخة أكثر تحسينًا - شكرًا لأولئك الذين ساهموا.
< canvas id =" life " width =" 500 " height =" 500 " > </ canvas >
< script >
//Hunar Ahmad @ brainxyz
m = document . getElementById ( "life" ) . getContext ( "2d" ) ;
draw = ( x , y , c , s ) => {
m . fillStyle = c ;
m . fillRect ( x , y , s , s ) ;
} ;
atoms = [ ] ;
atom = ( x , y , c ) => {
return { x : x , y : y , vx : 0 , vy : 0 , color : c } ;
} ;
random = ( ) => {
return Math . random ( ) * 400 + 50 ;
} ;
create = ( number , color ) => {
group = [ ] ;
for ( let i = 0 ; i < number ; i ++ ) {
group . push ( atom ( random ( ) , random ( ) , color ) ) ;
atoms . push ( group [ i ] ) ;
}
return group ;
} ;
rule = ( atoms1 , atoms2 , g ) => {
for ( let i = 0 ; i < atoms1 . length ; i ++ ) {
fx = 0 ;
fy = 0 ;
for ( let j = 0 ; j < atoms2 . length ; j ++ ) {
a = atoms1 [ i ] ;
b = atoms2 [ j ] ;
dx = a . x - b . x ;
dy = a . y - b . y ;
d = Math . sqrt ( dx * dx + dy * dy ) ;
if ( d > 0 && d < 80 ) {
F = ( g * 1 ) / d ;
fx += F * dx ;
fy += F * dy ;
}
}
a . vx = ( a . vx + fx ) * 0.5 ;
a . vy = ( a . vy + fy ) * 0.5 ;
a . x += a . vx ;
a . y += a . vy ;
if ( a . x <= 0 || a . x >= 500 ) { a . vx *= - 1 ; }
if ( a . y <= 0 || a . y >= 500 ) { a . vy *= - 1 ; }
}
} ;
yellow = create ( 200 , "yellow" ) ;
red = create ( 200 , "red" ) ;
green = create ( 200 , "green" ) ;
update = ( ) => {
rule ( green , green , - 0.32 ) ;
rule ( green , red , - 0.17 ) ;
rule ( green , yellow , 0.34 ) ;
rule ( red , red , - 0.1 ) ;
rule ( red , green , - 0.34 ) ;
rule ( yellow , yellow , 0.15 ) ;
rule ( yellow , green , - 0.2 ) ;
m . clearRect ( 0 , 0 , 500 , 500 ) ;
draw ( 0 , 0 , "black" , 500 ) ;
for ( i = 0 ; i < atoms . length ; i ++ ) {
draw ( atoms [ i ] . x , atoms [ i ] . y , atoms [ i ] . color , 5 ) ;
}
requestAnimationFrame ( update ) ;
} ;
update ( ) ;
</ script >
محاكاة حياة الجسيمات، الحساء البدائي – التطور، لعبة كونواي للحياة، الأوتوماتيا الخلوية، أنماط التنظيم الذاتي،
هذا المشروع مستوحى من: مجموعات جيفري فينتريلا http://www.ventrella.com/Clusters/. ليس لدي إمكانية الوصول إلى كود Ventrella ولكن أعتقد أن الاختلاف الرئيسي لهذا المشروع عن مشاريع حياة الجسيمات الأخرى هو أنني لم أقم بتنفيذ اكتشاف الاصطدام وهذا جعل محاكاة آلاف الجسيمات ممكنة في الوقت الفعلي. أضفت أيضًا عناصر تحكم في واجهة المستخدم الرسومية لتغيير المعلمات في الوقت الفعلي مما يتيح سهولة الضبط والاستكشاف، وبالتالي، تمكنت من العثور على بعض الأنماط التي لم يسبق لها مثيل والتي تظهر في بعض نماذج العلاقات البسيطة للغاية. من المحتمل أن يكون الكود هنا أبسط من أي رموز أخرى للحياة الاصطناعية لأنني بدأت هذا الكود فقط كمواد تعليمية لغير المبرمجين والجمهور العام لإثبات أن التعقيد يمكن أن ينشأ من البساطة.