| 对于普通大众来说,“人工生命”、“群集智能”、“仿生机器人”等等可能是一些新鲜名词,他们可能会问,这些新鲜而时髦的科技的内容到底是什么?它们是否代表未来科技发展的方向?它们对人们的生活将会有什么样的影响?人类的未来将是什么样的?
对于计算机相关专业的技术人员来说,也许“细胞自动机”、“遗传算法”、“神经网络”、“蚁群算法”、“计算智能”等名词已经不陌生,然而这些技术之间究 竟有什么联系?技术人员在同计算机程序中的 Bug 无休止地作斗争的同时,能不能考虑让计算机程序自发地变聪明?计算机程序可以自发地修正自己的错误吗?
对于生物专业的人士来说,他们可能更加关心自然生物 DNA 的合成、培育和生长。然而究竟什么是“活性”的本质?生命是一种物质还是信息?如何不进行昂贵而笨重的生物学实验就能验证研究人员的某个理论?
对于社会科学家和管理者来说,他们可能很关心如何让人们自发地合作,如何让一个组织更具活力。我们将会看到,自然界中的蚂蚁仅仅遵循简单的规则就能达到整 体的合作从而有效、快速地搬运食物。那么,我们能否像蚂蚁那样每个人仅仅根据简单的规则完成简单的决策就有可能在人类群体中涌现出意想不到的集体效应?
这些问题表面上看,差异很大,但令人高兴的是,今天它们都可以在一门新兴科学——计算机科学和生物学交叉的人工生命中找到答案。人工生命诞生于 20 世纪末。起初,从事人工生命研究生学者主要是一些计算机科学家,他们向大自然学习,把生物的灵活适应本领移植到计算机中,让程序变得聪明起来。“遗传算 法”、“神经网络”、“蚁群算法”等等正是计算机科学家向生物界学习的成果。另外,计算机也提供了天然的生物系统的模拟场所,这让生物学家们在电脑中就可 以进行在平常情况下难以进行或无法进行的一些实验。
然而,人工生命不仅仅关心一些具体的技术问题,它更是一种崭新的自下而上的科学思维方法。事实上,在不经意间,科学界已经发生了一次全新的方法论变革:这 就是用综合集成的方法代替还原分解的方法。我们仅掌握原子世界的规律并不能完全理解生命现象。纯粹的还原论已经走到了尽头,而通过计算机的帮助人们就可以 把已经被分解还原的单个规律重新综合组织起来。我们不仅关心每个计算单元的属性,而且关心这些单元组合而成的整体动态。单个单元也许是非活性的,但单元的 组合可能涌现出“活性”。这就是人工生命的方法。
人工生命学科还很年轻,在很多方面仍然不够成熟,而且很多学者对这门新学科的发展也各执看法,甚至这门学科的研究范围都不是很确定。我们所提到的人工生命 在技术上主要指在数字世界中创造的虚拟版本的人工生命和在现实世界中创造的机器人版本的人工生命;在方法论上则主要强调自下而上的涌现方法和自发的适应进 化方法。因此,所述的各种人工生命模型的基本思想是尽量减少人为的外在干预,让系统自发的发展、进化。
人工生命自一开始诞生就是一门理论和实际紧密结合的学科,它一方面需要人们运用抽象的理性思维看待生命,另一方面又特别强调计算机模拟实验。本着这种思 路,每一个人工生命的实例都尽量写出其中的核心代码。因此熟悉计算机编程的人们可以从这些叙述中直接在自己的计算机上实现各种活灵活现的人工生命模型。
蚁群算法
还没有完成,现贴个初步的结果上来,大家帮忙一起研究下了,谢谢! 目前能实现随意控制蚂蚁的轨迹长度(Path)、数量(Unit)、速度(V)、角度(R)、加速度(dv,dr)。 Kr和Kv是常数,打算将来改成数组,作为用来控制蚂蚁活跃程度的基因。 但是总的div数量受机器速度限制,数量多了会很慢,我的机器最多只能跑得动3000只蚂蚁(当然轨迹要减小到1),已经把运动延时设成和蚂蚁数量相关,希望能有高手帮忙优化下。
将下面的代码保存为.htm 文件就可以运行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><HEAD> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>蚁群算法js版</title> <style> .point{ position:absolute; background-color:#000000; overflow:hidden; width:2px; height:2px; } </style> <script type="text/JavaScript"> //============================ //系统参数初始化 //---------------------------- //生命体数量与轨迹长度 Unit=10;Path=10; //生命体速度上下限 v0=2;vM=10; //生命体加速度变化范围 Kr=0.1;Kv=0.1*(vM-v0); //生命体运动范围
x0=0;xM=document.documentElement.clientWidth; y0=0;yM=document.documentElement.clientHeight; //============================ var r=new Array(); var v=new Array(); var dr=new Array(); var dv=new Array(); var x=new Array(); var y=new Array(); var life=new Array();
//单击暂停 function document.onclick(){ if(window.status!='playing'){ window.status='playing'; init(0); }else{ window.status=Unit; } } //边界随窗口大小调整 function window.onresize(){ xM=document.documentElement.clientWidth; yM=document.documentElement.clientHeight; } //初始化函数 function init(i){ if(window.status=='playing'&&i<Unit){ if(!life[i]){ obj=life[i]=document.createElement("div"); obj.className="point"; obj.style.left=x[i]=(x0+xM)/2; obj.style.top=y[i]=(y0+yM)/2; document.body.appendChild(obj); r[i]=Math.random(); v[i]=1/Math.random(); dr[i]=Kr*Math.random(); dv[i]=Kv*Math.random(); } Move(i); setTimeout('init('+(i+1)+')',i); } } //运动函数 Total=Unit*Path; Pi=Math.PI; function Move(i){ if(window.status=='playing'){ k=i%Unit; X=x[k]; Y=y[k]; R=r[k]; V=v[k]; if(!life[i]){ obj=life[i]=document.createElement("div"); obj.className="point"; obj.style.left=X; obj.style.top=Y; document.body.appendChild(obj); } obj=life[i]; R+=dr[k]*(2*Math.random()-1); V+=dv[k]*(2*Math.random()-1); v[k]=V=(V<v0)?v0:((V<vM)?V:vM); X+=Math.sin(2*Pi*R)*V; Y+=Math.cos(2*Pi*R)*V; //碰撞边界反弹 R=(X<x0||X>xM)?-R:R; R=(Y<y0||Y>yM)?0.5-R:R; r[k]=R>1?R-1:R<0?R+1:R; X=x[k]+=Math.sin(2*Pi*R)*V; Y=y[k]+=Math.cos(2*Pi*R)*V; /*================================*/ //溢出边界重生(类似流星效果) if(X<x0||X>xM||Y<y0||Y>yM){ X=x[k]=(x0+xM)/2; Y=y[k]=(y0+yM)/2; }else{ x[k]=X; y[k]=Y; } /*---------------------------------- /*================================*/ obj.style.left=X; obj.style.top=Y; i+=Unit; i=(i<Total)?i:i-Total; setTimeout('Move('+i+')',Unit); } } //根据浏览器自动加载动画 switch(navigator.appName.toLowerCase()){ case "netscape": window.addEventListener("load",document.onclick,false); break; case "microsoft internet explorer": default: window.attachEvent("onload",document.onclick); break; } </script> </head> <body scroll="no"> </body> </html>
转自:http://hi.baidu.com/saden/blog/item/e6873bdbe9344f64d1164e73.html |