一個簡單的程序,使用類原子粒子之間的簡單吸引力或排斥規則來模擬原始人工生命,產生複雜的自組織類生命模式。不包括 GUI 元素,程式碼不到一頁。下面提供了影片教學和演練。
https://youtu.be/0Kx4Y9TVMGg
按此處查看現場演示 (JavaScript):
您不需要精確地使用參數來重現這些模式。獲得有趣模式的最佳方法是先嘗試隨機參數探索,一旦發現有趣的模式,請逐漸嘗試微調。為了避免陷入局部最大值,您可以偶爾進行一些大參數跳躍。這樣,有趣的、不同的模式就會不斷出現。
下載此儲存庫。解壓縮文件,然後轉到 /article_life/bin/ 資料夾,然後按一下 molecular_life.exe
原始碼提供 C++、JavaScript 和 Python 版本。觀看此 YouTube 影片以獲取演練教學:https://youtu.be/0Kx4Y9TVMGg
如果您想為 C++ 程式做出貢獻,核心演算法是前 100 行程式碼:「/article_life/src/ofApp.cpp」。其餘的是 GUI 元件和渲染控件,由 openFrameworks 庫(一個開源且易於使用的圖像渲染庫)提供。
首先,下載此儲存庫,然後從此處下載 openFrameworks 庫:https://openframeworks.cc/。使用openFramework的projectGenerator並將/article_life/資料夾匯入到專案中。
或者,產生一個新的 openFramework 專案並新增 ofxGui。產生專案檔案後,將 /src/ 資料夾替換為此處提供的資料夾。
現在您可以在您的電腦上編譯 C++ 程式碼。
另外,請查看 molecular_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 >
粒子生命模擬、原始湯-進化、康威生命遊戲、元胞自動機、自我組織模式、
這個專案的靈感來自於:Jeffery Ventrella 的 Clusters http://www.ventrella.com/Clusters/。我無法存取 Ventrella 的程式碼,但我猜這個專案與其他粒子生命專案的主要區別在於我沒有實現碰撞檢測,這使得即時模擬數千個粒子成為可能。此外,我還添加了 GUI 控制項來即時更改參數,從而可以輕鬆進行微調和探索,因此,我能夠從一些極其簡單的關係模型中發現一些以前從未見過的模式。這裡的程式碼可能比任何其他人工生命程式碼簡單一個數量級,因為我開始這段程式碼只是作為非程式設計師和一般受眾的教育材料,以證明複雜性可以從簡單中產生。