Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
果圖
各位朋友大家好,
今天給大家?guī)淼氖?canvas粒子噴射特效源碼!
有想要文件版源碼的可以私聊小編哦!
廢話不多說,上源碼
/*
Copyright (c) 2014 dissimulate at codepen
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
window.requestAnimFrame=
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
var canvas=document.getElementById('c');
var ctx=canvas.getContext('2d');
canvas.width=window.innerWidth;
canvas.height=window.innerHeight;
var settings={
'basic': {
'emission_rate': 100,
'min_life': 2,
'life_range': 2,
'min_angle': 75,
'angle_range': 30,
'min_speed': 80,
'speed_range': 60,
'min_size': 2,
'size_range': 4,
'start_colours': [
[130, 196, 245, 0.8],
[69, 152, 212, 0.8]
],
'end_colours': [
[130, 196, 245, 0],
[69, 152, 212, 0]
],
'gravity': {
x: 0,
y: 80
}
}
};
var Particle=function(x, y, angle, speed, life, size, start_colour, colour_step) {
/* the particle's position */
this.pos={
x: x || 0,
y: y || 0
};
/* set specified or default values */
this.speed=speed || 5;
this.life=life || 1;
this.size=size || 2;
this.lived=0;
/* the particle's velocity */
var radians=angle * Math.PI / 180;
this.vel={
x: Math.cos(radians) * speed,
y: -Math.sin(radians) * speed
};
/* the particle's colour values */
this.colour=start_colour;
this.colour_step=colour_step;
};
var Emitter=function(x, y, settings) {
/* the emitter's position */
this.pos={
x: x,
y: y
};
/* set specified values */
this.settings=settings;
/* How often the emitter needs to create a particle in milliseconds */
this.emission_delay=1000 / settings.emission_rate;
/* we'll get to these later */
this.last_update=0;
this.last_emission=0;
/* the emitter's particle objects */
this.particles=[];
};
Emitter.prototype.update=function() {
/* set the last_update variable to now if it's the first update */
if (!this.last_update) {
this.last_update=Date.now();
return;
}
/* get the current time */
var time=Date.now();
/* work out the milliseconds since the last update */
var dt=time - this.last_update;
/* add them to the milliseconds since the last particle emission */
this.last_emission +=dt;
/* set last_update to now */
this.last_update=time;
/* check if we need to emit a new particle */
if (this.last_emission > this.emission_delay) {
/* find out how many particles we need to emit */
var i=Math.floor(this.last_emission / this.emission_delay);
/* subtract the appropriate amount of milliseconds from last_emission */
this.last_emission -=i * this.emission_delay;
while (i--) {
/* calculate the particle's properties based on the emitter's settings */
var start_colour=this.settings.start_colours[Math.floor(this.settings.start_colours.length * Math.random())];
var end_colour=this.settings.end_colours[Math.floor(this.settings.end_colours.length * Math.random())];
var life=this.settings.min_life + Math.random() * this.settings.life_range;
var colour_step=[
(end_colour[0] - start_colour[0]) / life, /* red */ (end_colour[1] - start_colour[1]) / life, /* green */ (end_colour[2] - start_colour[2]) / life, /* blue */ (end_colour[3] - start_colour[3]) / life /* alpha */
];
this.particles.push(
new Particle(
0,
0,
this.settings.min_angle + Math.random() * this.settings.angle_range,
this.settings.min_speed + Math.random() * this.settings.speed_range,
life,
this.settings.min_size + Math.random() * this.settings.size_range,
start_colour.slice(),
colour_step
)
);
}
}
/* convert dt to seconds */
dt /=1000;
/* loop through the existing particles */
var i=this.particles.length;
while (i--) {
var particle=this.particles[i];
/* skip if the particle is dead */
if (particle.dead) {
/* remove the particle from the array */
this.particles.splice(i, 1);
continue;
}
/* add the seconds passed to the particle's life */
particle.lived +=dt;
/* check if the particle should be dead */
if (particle.lived >=particle.life) {
particle.dead=true;
continue;
}
/* calculate the particle's new position based on the forces multiplied by seconds passed */
particle.vel.x +=this.settings.gravity.x * dt;
particle.vel.y +=this.settings.gravity.y * dt;
particle.pos.x +=particle.vel.x * dt;
particle.pos.y +=particle.vel.y * dt;
/* draw the particle */
particle.colour[0] +=particle.colour_step[0] * dt;
particle.colour[1] +=particle.colour_step[1] * dt;
particle.colour[2] +=particle.colour_step[2] * dt;
particle.colour[3] +=particle.colour_step[3] * dt;
ctx.fillStyle='rgba(' +
Math.round(particle.colour[0]) + ',' +
Math.round(particle.colour[1]) + ',' +
Math.round(particle.colour[2]) + ',' +
particle.colour[3] + ')';
var x=this.pos.x + particle.pos.x;
var y=this.pos.y + particle.pos.y;
ctx.beginPath();
ctx.arc(x, y, particle.size, 0, Math.PI * 2);
ctx.fill();
}
};
var emitter=new Emitter(canvas.width / 2, canvas.height / 2, settings.basic);
function loop() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
emitter.update();
requestAnimFrame(loop);
}
loop();
天學(xué)習(xí)了HTML5 Canvas粒子動(dòng)畫,這效果真的挺好看的。是一款基于HTML5 Canvas的圖片粒子沙漏動(dòng)畫,主要是將一張圖片打散成粒子,然后模擬沙漏將圖片粒子掉落下來。
效果圖
代碼:
. 引言
粒子群優(yōu)化算法(PSO)是一種進(jìn)化計(jì)算技術(shù)(evolutionary computation),由Eberhart博士和kennedy博士發(fā)明。源于對(duì)鳥群捕食的行為研究。
PSO同遺傳算法類似,是一種基于迭代的優(yōu)化工具。系統(tǒng)初始化為一組隨機(jī)解,通過迭代搜尋最優(yōu)值。但是并沒有遺傳算法用的交叉(crossover)以及變異(mutation)。而是粒子在解空間追隨最優(yōu)的粒子進(jìn)行搜索。詳細(xì)的步驟后面的章節(jié)介紹。
同遺傳算法比較,PSO的優(yōu)勢(shì)在于簡(jiǎn)單容易實(shí)現(xiàn)并且沒有許多參數(shù)需要調(diào)整。目前已廣泛應(yīng)用于函數(shù)優(yōu)化,神經(jīng)網(wǎng)絡(luò)訓(xùn)練,模糊系統(tǒng)控制以及其他遺傳算法的應(yīng)用領(lǐng)域。
2.背景:人工生命
"人工生命"是來研究具有某些生命基本特征的人工系統(tǒng)。人工生命包括兩方面的內(nèi)容:
1. 研究如何利用計(jì)算技術(shù)研究生物現(xiàn)象
2. 研究如何利用生物技術(shù)研究計(jì)算問題
我們現(xiàn)在關(guān)注的是第二部分的內(nèi)容. 現(xiàn)在已經(jīng)有很多源于生物現(xiàn)象的計(jì)算技巧. 例如, 人工神經(jīng)網(wǎng)絡(luò)是簡(jiǎn)化的大腦模型. 遺傳算法是模擬基因進(jìn)化過程的。
現(xiàn)在我們討論另一種生物系統(tǒng)- 社會(huì)系統(tǒng). 更確切的是, 在由簡(jiǎn)單個(gè)體組成的群落與環(huán)境以及個(gè)體之間的互動(dòng)行為. 也可稱做"群智能"(swarm intelligence). 這些模擬系統(tǒng)利用局部信息從而可能產(chǎn)生不可預(yù)測(cè)的群體行為。
例如floys 和 boids, 他們都用來模擬魚群和鳥群的運(yùn)動(dòng)規(guī)律, 主要用于計(jì)算機(jī)視覺和計(jì)算機(jī)輔助設(shè)計(jì).
在計(jì)算智能(computational intelligence)領(lǐng)域有兩種基于群智能的算法. 蟻群算法(ant colony optimization)和粒子群算法(particle swarm optimization). 前者是對(duì)螞蟻群落食物采集過程的模擬. 已經(jīng)成功運(yùn)用在很多離散優(yōu)化問題上.
粒子群優(yōu)化算法(PSO) 也是起源對(duì)簡(jiǎn)單社會(huì)系統(tǒng)的模擬. 最初設(shè)想是模擬鳥群覓食的過程. 但后來發(fā)現(xiàn)PSO是一種很好的優(yōu)化工具.
3.算法介紹
如前所述,PSO模擬鳥群的捕食行為。設(shè)想這樣一個(gè)場(chǎng)景:一群鳥在隨機(jī)搜索食物。在這個(gè)區(qū)域里只有一塊食物。所有的鳥都不知道食物在那里。但是他們知道當(dāng)前的位置離食物還有多遠(yuǎn)。那么找到食物的最優(yōu)策略是什么呢。最簡(jiǎn)單有效的就是搜尋目前離食物最近的鳥的周圍區(qū)域。
PSO從這種模型中得到啟示并用于解決優(yōu)化問題。PSO中,每個(gè)優(yōu)化問題的解都是搜索空間中的一只鳥。我們稱之為"粒子"。所有的例子都有一個(gè)由被優(yōu)化的函數(shù)決定的適應(yīng)值(fitness value),每個(gè)粒子還有一個(gè)速度決定他們飛翔的方向和距離。然后粒子們就追隨當(dāng)前的最優(yōu)粒子在解空間中搜索
PSO 初始化為一群隨機(jī)粒子(隨機(jī)解)。然后通過疊代找到最優(yōu)解。在每一次疊代中,粒子通過跟蹤兩個(gè)"極值"來更新自己。第一個(gè)就是粒子本身所找到的最優(yōu)解。這個(gè)解叫做個(gè)體極值pBest. 另一個(gè)極值是整個(gè)種群目前找到的最優(yōu)解。這個(gè)極值是全局極值gBest。另外也可以不用整個(gè)種群而只是用其中一部分最為粒子的鄰居,那么在所有鄰居中的極值就是局部極值。
程序的偽代碼如下:
在每一維粒子的速度都會(huì)被限制在一個(gè)最大速度Vmax,如果某一維更新后的速度超過用戶設(shè)定的Vmax,那么這一維的速度就被限定為Vmax
4.遺傳算法和PSO的比較
大多數(shù)演化計(jì)算技術(shù)都是用同樣的過程
1. 種群隨機(jī)初始化
2. 對(duì)種群內(nèi)的每一個(gè)個(gè)體計(jì)算適應(yīng)值(fitness value).適應(yīng)值與最優(yōu)解的距離直接有關(guān)
3. 種群根據(jù)適應(yīng)值進(jìn)行復(fù)制
4. 如果終止條件滿足的話,就停止,否則轉(zhuǎn)步驟2
從以上步驟,我們可以看到PSO和GA有很多共同之處。兩者都隨機(jī)初始化種群,而且都使用適應(yīng)值來評(píng)價(jià)系統(tǒng),而且都根據(jù)適應(yīng)值來進(jìn)行一定的隨機(jī)搜索。兩個(gè)系統(tǒng)都不是保證一定找到最優(yōu)解
但是,PSO 沒有遺傳操作如交叉(crossover)和變異(mutation). 而是根據(jù)自己的速度來決定搜索。粒子還有一個(gè)重要的特點(diǎn),就是有記憶。
與遺傳算法比較, PSO 的信息共享機(jī)制是很不同的. 在遺傳算法中,染色體(chromosomes) 互相共享信息,所以整個(gè)種群的移動(dòng)是比較均勻的向最優(yōu)區(qū)域移動(dòng). 在PSO中, 只有g(shù)Best (or lBest) 給出信息給其他的粒子, 這是單向的信息流動(dòng). 整個(gè)搜索更新過程是跟隨當(dāng)前最優(yōu)解的過程. 與遺傳算法比較, 在大多數(shù)的情況下,所有的粒子可能更快的收斂于最優(yōu)解
5.人工神經(jīng)網(wǎng)絡(luò)和PSO
人工神經(jīng)網(wǎng)絡(luò)(ANN)是模擬大腦分析過程的簡(jiǎn)單數(shù)學(xué)模型,反向轉(zhuǎn)播算法是最流行的神經(jīng)網(wǎng)絡(luò)訓(xùn)練算法。進(jìn)來也有很多研究開始利用演化計(jì)算(evolutionary computation)技術(shù)來研究人工神經(jīng)網(wǎng)絡(luò)的各個(gè)方面。
演化計(jì)算可以用來研究神經(jīng)網(wǎng)絡(luò)的三個(gè)方面:網(wǎng)絡(luò)連接權(quán)重,網(wǎng)絡(luò)結(jié)構(gòu)(網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),傳遞函數(shù)),網(wǎng)絡(luò)學(xué)習(xí)算法。
不過大多數(shù)這方面的工作都集中在網(wǎng)絡(luò)連接權(quán)重,和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)上。在GA中,網(wǎng)絡(luò)權(quán)重和/或拓?fù)浣Y(jié)構(gòu)一般編碼為染色體(Chromosome),適應(yīng)函數(shù)(fitness function)的選擇一般根據(jù)研究目的確定。例如在分類問題中,錯(cuò)誤分類的比率可以用來作為適應(yīng)值。
演化計(jì)算的優(yōu)勢(shì)在于可以處理一些傳統(tǒng)方法不能處理的例子例如不可導(dǎo)的節(jié)點(diǎn)傳遞函數(shù)或者沒有梯度信息存在。但是缺點(diǎn)在于:在某些問題上性能并不是特別好。2. 網(wǎng)絡(luò)權(quán)重的編碼而且遺傳算子的選擇有時(shí)比較麻煩
最近已經(jīng)有一些利用PSO來代替反向傳播算法來訓(xùn)練神經(jīng)網(wǎng)絡(luò)的論文。研究表明PSO 是一種很有潛力的神經(jīng)網(wǎng)絡(luò)算法。PSO速度比較快而且可以得到比較好的結(jié)果。而且還沒有遺傳算法碰到的問題
這里用一個(gè)簡(jiǎn)單的例子說明PSO訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過程。這個(gè)例子使用分類問題的基準(zhǔn)函數(shù)(Benchmark function)IRIS數(shù)據(jù)集。(Iris 是一種鳶尾屬植物) 在數(shù)據(jù)記錄中,每組數(shù)據(jù)包含Iris花的四種屬性:萼片長(zhǎng)度,萼片寬度,花瓣長(zhǎng)度,和花瓣寬度,三種不同的花各有50組數(shù)據(jù). 這樣總共有150組數(shù)據(jù)或模式。
我們用3層的神經(jīng)網(wǎng)絡(luò)來做分類。現(xiàn)在有四個(gè)輸入和三個(gè)輸出。所以神經(jīng)網(wǎng)絡(luò)的輸入層有4個(gè)節(jié)點(diǎn),輸出層有3個(gè)節(jié)點(diǎn)我們也可以動(dòng)態(tài)調(diào)節(jié)隱含層節(jié)點(diǎn)的數(shù)目,不過這里我們假定隱含層有6個(gè)節(jié)點(diǎn)。我們也可以訓(xùn)練神經(jīng)網(wǎng)絡(luò)中其他的參數(shù)。不過這里我們只是來確定網(wǎng)絡(luò)權(quán)重。粒子就表示神經(jīng)網(wǎng)絡(luò)的一組權(quán)重,應(yīng)該是4*6+6*3=42個(gè)參數(shù)。權(quán)重的范圍設(shè)定為[-100,100] (這只是一個(gè)例子,在實(shí)際情況中可能需要試驗(yàn)調(diào)整).在完成編碼以后,我們需要確定適應(yīng)函數(shù)。對(duì)于分類問題,我們把所有的數(shù)據(jù)送入神經(jīng)網(wǎng)絡(luò),網(wǎng)絡(luò)的權(quán)重有粒子的參數(shù)決定。然后記錄所有的錯(cuò)誤分類的數(shù)目作為那個(gè)粒子的適應(yīng)值。現(xiàn)在我們就利用PSO來訓(xùn)練神經(jīng)網(wǎng)絡(luò)來獲得盡可能低的錯(cuò)誤分類數(shù)目。PSO本身并沒有很多的參數(shù)需要調(diào)整。所以在實(shí)驗(yàn)中只需要調(diào)整隱含層的節(jié)點(diǎn)數(shù)目和權(quán)重的范圍以取得較好的分類效果。
6. PSO的參數(shù)設(shè)置
從上面的例子我們可以看到應(yīng)用PSO解決優(yōu)化問題的過程中有兩個(gè)重要的步驟: 問題解的編碼和適應(yīng)度函數(shù)
PSO的一個(gè)優(yōu)勢(shì)就是采用實(shí)數(shù)編碼, 不需要像遺傳算法一樣是二進(jìn)制編碼(或者采用針對(duì)實(shí)數(shù)的遺傳操作.例如對(duì)于問題 f(x)=x1^2 + x2^2+x3^2 求解, 粒子可以直接編碼為 (x1, x2, x3), 而適應(yīng)度函數(shù)就是f(x). 接著我們就可以利用前面的過程去尋優(yōu).這個(gè)尋優(yōu)過程是一個(gè)疊代過程, 中止條件一般為設(shè)置為達(dá)到最大循環(huán)數(shù)或者最小錯(cuò)誤。
PSO中并沒有許多需要調(diào)節(jié)的參數(shù),下面列出了這些參數(shù)以及經(jīng)驗(yàn)設(shè)置
粒子數(shù): 一般取 20 – 40. 其實(shí)對(duì)于大部分的問題10個(gè)粒子已經(jīng)足夠可以取得好的結(jié)果, 不過對(duì)于比較難的問題或者特定類別的問題, 粒子數(shù)可以取到100 或 200
粒子的長(zhǎng)度: 這是由優(yōu)化問題決定, 就是問題解的長(zhǎng)度
粒子的范圍: 由優(yōu)化問題決定,每一維可是設(shè)定不同的范圍
Vmax: 最大速度,決定粒子在一個(gè)循環(huán)中最大的移動(dòng)距離,通常設(shè)定為粒子的范圍寬度,例如上面的例子里,粒子 (x1, x2, x3) x1 屬于 [-10, 10], 那么 Vmax 的大小就是 20
學(xué)習(xí)因子: c1 和 c2 通常等于 2. 不過在文獻(xiàn)中也有其他的取值. 但是一般 c1 等于 c2 并且范圍在0和4之間
中止條件: 最大循環(huán)數(shù)以及最小錯(cuò)誤要求. 例如, 在上面的神經(jīng)網(wǎng)絡(luò)訓(xùn)練例子中, 最小錯(cuò)誤可以設(shè)定為1個(gè)錯(cuò)誤分類, 最大循環(huán)設(shè)定為2000, 這個(gè)中止條件由具體的問題確定.
全局PSO和局部PSO: 我們介紹了兩種版本的粒子群優(yōu)化算法: 全局版和局部版. 前者速度快不過有時(shí)會(huì)陷入局部最優(yōu). 后者收斂速度慢一點(diǎn)不過很難陷入局部最優(yōu). 在實(shí)際應(yīng)用中, 可以先用全局PSO找到大致的結(jié)果,再有局部PSO進(jìn)行搜索.
另外的一個(gè)參數(shù)是慣性權(quán)重, 由Shi 和Eberhart提出, 有興趣的可以參考他們1998年的論文(題目: A modified particle swarm optimizer)
蟻群算法
簡(jiǎn)介:蟻群算法(ant colony optimization, ACO),又稱螞蟻算法,是一種用來在圖中尋找優(yōu)化路徑的機(jī)率型技術(shù)。它由Marco Dorigo于1992年在他的博士論文中引入,其靈感來源于螞蟻在尋找食物過程中發(fā)現(xiàn)路徑的行為。
事實(shí)上,每只螞蟻并不是像我們想象的需要知道整個(gè)世界的信息,他們其實(shí)只關(guān)心很小范圍內(nèi)的眼前信息,而且根據(jù)這些局部信息利用幾條簡(jiǎn)單的規(guī)則進(jìn)行決策,這樣,在蟻群這個(gè)集體里,復(fù)雜性的行為就會(huì)凸現(xiàn)出來。這就是人工生命、復(fù)雜性科學(xué)解釋的規(guī)律!那么,這些簡(jiǎn)單規(guī)則是什么呢?下面詳細(xì)說明:
1、范圍:
螞蟻觀察到的范圍是一個(gè)方格世界,螞蟻有一個(gè)參數(shù)為速度半徑(一般是3),那么它能觀察到的范圍就是3*3個(gè)方格世界,并且能移動(dòng)的距離也在這個(gè)范圍之內(nèi)。
2、環(huán)境:
螞蟻所在的環(huán)境是一個(gè)虛擬的世界,其中有障礙物,有別的螞蟻,還有信息素,信息素有兩種,一種是找到食物的螞蟻灑下的食物信息素,一種是找到窩的螞蟻灑下的窩的信息素。每個(gè)螞蟻都僅僅能感知它范圍內(nèi)的環(huán)境信息。環(huán)境以一定的速率讓信息素消失。
3、覓食規(guī)則:
在每只螞蟻能感知的范圍內(nèi)尋找是否有食物,如果有就直接過去。否則看是否有信息素,并且比較在能感知的范圍內(nèi)哪一點(diǎn)的信息素最多,這樣,它就朝信息素多的地方走,并且每只螞蟻多會(huì)以小概率犯錯(cuò)誤,從而并不是往信息素最多的點(diǎn)移動(dòng)。螞蟻找窩的規(guī)則和上面一樣,只不過它對(duì)窩的信息素做出反應(yīng),而對(duì)食物信息素沒反應(yīng)。
4、移動(dòng)規(guī)則:
每只螞蟻都朝向信息素最多的方向移,并且,當(dāng)周圍沒有信息素指引的時(shí)候,螞蟻會(huì)按照自己原來運(yùn)動(dòng)的方向慣性的運(yùn)動(dòng)下去,并且,在運(yùn)動(dòng)的方向有一個(gè)隨機(jī)的小的擾動(dòng)。為了防止螞蟻原地轉(zhuǎn)圈,它會(huì)記住最近剛走過了哪些點(diǎn),如果發(fā)現(xiàn)要走的下一點(diǎn)已經(jīng)在最近走過了,它就會(huì)盡量避開。
5、避障規(guī)則:
如果螞蟻要移動(dòng)的方向有障礙物擋住,它會(huì)隨機(jī)的選擇另一個(gè)方向,并且有信息素指引的話,它會(huì)按照覓食的規(guī)則行為。
7、播撒信息素規(guī)則:
每只螞蟻在剛找到食物或者窩的時(shí)候撒發(fā)的信息素最多,并隨著它走遠(yuǎn)的距離,播撒的信息素越來越少。
根據(jù)這幾條規(guī)則,螞蟻之間并沒有直接的關(guān)系,但是每只螞蟻都和環(huán)境發(fā)生交互,而通過信息素這個(gè)紐帶,實(shí)際上把各個(gè)螞蟻之間關(guān)聯(lián)起來了。比如,當(dāng)一只螞蟻找到了食物,它并沒有直接告訴其它螞蟻這兒有食物,而是向環(huán)境播撒信息素,當(dāng)其它的螞蟻經(jīng)過它附近的時(shí)候,就會(huì)感覺到信息素的存在,進(jìn)而根據(jù)信息素的指引找到了食物。
引申:
跟著螞蟻的蹤跡,你找到了什么?通過上面的原理敘述和實(shí)際操作,我們不難發(fā)現(xiàn)螞蟻之所以具有智能行為,完全歸功于它的簡(jiǎn)單行為規(guī)則,而這些規(guī)則綜合起來具有下面兩個(gè)方面的特點(diǎn):
1、多樣性
2、正反饋
多樣性保證了螞蟻在覓食的時(shí)候不置走進(jìn)死胡同而無限循環(huán),正反饋機(jī)制則保證了相對(duì)優(yōu)良的信息能夠被保存下來。我們可以把多樣性看成是一種創(chuàng)造能力,而正反饋是一種學(xué)習(xí)強(qiáng)化能力。正反饋的力量也可以比喻成權(quán)威的意見,而多樣性是打破權(quán)威體現(xiàn)的創(chuàng)造性,正是這兩點(diǎn)小心翼翼的巧妙結(jié)合才使得智能行為涌現(xiàn)出來了。
引申來講,大自然的進(jìn)化,社會(huì)的進(jìn)步、人類的創(chuàng)新實(shí)際上都離不開這兩樣?xùn)|西,多樣性保證了系統(tǒng)的創(chuàng)新能力,正反饋保證了優(yōu)良特性能夠得到強(qiáng)化,兩者要恰到好處的結(jié)合。如果多樣性過剩,也就是系統(tǒng)過于活躍,這相當(dāng)于螞蟻會(huì)過多的隨機(jī)運(yùn)動(dòng),它就會(huì)陷入混沌狀態(tài);而相反,多樣性不夠,正反饋機(jī)制過強(qiáng),那么系統(tǒng)就好比一潭死水。這在蟻群中來講就表現(xiàn)為,螞蟻的行為過于僵硬,當(dāng)環(huán)境變化了,螞蟻群仍然不能適當(dāng)?shù)恼{(diào)整。
既然復(fù)雜性、智能行為是根據(jù)底層規(guī)則涌現(xiàn)的,既然底層規(guī)則具有多樣性和正反饋特點(diǎn),那么也許你會(huì)問這些規(guī)則是哪里來的?多樣性和正反饋又是哪里來的?我本人的意見:規(guī)則來源于大自然的進(jìn)化。而大自然的進(jìn)化根據(jù)剛才講的也體現(xiàn)為多樣性和正反饋的巧妙結(jié)合。而這樣的巧妙結(jié)合又是為什么呢?為什么在你眼前呈現(xiàn)的世界是如此栩栩如生呢?答案在于環(huán)境造就了這一切,之所以你看到栩栩如生的世界,是因?yàn)槟切┎荒軌蜻m應(yīng)環(huán)境的多樣性與正反饋的結(jié)合都已經(jīng)死掉了,被環(huán)境淘汰了!
參數(shù)說明:
最大信息素:螞蟻在一開始擁有的信息素總量,越大表示程序在較長(zhǎng)一段時(shí)間能夠存在信息素。信息素消減的速度:隨著時(shí)間的流逝,已經(jīng)存在于世界上的信息素會(huì)消減,這個(gè)數(shù)值越大,那么消減的越快。
錯(cuò)誤概率表示這個(gè)螞蟻不往信息素最大的區(qū)域走的概率,越大則表示這個(gè)螞蟻越有創(chuàng)新性。
速度半徑表示螞蟻一次能走的最大長(zhǎng)度,也表示這個(gè)螞蟻的感知范圍。
記憶能力表示螞蟻能記住多少個(gè)剛剛走過點(diǎn)的坐標(biāo),這個(gè)值避免了螞蟻在本地打轉(zhuǎn),停滯不前。而這個(gè)值越大那么整個(gè)系統(tǒng)運(yùn)行速度就慢,越小則螞蟻越容易原地轉(zhuǎn)圈。
魚群優(yōu)化算法
在一片水域中,魚往往能自行或尾隨其他魚找到營(yíng)養(yǎng)物質(zhì)多的地方,因而魚生存數(shù)目最多的地方一般就是本水域中營(yíng)養(yǎng)物質(zhì)最多的地方,人工魚群算法就是根據(jù)這一特點(diǎn),通過構(gòu)造人工魚來模仿魚群的覓食!聚群及追尾行為,從而實(shí)現(xiàn)尋優(yōu),以下是魚的幾種典型行為:
(1)覓食行為:一般情況下魚在水中隨機(jī)地自由游動(dòng),當(dāng)發(fā)現(xiàn)食物時(shí),則會(huì)向食物逐漸增多的方向快速游去。
(2)聚群行為:魚在游動(dòng)過程中為了保證自身的生存和躲避危害會(huì)自然地聚集成群,魚聚群時(shí)所遵守的規(guī)則有三條:分隔規(guī)則:盡量避免與臨近伙伴過于擁擠;對(duì)準(zhǔn)規(guī)則:盡量與臨近伙伴的平均方向一致;內(nèi)聚規(guī)則:盡量朝臨近伙伴的中心移動(dòng)。
(3)追尾行為:當(dāng)魚群中的一條或幾條魚發(fā)現(xiàn)食物時(shí),其臨近的伙伴會(huì)尾隨其快速到達(dá)食物點(diǎn)。
特點(diǎn):
1)具有較快的收斂速度,可以用于解決有實(shí)時(shí)性要求的問題;
2)對(duì)于一些精度要求不高的場(chǎng)合,可以用它快速的得到一個(gè)可行解;
3)不需要問題的嚴(yán)格機(jī)理模型,甚至不需要問題的精確描述,這使得它的應(yīng)用范圍得以延伸.
停止條件
1) 判斷連續(xù)多次所得的均方差小于語允許的誤差
2)判斷某個(gè)區(qū)域的人工魚群的數(shù)目達(dá)到某個(gè)比率
3)聯(lián)系多次所獲取的值均不能超過已尋找的極值。
具體見原浙大博士李曉磊的博士論文-人工魚群算法。
另外在nature上面2007年1一月有一篇關(guān)于人工魚行為的文章。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。