人工智能的初步算法—蚁群算法js版

xiaxin 2006-04-18 01:31:23
对于普通大众来说,“人工生命”、“群集智能”、“仿生机器人”等等可能是一些新鲜名词,他们可能会问,这些新鲜而时髦的科技的内容到底是什么?它们是否代表未来科技发展的方向?它们对人们的生活将会有什么样的影响?人类的未来将是什么样的?

对于计算机相关专业的技术人员来说,也许“细胞自动机”、“遗传算法”、“神经网络”、“蚁群算法”、“计算智能”等名词已经不陌生,然而这些技术之间究竟有什么联系?技术人员在同计算机程序中的 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>
...全文
316 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenfeisddx 2006-04-18
  • 打赏
  • 举报
回复
冒昧说一句,这好像算不上人工智能吧?
人工智能至少也该有一个模糊逻辑的控制单元啊.
kingser 2006-04-18
  • 打赏
  • 举报
回复
唉,目前的代码还没有涉及人工智能吧
说实话和那种漂浮的广告条原理是一样的
期待更深入的代码
loulou_ff 2006-04-18
  • 打赏
  • 举报
回复
mark
有时间就看
是是非非 2006-04-18
  • 打赏
  • 举报
回复
不错~
xiaxin 2006-04-18
  • 打赏
  • 举报
回复
上面的代码不是我写的,看到这种东西。我就很兴奋。所以不免要给别人分享一下。我觉得,做为计算机专业的程序员。不应该埋头苦做一些枯燥无味的编码工作。做一些简单的什么数据调用,查询,修改和删除之类的东西(虽然我是做这个的)。应该多去了解一下那些精典的游戏算法。

  随着计算机软硬件的发展,现今的计算机行业不再像当年那样,只是一台信息处理机了。从事这行,得多想一些跨行业、跨学科的东西,再与计算机相结合。在将来,仿生、人工智能与计算机的结合是具有无限潜力的。软件的趋势是向微型式、嵌入式、智能方向发展。人机结合才是将来的目标重点。了解这方面的算法对将来受益无穷。
全息宇宙 2006-04-18
  • 打赏
  • 举报
回复
不错
s3x4 2006-04-18
  • 打赏
  • 举报
回复
支持一下
yjbnew 2006-04-18
  • 打赏
  • 举报
回复
y
hansonboy 2006-04-18
  • 打赏
  • 举报
回复
dh20156 2006-04-18
  • 打赏
  • 举报
回复
看看先.
Scarroot 2006-04-18
  • 打赏
  • 举报
回复
mark

87,909

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧