《优化算法》人工鱼群算法学习 超详细解析 附JAVA和matlab示例
人工魚群算法
- 1 人工魚群算法
- 1.1 定義
- 1.2 算法具體過程
- 1.3 算法流程圖
- 1.4 算法偽代碼
- 2 參數解析
- 2.1 視野visual
- 2.2 步長step
- 2.3 群規模N
- 2.4 嘗試次數Trynumber
- 2.5 擁擠度因子δ
- 2.6 小結
- 3 四種基本行為
- 3.1 覓食行為
- 3.2 聚群行為
- 3.3 追尾行為
- 3.4 隨機行為
- 4 行為選擇
- 5 終止條件
- 6 求解示例,java代碼
- 6.1 主函數測試類
- 6.2 人工魚類
- 6.3 人工魚群算法類
- 7 二元函數優化實例 matlab代碼實現
- 7.1 人工魚群算法需要用到的matlab函數
- 7.2 一元函數優化代碼
- 7.3 二元函數優化代碼
- 7.4 人工魚群各功能函數代碼
- 初始化魚群函數AF_init
- 初始化魚群函數AF_prey
- 初始化魚群函數AF_swarm
- 初始化魚群函數AF_follow
- 初始化魚群函數AF_dist
- 初始化魚群函數AF_foodconsistence
- 計算魚群距離 dist
1 人工魚群算法
人工魚群算法為山東大學副教授李曉磊2002年從魚找尋食物的現象中表現的種種移動尋覓特點中得到啟發而闡述的仿生學優化方案。
1.1 定義
在一片水域中,魚往往能自行或尾隨其他魚找到營養物質多的地方,因而魚生存數目最多的地方一般就是本水域中營養物質最多的地方,人工魚群算法就是根據這一特點,通過構造人工魚來模仿魚群的覓食、聚群及追尾行為,從而實現尋優。
人工魚擁有以下幾種典型行為:
分隔規則:盡量避免與臨近伙伴過于擁擠;
對準規則:盡量與臨近伙伴的平均方向一致;
內聚規則:盡量朝臨近伙伴的中心移動。
1.2 算法具體過程
人工魚群算法實現的步驟:
1.3 算法流程圖
1.4 算法偽代碼
2 參數解析
人工魚群算法有5個基本參數:群規模N、人工魚的視野Visual、步長Step、擁擠度因子δ、重復次數Trynumber。
2.1 視野visual
動物的觀察力是及其深奧的,它可以很快的洞察到周邊的物體,魚類的視野中分為連續型視野和離散型視野兩類。應用如下方法實現虛擬人工魚的視覺:
圖2.1(a)表示具有連續型視野的一條假設的人工魚個體,它能看到的區域 Visual 為以現在位置 Xi為圓心一定距離為半徑的圓形區域,地點 Xj為它在一個時候巡視到的視點種另一地方,如果這個地點的食物量比之前地方的多,就決定去這個地方前進步長的隨機數達到地點 Xnext;
人工魚的離散型視野為與節點位置 Xi 相鄰且相通的所有節點,如圖 2.1(b)所示,根據判斷邊的代價來選擇下一步位置 Xnext。
由于視野對算法中個行為都有較大影響,因此,它的變化對收斂性能影響也比較復雜。
當視野范圍較小時,人工魚的覓食行為和隨機行為比較突出;視野范圍較大時,人工魚的追尾行為和聚群行為將變得比較突出,相應的算法的復雜度也會有所上升。
總的來說:視野越大,越容易使人工魚發現全局最優解并收斂。
2.2 步長step
對于固定步長,隨著步長的增加,收斂的速度得到了一定的加速,但在超過一定的范圍后,有使得收斂速度減緩,步長過大時會出現震蕩現象而大大影響收斂速度。
采用隨機步長的方式在一定程度上防止了震蕩現象的發生,并使得該參數的敏感度大大降低了,但最快的收斂速度還是最優固定步長的收斂速。
所以,對于特定的優化問題,我們可以考慮采用合適的固定步長或者變尺度方法來提高收斂速度。
2.3 群規模N
人工魚的數目越多,跳出局部最優解的能力越強,同時,收斂的速度也越快。
當然,付出的代價就是算法每次迭代的計算量也越大,因此,在使用過程中,滿足穩定收斂的前提下,應當盡可能的減少個體數目。
2.4 嘗試次數Trynumber
嘗試次數越多,人工魚的覓食行為能力越強,收斂的效率也越高。
在局部極值突出的情況下,應該適當的減少以增加人工魚隨機游動的概率,克服局部最優解。
2.5 擁擠度因子δ
在求極大值問題中,δ=1/(αnmax),α∈(0,1]δ=1/(αnmax),α∈(0,1];在求極小值問題中,δ=αnmax,α∈(0,1]δ=αnmax,α∈(0,1]。其中α為極值接近水平, nmax為期望在該鄰域內聚集的最大人工魚數目。
擁擠度因子與nf相結合,通過人工魚是否執行追尾和聚群行為對優化結果產生影響。以極大值為例(極小值的情況正好與極大值相反),δ越大,表明允許的擁擠程度越小,人工魚擺脫局部最優解的能力越強;但是收斂速度會有所減緩,這主要因為人工魚在逼近最優解的同時,會因避免過分擁擠而隨機走開或者受其他人工魚的排斥作用,不能精確逼近極值點。
可見,雖然δ的引入避免了人工魚過度擁擠而陷入局部最優解,但是另一方面,該參數會使得位于極值點附件的人工魚之間存在相互排斥的影響,而難以想極值點精確逼近。
所以,對于某些局部極值不是很嚴重的具體問題,可以忽略擁擠的因素,從而在簡化算法的同時也加快算法的收斂速度和提高結果的精確程度。
2.6 小結
3 四種基本行為
人工魚有四種基本行為,包括覓食Pray、聚群Swarm、追尾Follow和評價行為bulletin。
3.1 覓食行為
這是魚趨向食物的一種活動,一般認為它是通過視覺或味覺來感知水中的食物量或食物濃度來選擇行動的方向。
設置人工魚當前狀態,并在其感知范圍內隨機選擇另一個狀態,如果得到的狀態的目標函數大于當前的狀態,則向新選擇得到的狀態靠近一步,反之,重新選取新狀態,判斷是否滿足條件。
選擇次數達到一定數量后,如果仍然不滿足條件,則隨機移動一步。
3.2 聚群行為
大量或少量的魚聚集成群,進行集體覓食和躲避敵害,這是它們在進化過程中形成的一種生存方式。
人工魚探索當前鄰居內的伙伴數量,并計算伙伴的中心位置,然后把新得到的中心位置的目標函數與當前位置的目標函數相比較,如果中心位置的目標函數優于當前位置的目標函數并且不是很擁擠,則當前位置向中心位置移動一步,否則執行覓食行為。
魚聚群時會遵守兩條規則:一是盡量向鄰近伙伴的中心移動,二是避免過分擁擠。
3.3 追尾行為
當某一條魚或幾條魚發現食物時,它們附近的魚會尾隨而來,導致更遠處的魚也會尾隨過來。
人工魚探索周圍鄰居魚的最優位置,當最優位置的目標函數值大于當前位置的目標函數值并且不是很擁擠,則當前位置向最優鄰居魚移動一步,否則執行覓食行為。
3.4 隨機行為
它是覓食行為的一個缺省行為,指人工魚在視野內隨機移動。當發現食物時,會向食物逐漸增多的方向快速的移動。
4 行為選擇
公告牌是記錄最優人工魚個體狀態的地方。每條人工魚在執行完一次迭代后將自身當前狀態與公告牌中記錄的狀態進行比較,如果優于公告牌中的狀態則用自身狀態更新公告牌中的狀態,否則公告牌的狀態不變。
當整個算法的迭代結束后,公告牌的值就是最優解。
行為評價是用來反映魚自主行為的一種方式,在解決優化問題時選用兩種方式評價:一種是選擇最優行為執行;另一種是選擇較優方向。
對于解決極大值問題,可以使用試探法,即模擬執行群聚、追尾等行為,然后評價行動后的值選擇最優的來執行,缺省的行為為覓食行為。
一般通過試探法,模擬執行上述幾種行為,評價后選擇最大者實行;
5 終止條件
迭代終止條件:
通常的方法是判斷連續多次所得值得均方差小魚允許的誤差;
或判斷聚集于某個區域的人工魚的數目達到某個比例;
或連續多次所得的均值不超過已尋找的極值;
或限制最大迭代次數。
若滿足終止條件,則輸出公告牌的最優記錄;否則繼續迭代。
6 求解示例,java代碼
求解x2-160x+640+y2-260y+16900這個二元函數的最小值;
6.1 主函數測試類
package optimaze_algorithm.AFAS_PACK;/*** 人工魚群算法求解二元函數最優值問題*/ public class MainTest {public static void main(String[] args) {System.out.println("begin");AFAS run = new AFAS(10,5,2,5,0.2,10);run.doAFAS(40 );//括號內為迭代次數} }6.2 人工魚類
package optimaze_algorithm.AFAS_PACK;public class Fish {public int dim; //每條魚的維度public int[] x; //每條魚的具體多維坐標public double fit; //魚的適應值,濃度public int visual; //每條魚的視野public final double[] H = new double[256];public final double[] W = new double[256];public Fish(int dim, int visual){this.dim = dim;this.visual = visual;x = new int[dim];for (int i = 0; i < dim; i++) {x[i] = (int) Math.floor(256*Math.random());}fit = 0;}public double distance(Fish f){double a = 0;for (int i = 0; i < dim; i++) {if (this.x[i] - f.x[i] == 0){a = 0.00001;}else {a += (this.x[i] - f.x[i]) * (this.x[i] - f.x[i]);}}return Math.sqrt(a);}public double newFunction(int[] w){return -(w[0]*w[0] - 160*w[0]+640+w[1]*w[1]-260*w[1]+16900);}}6.3 人工魚群算法類
package optimaze_algorithm.AFAS_PACK;import java.util.Date;public class AFAS {private int fishNum; //魚群數目private int tryTimes; //嘗試次數private int dim; //維度private int step; //人工魚移動步長private double delta; //擁擠度因子private int visual; //視野范圍//人工魚群、范圍內最佳魚,遍歷時的下一條魚Fish[] fish;Fish bestfish;Fish[] nextfish;int index; //遍歷索引double[][] vector;private int[] choosed;//范圍內魚群數目 fishCountpublic int scopelength;public AFAS(){}public AFAS(int fishNum, int tryTimes, int dim, int step, double delta, int visual) {this.fishNum = fishNum;this.tryTimes = tryTimes;this.dim = dim;this.step = step;this.delta = delta;this.visual = visual;fish = new Fish[fishNum];nextfish = new Fish[3];vector = new double[fishNum][dim];choosed = new int[fishNum];index = 0;init();}public void doAFAS(int num){long startTime = new Date().getTime();double a = 0.0;int count = 1;int len = 0;while (count <= num){for (int i = 0; i < fishNum; i++) {prey(i);swarm(i);follow(i);bulletin(i);System.out.println("第"+count+"遍第"+i+"條魚結束");}System.out.println(count+"當前最優值:"+bestfish.fit);for (int i = 0; i < dim; i++) {System.out.print("位置"+(i+1)+": "+bestfish.x[i]);}System.out.println();count++;System.out.println("step:"+step+" visaul:"+visual);}System.out.println("最優值:"+bestfish.fit);for (int i = 0; i < dim; i++) {System.out.print("位置"+(i+1)+": "+bestfish.x[i]);}System.out.println();long endTime = new Date().getTime();System.out.println("本程序運行計時: "+(endTime-startTime)+" 毫秒。");}/*** 評價行為* @param i*/private void bulletin(int i){Fish maxfish = new Fish(dim, visual);maxfish = nextfish[0];for (int j = 0; j < 3; j++) {if (nextfish[j].fit > maxfish.fit && nextfish[j].x[0] != 0 && nextfish[j].x[1] != 0){maxfish = nextfish[j];}}if (maxfish.fit < fish[i].fit){return;}fish[i] = maxfish;if (maxfish.fit > bestfish.fit){bestfish = maxfish;}}/*** 追尾行為* 人工魚探索周圍鄰居魚的最優位置,* 當最優位置的目標函數值大于當前位置的目標函數值并且不是很擁擠,則當前位置向最優鄰居魚移動一步,* 否則執行覓食行為。* @param i*/private void follow(int i){nextfish[2] = new Fish(dim, visual);Fish maxfish = new Fish(dim, visual);maxfish = fish[i];//獲得視野范圍內的魚群Fish[] scope = getScopefish(i);int key = i;if (scope != null){for (int j = 0; j < scope.length; j++) {//最大適應度的魚if (scope[j].fit > maxfish.fit){maxfish = scope[j];key = j;}}//如果最小適應度的魚也比自己大,就去覓食if (maxfish.fit <= fish[i].fit){prey(i);}else {Fish[] newScope = getScopefish(key);if (newScope != null){//檢查擁擠度,能不能插入,不能插入就去覓食if (newScope.length*maxfish.fit < delta*fish[i].fit){double dis = fish[i].distance(maxfish);//如果能夠插入,就往minfish的位置移動for (int k = 0; k < dim; k++) {nextfish[2].x[k] = (int) (fish[i].x[k]+(maxfish.x[k]-fish[i].x[k])*step*Math.random()/dis);}//更新適應度nextfish[2].fit = nextfish[2].newFunction(nextfish[2].x);} else prey(i);} else prey(i);}}else prey(i);}/*** 人工魚i的聚群行為* 人工魚探索當前鄰居內的伙伴數量,并計算伙伴的中心位置,* 然后把新得到的中心位置的目標函數與當前位置的目標函數相比較,* 如果中心位置的目標函數優于當前位置的目標函數并且不是很擁擠,則當前位置向中心位置移動一步,否則執行覓食行為。* 魚聚群時會遵守兩條規則:一是盡量向鄰近伙伴的中心移動,二是避免過分擁擠。* @param i*/private void swarm(int i){nextfish[1] = new Fish(dim,visual);int[] center = new int[dim];for(int j=0;j<dim;j++){center[j] = 0;}//取得視野內的魚群Fish[] scope = getScopefish(i);if(scope!=null){for(int j=0;j<scope.length;j++){for( i=0; i<dim; ++i ){center[i] += scope[j].x[i];}}//計算中心位置for( i=0; i<dim; i++ ){center[i] /= scope.length;}//滿足條件double dis=0.0;Fish centerfish = new Fish(dim,visual);centerfish.x = center;centerfish.fit = centerfish.newFunction(centerfish.x);dis = fish[i].distance(centerfish);if(centerfish.fit>fish[i].fit && scope.length*centerfish.fit<delta*fish[i].fit){for(int j=0;j<dim;j++){nextfish[1].x[j] = (int) (fish[i].x[j]+(centerfish.x[j]-fish[i].x[j])*step*Math.random()/dis);}nextfish[1].fit = nextfish[1].newFunction(nextfish[1].x);}else prey(i);}else prey(i);}/*** 人工魚i的覓食行為* @param i*/private void prey(int i){Fish newfish = new Fish(dim,visual);newfish.fit = 0;nextfish[0] = new Fish(dim,visual);//選擇次數達到一定數量后,如果仍然不滿足條件,則隨機移動一步for(int k=0; k<tryTimes; k++ ) { // 進行try_number次嘗試//在其感知范圍內隨機選擇另一個狀態for (int j = 0; j < dim; j++) {newfish.x[j] = (int) ((2*(Math.random())-1)*visual);}newfish.fit = newfish.newFunction(newfish.x);//如果得到的狀態的目標函數大于當前的狀態,則向新選擇得到的狀態靠近一步if( newfish.fit > fish[i].fit ){double dis = fish[i].distance(newfish);for(int j=0; j<dim; j++ ){nextfish[0].x[j] = (int) (fish[i].x[j]+(newfish.x[j]-fish[i].x[j])*step*Math.random()/dis);}nextfish[0].fit =nextfish[0].newFunction(nextfish[0].x);}else {//反之,重新選取新狀態for(int j=0; j<dim; j++){nextfish[0].x[j] = (int) (fish[i].x[j]+visual*(2*(Math.random())-1));nextfish[0].fit = nextfish[0].newFunction(nextfish[0].x);}}}}/*** 獲得魚i視野范圍內的魚群* @param i* @return*/private Fish[] getScopefish(int i) {int num = 0;//計算視野范圍內的魚群個數,并且記錄下標for(int j=0;j<fishNum;j++){choosed[j] = -1;if(fish[i].distance(fish[j])<visual){choosed[j] = i;num++;}}//如果視野范圍內有其它魚,標記出來返回if (num != 0){Fish[] scope = new Fish[num];int k = 0;for(int j=0;j<fishNum;j++){if(choosed[j]!=-1){scope[k++] = fish[choosed[j]];}}return scope;}return null;}/*** 初始化魚群,隨機生成魚的位置* 并且根據位置計算其適應度*/private void init() {for (int i = 0; i < fishNum; i++) {fish[i] = new Fish(dim, visual);fish[i].fit = fish[i].newFunction(fish[i].x);}//最優魚群bestfish = new Fish(dim, visual);bestfish.fit = -9999999;}}7 二元函數優化實例 matlab代碼實現
一元函數的優化實例:
maxf(x)=xsin(10πx)+2.0maxf(x) = xsin(10πx) + 2.0maxf(x)=xsin(10πx)+2.0
s.t. 1≤x≤21 ≤ x ≤ 21≤x≤2
二元函數的優化實例:
maxf(x,y)=sinxxsinyymaxf(x,y) = \frac{sinx}{x} \frac{siny}{y}maxf(x,y)=xsinx?ysiny?
s.t. x∈[?10,10]x\in[-10,10]x∈[?10,10] y∈[?10,10]y\in[-10,10]y∈[?10,10]
7.1 人工魚群算法需要用到的matlab函數
具體的源代碼放到文末:有需要的同學可以自行查看學習。
| 1 | AF_init | 初始化魚群函數 |
| 2 | AF_prey | 覓食行為函數 |
| 3 | AF_swarm | 聚群行為函數 |
| 4 | AF_follow | 追尾行為函數 |
| 5 | AF_dist | 計算魚群個體距離函數 |
| 6 | AF_foodconsistence | 當前位置的事物濃度函數 |
7.2 一元函數優化代碼
clc clear all close all tic figure(1);hold on ezplot('x*sin(10*pi*x)+2',[-1,2]); %% 參數設置 fishnum=50; %生成50只人工魚 MAXGEN=50; %最多迭代次數 try_number=100;%最多試探次數 visual=1; %感知距離 delta=0.618; %擁擠度因子 step=0.1; %步長 %% 初始化魚群 lb_ub=[-1,2,1]; X=AF_init(fishnum,lb_ub); LBUB=[]; for i=1:size(lb_ub,1)LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)]; end gen=1; BestY=-1*ones(1,MAXGEN); %每步中最優的函數值 BestX=-1*ones(1,MAXGEN); %每步中最優的自變量 besty=-100; %最優函數值 Y=AF_foodconsistence(X); while gen<=MAXGENfprintf(1,'%d\n',gen)for i=1:fishnum%% 聚群行為[Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y); %% 追尾行為[Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y); if Yi1>Yi2X(:,i)=Xi1;Y(1,i)=Yi1;elseX(:,i)=Xi2;Y(1,i)=Yi2;endend[Ymax,index]=max(Y);figure(1);plot(X(1,index),Ymax,'.','color',[gen/MAXGEN,0,0])if Ymax>bestybesty=Ymax;bestx=X(:,index);BestY(gen)=Ymax;[BestX(:,gen)]=X(:,index);elseBestY(gen)=BestY(gen-1);[BestX(:,gen)]=BestX(:,gen-1);endgen=gen+1; end plot(bestx(1),besty,'ro','MarkerSize',100) xlabel('x') ylabel('y') title('魚群算法迭代過程中最優坐標移動')%% 優化過程圖 figure plot(1:MAXGEN,BestY) xlabel('迭代次數') ylabel('優化值') title('魚群算法迭代過程') disp(['最優解X:',num2str(bestx,'%1.4f')]) disp(['最優解Y:',num2str(besty,'%1.4f')]) toc7.3 二元函數優化代碼
clc clear all close all tic figure(1);hold on %% 參數設置 fishnum=100; %生成100只人工魚 MAXGEN=50; %最多迭代次數 try_number=100;%最多試探次數 visual=1; %感知距離 delta=0.618; %擁擠度因子 step=0.1; %步長 %% 初始化魚群 lb_ub=[-10,10,2;]; X=AF_init(fishnum,lb_ub); LBUB=[]; for i=1:size(lb_ub,1)LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)]; end gen=1; BestY=-1*ones(1,MAXGEN); %每步中最優的函數值 BestX=-1*ones(2,MAXGEN); %每步中最優的自變量 besty=-100; %最優函數值 Y=AF_foodconsistence(X); while gen<=MAXGENfprintf(1,'%d\n',gen)for i=1:fishnum%% 聚群行為[Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y); %% 追尾行為[Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y);if Yi1>Yi2X(:,i)=Xi1;Y(1,i)=Yi1;elseX(:,i)=Xi2;Y(1,i)=Yi2;endend[Ymax,index]=max(Y);figure(1);plot(X(1,index),X(2,index),'.','color',[gen/MAXGEN,0,0])if Ymax>bestybesty=Ymax;bestx=X(:,index);BestY(gen)=Ymax;[BestX(:,gen)]=X(:,index);elseBestY(gen)=BestY(gen-1);[BestX(:,gen)]=BestX(:,gen-1);endgen=gen+1; end plot(bestx(1),bestx(2),'ro','MarkerSize',100) xlabel('x') ylabel('y') title('魚群算法迭代過程中最優坐標移動')%% 優化過程圖 figure plot(1:MAXGEN,BestY) xlabel('迭代次數') ylabel('優化值') title('魚群算法迭代過程') disp(['最優解X:',num2str(bestx','%1.5f')]) disp(['最優解Y:',num2str(besty,'%1.5f')]) toc7.4 人工魚群各功能函數代碼
初始化魚群函數AF_init
function X=AF_init(Nfish,lb_ub) %輸入: % Nfish 魚群大小 % lb_ub 魚的活動范圍%輸出: % X 產生的初始人工魚群% example: % Nfish=3; % lb_ub=[-3.0,12.1,1;4.1,5.8,1]; %%這里的lb_ub是2行3列的矩陣,每行中前兩個數是范圍的上下限,第3個數是在該范圍內的數的個數 % X=Inital(Nfish,lb_ub) %%就是產生[-3.0,12.1]內的數1個,[4.1,5.8]內的數1個 %%兩個數一組,這樣的數一共Nfish個 row=size(lb_ub,1); X=[]; for i=1:rowlb=lb_ub(i,1);ub=lb_ub(i,2);nr=lb_ub(i,3);for j=1:nrX(end+1,:)=lb+(ub-lb)*rand(1,Nfish);end end初始化魚群函數AF_prey
function [Xnext,Ynext]=AF_prey(Xi,ii,visual,step,try_number,LBUB,lastY) %覓食行為 %輸入: %Xi 當前人工魚的位置 %ii 當前人工魚的序號 %visual 感知范圍 %step 最大移動步長 %try_number 最大嘗試次數 %LBUB 各個數的上下限 %lastY 上次的各人工魚位置的食物濃度%輸出: %Xnext Xi人工魚的下一個位置 %Ynext Xi人工魚的下一個位置的食物濃度Xnext=[]; Yi=lastY(ii); for i=1:try_numberXj=Xi+(2*rand(length(Xi),1)-1)*visual;Yj=AF_foodconsistence(Xj);if Yi<YjXnext=Xi+rand*step*(Xj-Xi)/norm(Xj-Xi);for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endendXi=Xnext;break;end end%隨機行為 if isempty(Xnext)Xj=Xi+(2*rand(length(Xi),1)-1)*visual;Xnext=Xj;for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endend end Ynext=AF_foodconsistence(Xnext);初始化魚群函數AF_swarm
function [Xnext,Ynext]=AF_swarm(X,i,visual,step,deta,try_number,LBUB,lastY) % 聚群行為 %輸入: %X 所有人工魚的位置 %i 當前人工魚的序號 %visual 感知范圍 %step 最大移動步長 %deta 擁擠度 %try_number 最大嘗試次數 %LBUB 各個數的上下限 %lastY 上次的各人工魚位置的食物濃度%輸出: %Xnext Xi人工魚的下一個位置 %Ynext Xi人工魚的下一個位置的食物濃度 Xi=X(:,i); D=AF_dist(Xi,X); index=find(D>0 & D<visual); nf=length(index); if nf>0for j=1:size(X,1)Xc(j,1)=mean(X(j,index));endYc=AF_foodconsistence(Xc);Yi=lastY(i);if Yc/nf>deta*YiXnext=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endendYnext=AF_foodconsistence(Xnext);else[Xnext,Ynext]=AF_prey(Xi,i,visual,step,try_number,LBUB,lastY);end else[Xnext,Ynext]=AF_prey(Xi,i,visual,step,try_number,LBUB,lastY); end初始化魚群函數AF_follow
function [Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB,lastY) % 追尾行為 %輸入: %X 所有人工魚的位置 %i 當前人工魚的序號 %visual 感知范圍 %step 最大移動步長 %deta 擁擠度 %try_number 最大嘗試次數 %LBUB 各個數的上下限 %lastY 上次的各人工魚位置的食物濃度%輸出: %Xnext Xi人工魚的下一個位置 %Ynext Xi人工魚的下一個位置的食物濃度 Xi=X(:,i); D=AF_dist(Xi,X); index=find(D>0 & D<visual); nf=length(index); if nf>0XX=X(:,index);YY=lastY(index);[Ymax,Max_index]=max(YY);Xmax=XX(:,Max_index);Yi=lastY(i);if Ymax/nf>deta*Yi;Xnext=Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endendYnext=AF_foodconsistence(Xnext);else[Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);end else[Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY); end初始化魚群函數AF_dist
function D=AF_dist(Xi,X) %計算第i條魚與所有魚的位置,包括本身。 %輸入: %Xi 第i條魚的當前位置 %X 所有魚的當前位置 % 輸出: %D 第i條魚與所有魚的距離 col=size(X,2); D=zeros(1,col); for j=1:colD(j)=norm(Xi-X(:,j)); end初始化魚群函數AF_foodconsistence
function [Y]=AF_foodconsistence(X) fishnum=size(X,2); for i=1:fishnumY(1,i)=X(i)*sin(10*pi*X(i))+2; end計算魚群距離 dist
%計算第i條魚與所有魚的位置,包括本身。 function D=dist(Xi,X) col=size(X,2); D=zeros(1,col); for j=1:colD(j)=norm(Xi-X(:,j)); end總結
以上是生活随笔為你收集整理的《优化算法》人工鱼群算法学习 超详细解析 附JAVA和matlab示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何修改myeclipse中web项目的
- 下一篇: iframe 自适应高度 跨域