一个简单的程序,使用类原子粒子之间的简单吸引力或排斥规则来模拟原始人工生命,产生复杂的自组织类生命模式。不包括 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 控件来实时更改参数,从而可以轻松进行微调和探索,因此,我能够从一些极其简单的关系模型中发现一些以前从未见过的模式。这里的代码可能比任何其他人工生命代码简单一个数量级,因为我开始这段代码只是作为非程序员和普通受众的教育材料,以证明复杂性可以从简单中产生。