當前位置:首頁 » 知網查重 » 人工蜂群演算法知網

人工蜂群演算法知網

發布時間: 2021-03-05 06:40:18

Ⅰ 人工蜂群演算法的matlab的編程詳細代碼,最好有基於人工蜂群演算法的人工神經網路的編程代碼

蟻群演算法(ant colony optimization, ACO),又稱螞蟻演算法,是一種用來在圖中尋找優化路徑的機率型演算法。它由內Marco Dorigo於1992年在他的博士論文中容提出,其靈感來源於螞蟻在尋找食物過程中發現路徑的行為。蟻群演算法是一種模擬進化演算法,初步的研究表明該演算法具有許多優良的性質。針對PID控制器參數優化設計問題,將蟻群演算法設計的結果與遺傳演算法設計的結果進行了比較,數值模擬結果表明,蟻群演算法具有一種新的模擬進化優化方法的有效性和應用價值。


參考下蟻群訓練BP網路的代碼。

Ⅱ 有沒有人有多目標人工蜂群演算法的MATLAB代碼。發我一份 不勝感激!!

http://emuch.net/bbs/attachment.php?tid=3808850&aid=11221&pay=yes
裡面有多個文件
其中之一
%/* ABC algorithm coded using MATLAB language */

%/* Artificial Bee Colony (ABC) is one of the most recently defined algorithms by Dervis Karaboga in 2005, motivated by the intelligent behavior of honey bees. */

%/* Referance Papers*/

%/*D. Karaboga, AN IDEA BASED ON HONEY BEE SWARM FOR NUMERICAL OPTIMIZATION,TECHNICAL REPORT-TR06, Erciyes University, Engineering Faculty, Computer Engineering Department 2005.*/

%/*D. Karaboga, B. Basturk, A powerful and Efficient Algorithm for Numerical Function Optimization: Artificial Bee Colony (ABC) Algorithm, Journal of Global Optimization, Volume:39, Issue:3,pp:459-171, November 2007,ISSN:0925-5001 , doi: 10.1007/s10898-007-9149-x */

%/*D. Karaboga, B. Basturk, On The Performance Of Artificial Bee Colony (ABC) Algorithm, Applied Soft Computing,Volume 8, Issue 1, January 2008, Pages 687-697. */

%/*D. Karaboga, B. Akay, A Comparative Study of Artificial Bee Colony Algorithm, Applied Mathematics and Computation, 214, 108-132, 2009. */

%/*Copyright ?2009 Erciyes University, Intelligent Systems Research Group, The Dept. of Computer Engineering*/

%/*Contact:
%Dervis Karaboga ([email protected] )
%Bahriye Basturk Akay ([email protected])
%*/

clear all
close all
clc

%/* Control Parameters of ABC algorithm*/
NP=20; %/* The number of colony size (employed bees+onlooker bees)*/
FoodNumber=NP/2; %/*The number of food sources equals the half of the colony size*/
limit=100; %/*A food source which could not be improved through "limit" trials is abandoned by its employed bee*/
maxCycle=2500; %/*The number of cycles for foraging {a stopping criteria}*/

%/* Problem specific variables*/
objfun='Sphere'; %cost function to be optimized
D=100; %/*The number of parameters of the problem to be optimized*/
ub=ones(1,D)*100; %/*lower bounds of the parameters. */
lb=ones(1,D)*(-100);%/*upper bound of the parameters.*/

runtime=1;%/*Algorithm can be run many times in order to see its robustness*/

%Foods [FoodNumber][D]; /*Foods is the population of food sources. Each row of Foods matrix is a vector holding D parameters to be optimized. The number of rows of Foods matrix equals to the FoodNumber*/
%ObjVal[FoodNumber]; /*f is a vector holding objective function values associated with food sources */
%Fitness[FoodNumber]; /*fitness is a vector holding fitness (quality) values associated with food sources*/
%trial[FoodNumber]; /*trial is a vector holding trial numbers through which solutions can not be improved*/
%prob[FoodNumber]; /*prob is a vector holding probabilities of food sources (solutions) to be chosen*/
%solution [D]; /*New solution (neighbour) proced by v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) j is a randomly chosen parameter and k is a randomlu chosen solution different from i*/
%ObjValSol; /*Objective function value of new solution*/
%FitnessSol; /*Fitness value of new solution*/
%neighbour, param2change; /*param2change corrresponds to j, neighbour corresponds to k in equation v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})*/
%GlobalMin; /*Optimum solution obtained by ABC algorithm*/
%GlobalParams[D]; /*Parameters of the optimum solution*/
%GlobalMins[runtime]; /*GlobalMins holds the GlobalMin of each run in multiple runs*/

GlobalMins=zeros(1,runtime);

for r=1:runtime

% /*All food sources are initialized */
%/*Variables are initialized in the range [lb,ub]. If each parameter has different range, use arrays lb[j], ub[j] instead of lb and ub */

Range = repmat((ub-lb),[FoodNumber 1]);
Lower = repmat(lb, [FoodNumber 1]);
Foods = rand(FoodNumber,D) .* Range + Lower;

ObjVal=feval(objfun,Foods);
Fitness=calculateFitness(ObjVal);

%reset trial counters
trial=zeros(1,FoodNumber);

%/*The best food source is memorized*/
BestInd=find(ObjVal==min(ObjVal));
BestInd=BestInd(end);
GlobalMin=ObjVal(BestInd);
GlobalParams=Foods(BestInd,:);

iter=1;
while ((iter <= maxCycle)),

%%%%%%%%% EMPLOYED BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%
for i=1:(FoodNumber)

%/*The parameter to be changed is determined randomly*/
Param2Change=fix(rand*D)+1;

%/*A randomly chosen solution is used in procing a mutant solution of the solution i*/
neighbour=fix(rand*(FoodNumber))+1;

%/*Randomly selected solution must be different from the solution i*/
while(neighbour==i)
neighbour=fix(rand*(FoodNumber))+1;
end;

sol=Foods(i,:);
% /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;

% /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
ind=find(sol<lb);
sol(ind)=lb(ind);
ind=find(sol>ub);
sol(ind)=ub(ind);

%evaluate new solution
ObjValSol=feval(objfun,sol);
FitnessSol=calculateFitness(ObjValSol);

% /*a greedy selection is applied between the current solution i and its mutant*/
if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
Foods(i,:)=sol;
Fitness(i)=FitnessSol;
ObjVal(i)=ObjValSol;
trial(i)=0;
else
trial(i)=trial(i)+1; %/*if the solution i can not be improved, increase its trial counter*/
end;

end;

%%%%%%%%%%%%%%%%%%%%%%%% CalculateProbabilities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%/* A food source is chosen with the probability which is proportioal to its quality*/
%/*Different schemes can be used to calculate the probability values*/
%/*For example prob(i)=fitness(i)/sum(fitness)*/
%/*or in a way used in the metot below prob(i)=a*fitness(i)/max(fitness)+b*/
%/*probability values are calculated by using fitness values and normalized by dividing maximum fitness value*/

prob=(0.9.*Fitness./max(Fitness))+0.1;

%%%%%%%%%%%%%%%%%%%%%%%% ONLOOKER BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

i=1;
t=0;
while(t<FoodNumber)
if(rand<prob(i))
t=t+1;
%/*The parameter to be changed is determined randomly*/
Param2Change=fix(rand*D)+1;

%/*A randomly chosen solution is used in procing a mutant solution of the solution i*/
neighbour=fix(rand*(FoodNumber))+1;

%/*Randomly selected solution must be different from the solution i*/
while(neighbour==i)
neighbour=fix(rand*(FoodNumber))+1;
end;

sol=Foods(i,:);
% /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;

% /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
ind=find(sol<lb);
sol(ind)=lb(ind);
ind=find(sol>ub);
sol(ind)=ub(ind);

%evaluate new solution
ObjValSol=feval(objfun,sol);
FitnessSol=calculateFitness(ObjValSol);

% /*a greedy selection is applied between the current solution i and its mutant*/
if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
Foods(i,:)=sol;
Fitness(i)=FitnessSol;
ObjVal(i)=ObjValSol;
trial(i)=0;
else
trial(i)=trial(i)+1; %/*if the solution i can not be improved, increase its trial counter*/
end;
end;

i=i+1;
if (i==(FoodNumber)+1)
i=1;
end;
end;

%/*The best food source is memorized*/
ind=find(ObjVal==min(ObjVal));
ind=ind(end);
if (ObjVal(ind)<GlobalMin)
GlobalMin=ObjVal(ind);
GlobalParams=Foods(ind,:);
end;

%%%%%%%%%%%% SCOUT BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%/*determine the food sources whose trial counter exceeds the "limit" value.
%In Basic ABC, only one scout is allowed to occur in each cycle*/

ind=find(trial==max(trial));
ind=ind(end);
if (trial(ind)>limit)
Bas(ind)=0;
sol=(ub-lb).*rand(1,D)+lb;
ObjValSol=feval(objfun,sol);
FitnessSol=calculateFitness(ObjValSol);
Foods(ind,:)=sol;
Fitness(ind)=FitnessSol;
ObjVal(ind)=ObjValSol;
end;

fprintf('Ýter=%d ObjVal=%g\n',iter,GlobalMin);
iter=iter+1;

end % End of ABC

GlobalMins(r)=GlobalMin;
end; %end of runs

save all

Ⅲ java人工蜂群演算法求解TSP問題

一、人工蜂群演算法的介紹

人工蜂群演算法(Artificial Bee Colony, ABC)是由Karaboga於2005年提出的一種新穎的基於群智能的全局優化演算法,其直觀背景來源於蜂群的采蜜行為,蜜蜂根據各自的分工進行不同的活動,並實現蜂群信息的共享和交流,從而找到問題的最優解。人工蜂群演算法屬於群智能演算法的一種。

二、人工蜂群演算法的原理

1、原理

標準的ABC演算法通過模擬實際蜜蜂的采蜜機制將人工蜂群分為3類: 采蜜蜂、觀察蜂和偵察蜂。整個蜂群的目標是尋找花蜜量最大的蜜源。在標準的ABC演算法中,采蜜蜂利用先前的蜜源信息尋找新的蜜源並與觀察蜂分享蜜源信息;觀察蜂在蜂房中等待並依據采蜜蜂分享的信息尋找新的蜜源;偵查蜂的任務是尋找一個新的有價值的蜜源,它們在蜂房附近隨機地尋找蜜源。

假設問題的解空間是

代碼:

[cpp]view plain

  • #include<iostream>

  • #include<time.h>

  • #include<stdlib.h>

  • #include<cmath>

  • #include<fstream>

  • #include<iomanip>

  • usingnamespacestd;

  • constintNP=40;//種群的規模,采蜜蜂+觀察蜂

  • constintFoodNumber=NP/2;//食物的數量,為采蜜蜂的數量

  • constintlimit=20;//限度,超過這個限度沒有更新采蜜蜂變成偵查蜂

  • constintmaxCycle=10000;//停止條件

  • /*****函數的特定參數*****/

  • constintD=2;//函數的參數個數

  • constdoublelb=-100;//函數的下界

  • constdoubleub=100;//函數的上界

  • doubleresult[maxCycle]={0};

  • /*****種群的定義****/

  • structBeeGroup

  • {

  • doublecode[D];//函數的維數

  • doubletrueFit;//記錄真實的最小值

  • doublefitness;

  • doublerfitness;//相對適應值比例

  • inttrail;//表示實驗的次數,用於與limit作比較

  • }Bee[FoodNumber];

  • BeeGroupNectarSource[FoodNumber];//蜜源,注意:一切的修改都是針對蜜源而言的

  • BeeGroupEmployedBee[FoodNumber];//采蜜蜂

  • BeeGroupOnLooker[FoodNumber];//觀察蜂

  • BeeGroupBestSource;//記錄最好蜜源

  • /*****函數的聲明*****/

  • doublerandom(double,double);//產生區間上的隨機數

  • voidinitilize();//初始化參數

  • doublecalculationTruefit(BeeGroup);//計算真實的函數值

  • doublecalculationFitness(double);//計算適應值

  • voidCalculateProbabilities();//計算輪盤賭的概率

  • voidevalueSource();//評價蜜源

  • voidsendEmployedBees();

  • voidsendOnlookerBees();

  • voidsendScoutBees();

  • voidMemorizeBestSource();

  • /*******主函數*******/

  • intmain()

  • {

  • ofstreamoutput;

  • output.open("dataABC.txt");

  • srand((unsigned)time(NULL));

  • initilize();//初始化

  • MemorizeBestSource();//保存最好的蜜源

  • //主要的循環

  • intgen=0;

  • while(gen<maxCycle)

  • {

  • sendEmployedBees();

  • CalculateProbabilities();

  • sendOnlookerBees();

  • MemorizeBestSource();

  • sendScoutBees();

  • MemorizeBestSource();

  • output<<setprecision(30)<<BestSource.trueFit<<endl;

  • gen++;

  • }

  • output.close();

  • cout<<"運行結束!!"<<endl;

  • return0;

  • }

  • /*****函數的實現****/

  • doublerandom(doublestart,doubleend)//隨機產生區間內的隨機數

  • {

  • returnstart+(end-start)*rand()/(RAND_MAX+1.0);

  • }

  • voidinitilize()//初始化參數

  • {

  • inti,j;

  • for(i=0;i<FoodNumber;i++)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=random(lb,ub);

  • EmployedBee[i].code[j]=NectarSource[i].code[j];

  • OnLooker[i].code[j]=NectarSource[i].code[j];

  • BestSource.code[j]=NectarSource[0].code[j];

  • }

  • /****蜜源的初始化*****/

  • NectarSource[i].trueFit=calculationTruefit(NectarSource[i]);

  • NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit);

  • NectarSource[i].rfitness=0;

  • NectarSource[i].trail=0;

  • /****采蜜蜂的初始化*****/

  • EmployedBee[i].trueFit=NectarSource[i].trueFit;

  • EmployedBee[i].fitness=NectarSource[i].fitness;

  • EmployedBee[i].rfitness=NectarSource[i].rfitness;

  • EmployedBee[i].trail=NectarSource[i].trail;

  • /****觀察蜂的初始化****/

  • OnLooker[i].trueFit=NectarSource[i].trueFit;

  • OnLooker[i].fitness=NectarSource[i].fitness;

  • OnLooker[i].rfitness=NectarSource[i].rfitness;

  • OnLooker[i].trail=NectarSource[i].trail;

  • }

  • /*****最優蜜源的初始化*****/

  • BestSource.trueFit=NectarSource[0].trueFit;

  • BestSource.fitness=NectarSource[0].fitness;

  • BestSource.rfitness=NectarSource[0].rfitness;

  • BestSource.trail=NectarSource[0].trail;

  • }

  • doublecalculationTruefit(BeeGroupbee)//計算真實的函數值

  • {

  • doubletruefit=0;

  • /******測試函數1******/

  • truefit=0.5+(sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))-0.5)

  • /((1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*(1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1])));

  • returntruefit;

  • }

  • doublecalculationFitness(doubletruefit)//計算適應值

  • {

  • doublefitnessResult=0;

  • if(truefit>=0)

  • {

  • fitnessResult=1/(truefit+1);

  • }else

  • {

  • fitnessResult=1+abs(truefit);

  • }

  • returnfitnessResult;

  • }

  • voidsendEmployedBees()//修改采蜜蜂的函數

  • {

  • inti,j,k;

  • intparam2change;//需要改變的維數

  • doubleRij;//[-1,1]之間的隨機數

  • for(i=0;i<FoodNumber;i++)

  • {

  • param2change=(int)random(0,D);//隨機選取需要改變的維數

  • /******選取不等於i的k********/

  • while(1)

  • {

  • k=(int)random(0,FoodNumber);

  • if(k!=i)

  • {

  • break;

  • }

  • }

  • for(j=0;j<D;j++)

  • {

  • EmployedBee[i].code[j]=NectarSource[i].code[j];

  • }

  • /*******采蜜蜂去更新信息*******/

  • Rij=random(-1,1);

  • EmployedBee[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);

  • /*******判斷是否越界********/

  • if(EmployedBee[i].code[param2change]>ub)

  • {

  • EmployedBee[i].code[param2change]=ub;

  • }

  • if(EmployedBee[i].code[param2change]<lb)

  • {

  • EmployedBee[i].code[param2change]=lb;

  • }

  • EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]);

  • EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit);

  • /******貪婪選擇策略*******/

  • if(EmployedBee[i].trueFit<NectarSource[i].trueFit)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=EmployedBee[i].code[j];

  • }

  • NectarSource[i].trail=0;

  • NectarSource[i].trueFit=EmployedBee[i].trueFit;

  • NectarSource[i].fitness=EmployedBee[i].fitness;

  • }else

  • {

  • NectarSource[i].trail++;

  • }

  • }

  • }

  • voidCalculateProbabilities()//計算輪盤賭的選擇概率

  • {

  • inti;

  • doublemaxfit;

  • maxfit=NectarSource[0].fitness;

  • for(i=1;i<FoodNumber;i++)

  • {

  • if(NectarSource[i].fitness>maxfit)

  • maxfit=NectarSource[i].fitness;

  • }

  • for(i=0;i<FoodNumber;i++)

  • {

  • NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1;

  • }

  • }

  • voidsendOnlookerBees()//采蜜蜂與觀察蜂交流信息,觀察蜂更改信息

  • {

  • inti,j,t,k;

  • doubleR_choosed;//被選中的概率

  • intparam2change;//需要被改變的維數

  • doubleRij;//[-1,1]之間的隨機數

  • i=0;

  • t=0;

  • while(t<FoodNumber)

  • {

  • R_choosed=random(0,1);

  • if(R_choosed<NectarSource[i].rfitness)//根據被選擇的概率選擇

  • {

  • t++;

  • param2change=(int)random(0,D);

  • /******選取不等於i的k********/

  • while(1)

  • {

  • k=(int)random(0,FoodNumber);

  • if(k!=i)

  • {

  • break;

  • }

  • }

  • for(j=0;j<D;j++)

  • {

  • OnLooker[i].code[j]=NectarSource[i].code[j];

  • }

  • /****更新******/

  • Rij=random(-1,1);

  • OnLooker[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);

  • /*******判斷是否越界*******/

  • if(OnLooker[i].code[param2change]<lb)

  • {

  • OnLooker[i].code[param2change]=lb;

  • }

  • if(OnLooker[i].code[param2change]>ub)

  • {

  • OnLooker[i].code[param2change]=ub;

  • }

  • OnLooker[i].trueFit=calculationTruefit(OnLooker[i]);

  • OnLooker[i].fitness=calculationFitness(OnLooker[i].trueFit);

  • /****貪婪選擇策略******/

  • if(OnLooker[i].trueFit<NectarSource[i].trueFit)

  • {

  • for(j=0;j<D;j++)

  • {

  • NectarSource[i].code[j]=OnLooker[i].code[j];

  • }

  • NectarSource[i].trail=0;

  • NectarSource[i].trueFit=OnLooker[i].trueFit;

  • NectarSource[i].fitness=OnLooker[i].fitness;

  • }else

  • {

  • NectarSource[i].trail++;

  • }

  • }

  • i++;

  • if(i==FoodNumber)

  • {

  • i=0;

  • }

  • }

  • }

  • Ⅳ 蜂群演算法屬於初級還是高級

    人工蜂群演算法(Artificial Bee Colony, ABC)是由Karaboga於2005年提出的一種新穎的基於群智能的全局優化演算法,版其直觀背景來源於權蜂群的采蜜行為,蜜蜂根據各自的分工進行不同的活動,並實現蜂群信息的共享和交流,從而找到問題的最優解。人工蜂群演算法屬於群智能演算法的一種。

    Ⅳ 人工蜂群演算法可以解什麼樣的函數

    都是一樣的,為什麼有的會帶上「人工」呢?只是因為這些只能演算法都是「人」仿照動物行為而創造的,所以有時候才會帶上「人工」兩個字。但是指的是一個東西。例如神經網路,也有人喜歡說是人工神經網路

    Ⅵ 人工蜂群演算法matlab蜂群種群大小怎麼設定

    %/* ABC algorithm coded using MATLAB language */

    %/* Artificial Bee Colony (ABC) is one of the most recently defined algorithms by Dervis Karaboga in 2005, motivated by the intelligent behavior of honey bees. */

    %/* Referance Papers*/

    %/*D. Karaboga, AN IDEA BASED ON HONEY BEE SWARM FOR NUMERICAL OPTIMIZATION,TECHNICAL REPORT-TR06, Erciyes University, Engineering Faculty, Computer Engineering Department 2005.*/

    %/*D. Karaboga, B. Basturk, A powerful and Efficient Algorithm for Numerical Function Optimization: Artificial Bee Colony (ABC) Algorithm, Journal of Global Optimization, Volume:39, Issue:3,pp:459-171, November 2007,ISSN:0925-5001 , doi: 10.1007/s10898-007-9149-x */

    %/*D. Karaboga, B. Basturk, On The Performance Of Artificial Bee Colony (ABC) Algorithm, Applied Soft Computing,Volume 8, Issue 1, January 2008, Pages 687-697. */

    %/*D. Karaboga, B. Akay, A Comparative Study of Artificial Bee Colony Algorithm, Applied Mathematics and Computation, 214, 108-132, 2009. */

    %/*Copyright ?2009 Erciyes University, Intelligent Systems Research Group, The Dept. of Computer Engineering*/

    %/*Contact:
    %Dervis Karaboga ([email protected] )
    %Bahriye Basturk Akay ([email protected])
    %*/

    clear all
    close all
    clc

    %/* Control Parameters of ABC algorithm*/
    NP=20; %/* The number of colony size (employed bees+onlooker bees)*/
    FoodNumber=NP/2; %/*The number of food sources equals the half of the colony size*/
    limit=100; %/*A food source which could not be improved through "limit" trials is abandoned by its employed bee*/
    maxCycle=2500; %/*The number of cycles for foraging {a stopping criteria}*/

    %/* Problem specific variables*/
    objfun='Sphere'; %cost function to be optimized
    D=100; %/*The number of parameters of the problem to be optimized*/
    ub=ones(1,D)*100; %/*lower bounds of the parameters. */
    lb=ones(1,D)*(-100);%/*upper bound of the parameters.*/

    runtime=1;%/*Algorithm can be run many times in order to see its robustness*/

    %Foods [FoodNumber][D]; /*Foods is the population of food sources. Each row of Foods matrix is a vector holding D parameters to be optimized. The number of rows of Foods matrix equals to the FoodNumber*/
    %ObjVal[FoodNumber]; /*f is a vector holding objective function values associated with food sources */
    %Fitness[FoodNumber]; /*fitness is a vector holding fitness (quality) values associated with food sources*/
    %trial[FoodNumber]; /*trial is a vector holding trial numbers through which solutions can not be improved*/
    %prob[FoodNumber]; /*prob is a vector holding probabilities of food sources (solutions) to be chosen*/
    %solution [D]; /*New solution (neighbour) proced by v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) j is a randomly chosen parameter and k is a randomlu chosen solution different from i*/
    %ObjValSol; /*Objective function value of new solution*/
    %FitnessSol; /*Fitness value of new solution*/
    %neighbour, param2change; /*param2change corrresponds to j, neighbour corresponds to k in equation v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})*/
    %GlobalMin; /*Optimum solution obtained by ABC algorithm*/
    %GlobalParams[D]; /*Parameters of the optimum solution*/
    %GlobalMins[runtime]; /*GlobalMins holds the GlobalMin of each run in multiple runs*/

    GlobalMins=zeros(1,runtime);

    for r=1:runtime

    % /*All food sources are initialized */
    %/*Variables are initialized in the range [lb,ub]. If each parameter has different range, use arrays lb[j], ub[j] instead of lb and ub */

    Range = repmat((ub-lb),[FoodNumber 1]);
    Lower = repmat(lb, [FoodNumber 1]);
    Foods = rand(FoodNumber,D) .* Range + Lower;

    ObjVal=feval(objfun,Foods);
    Fitness=calculateFitness(ObjVal);

    %reset trial counters
    trial=zeros(1,FoodNumber);

    %/*The best food source is memorized*/
    BestInd=find(ObjVal==min(ObjVal));
    BestInd=BestInd(end);
    GlobalMin=ObjVal(BestInd);
    GlobalParams=Foods(BestInd,:);

    iter=1;
    while ((iter <= maxCycle)),

    %%%%%%%%% EMPLOYED BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%
    for i=1:(FoodNumber)

    %/*The parameter to be changed is determined randomly*/
    Param2Change=fix(rand*D)+1;

    %/*A randomly chosen solution is used in procing a mutant solution of the solution i*/
    neighbour=fix(rand*(FoodNumber))+1;

    %/*Randomly selected solution must be different from the solution i*/
    while(neighbour==i)
    neighbour=fix(rand*(FoodNumber))+1;
    end;

    sol=Foods(i,:);
    % /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
    sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;

    % /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
    ind=find(sol<lb);
    sol(ind)=lb(ind);
    ind=find(sol>ub);
    sol(ind)=ub(ind);

    %evaluate new solution
    ObjValSol=feval(objfun,sol);
    FitnessSol=calculateFitness(ObjValSol);

    % /*a greedy selection is applied between the current solution i and its mutant*/
    if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
    Foods(i,:)=sol;
    Fitness(i)=FitnessSol;
    ObjVal(i)=ObjValSol;
    trial(i)=0;
    else
    trial(i)=trial(i)+1; %/*if the solution i can not be improved, increase its trial counter*/
    end;

    end;

    %%%%%%%%%%%%%%%%%%%%%%%% CalculateProbabilities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %/* A food source is chosen with the probability which is proportioal to its quality*/
    %/*Different schemes can be used to calculate the probability values*/
    %/*For example prob(i)=fitness(i)/sum(fitness)*/
    %/*or in a way used in the metot below prob(i)=a*fitness(i)/max(fitness)+b*/
    %/*probability values are calculated by using fitness values and normalized by dividing maximum fitness value*/

    prob=(0.9.*Fitness./max(Fitness))+0.1;

    %%%%%%%%%%%%%%%%%%%%%%%% ONLOOKER BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    i=1;
    t=0;
    while(t<FoodNumber)
    if(rand<prob(i))
    t=t+1;
    %/*The parameter to be changed is determined randomly*/
    Param2Change=fix(rand*D)+1;

    %/*A randomly chosen solution is used in procing a mutant solution of the solution i*/
    neighbour=fix(rand*(FoodNumber))+1;

    %/*Randomly selected solution must be different from the solution i*/
    while(neighbour==i)
    neighbour=fix(rand*(FoodNumber))+1;
    end;

    sol=Foods(i,:);
    % /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
    sol(Param2Change)=Foods(i,Param2Change)+(Foods(i,Param2Change)-Foods(neighbour,Param2Change))*(rand-0.5)*2;

    % /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
    ind=find(sol<lb);
    sol(ind)=lb(ind);
    ind=find(sol>ub);
    sol(ind)=ub(ind);

    %evaluate new solution
    ObjValSol=feval(objfun,sol);
    FitnessSol=calculateFitness(ObjValSol);

    % /*a greedy selection is applied between the current solution i and its mutant*/
    if (FitnessSol>Fitness(i)) %/*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
    Foods(i,:)=sol;
    Fitness(i)=FitnessSol;
    ObjVal(i)=ObjValSol;
    trial(i)=0;
    else
    trial(i)=trial(i)+1; %/*if the solution i can not be improved, increase its trial counter*/
    end;
    end;

    i=i+1;
    if (i==(FoodNumber)+1)
    i=1;
    end;
    end;

    %/*The best food source is memorized*/
    ind=find(ObjVal==min(ObjVal));
    ind=ind(end);
    if (ObjVal(ind)<GlobalMin)
    GlobalMin=ObjVal(ind);
    GlobalParams=Foods(ind,:);
    end;

    %%%%%%%%%%%% SCOUT BEE PHASE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    %/*determine the food sources whose trial counter exceeds the "limit" value.
    %In Basic ABC, only one scout is allowed to occur in each cycle*/

    ind=find(trial==max(trial));
    ind=ind(end);
    if (trial(ind)>limit)
    Bas(ind)=0;
    sol=(ub-lb).*rand(1,D)+lb;
    ObjValSol=feval(objfun,sol);
    FitnessSol=calculateFitness(ObjValSol);
    Foods(ind,:)=sol;
    Fitness(ind)=FitnessSol;
    ObjVal(ind)=ObjValSol;
    end;

    fprintf('Ýter=%d ObjVal=%g\n',iter,GlobalMin);
    iter=iter+1;

    end % End of ABC

    GlobalMins(r)=GlobalMin;
    end; %end of runs

    save all

    Ⅶ 人工蜂群演算法適合在srm中應用嗎

    蜜蜂是一種群居昆蟲,雖然單個昆蟲的行為極其簡單,但是由單個簡單的個體所組成的群體卻表現出極其復雜的行為。真實的蜜蜂種群能夠在任何環境下,以極高的效率從食物源(花朵)中採集花蜜;同時,它們能適應環境的改變。
    蜂群產生群體智慧的最小搜索模型包含基本的三個組成要素:食物源、被僱傭的蜜蜂(employed foragers)和未被僱傭的蜜蜂(unemployed foragers);兩種最為基本的行為模型:為食物源招募(recruit)蜜蜂和放棄(abandon)某個食物源。
    (1)食物源:食物源的價值由多方面的因素決定,如:它離蜂巢的遠近,包含花蜜的豐富程度和獲得花蜜的難易程度。使用單一的參數,食物源的「收益率」(profitability),來代表以上各個因素。
    (2)被僱用的蜜蜂:也稱引領蜂(Leader),其與所採集的食物源一一對應。引領蜂儲存有某一個食物源的相關信息(相對於蜂巢的距離、方向、食物源的豐富程度等)並且將這些信息以一定的概率與其他蜜蜂分享。
    (3)未被僱用的蜜蜂:其主要任務是尋找和開採食物源。有兩種未被僱用的蜜蜂:偵查蜂(Scouter)和跟隨蜂(Follower)。偵察蜂搜索蜂巢附近的新食物源;跟隨蜂等在蜂巢裡面並通過與引領蜂分享相關信息找到食物源。一般情況下,偵察蜂的平均數目是蜂群的5%-20%。

    Ⅷ 人工蜂群演算法里太多比喻了,能不能就演算法本身的步驟來講講

    直接給你JAVA代碼吧,看的簡單易懂
    import java.lang.Math;

    public class beeColony {

    /* Control Parameters of ABC algorithm*/
    int NP=20; /* The number of colony size (employed bees+onlooker bees)*/
    int FoodNumber = NP/2; /*The number of food sources equals the half of the colony size*/
    int limit = 100; /*A food source which could not be improved through "limit" trials is abandoned by its employed bee*/
    int maxCycle = 2500; /*The number of cycles for foraging {a stopping criteria}*/

    /* Problem specific variables*/
    int D = 100; /*The number of parameters of the problem to be optimized*/
    double lb = -5.12; /*lower bound of the parameters. */
    double ub = 5.12; /*upper bound of the parameters. lb and ub can be defined as arrays for the problems of which parameters have different bounds*/

    int runtime = 30; /*Algorithm can be run many times in order to see its robustness*/

    int dizi1[]=new int[10];
    double Foods[][]=new double[FoodNumber][D]; /*Foods is the population of food sources. Each row of Foods matrix is a vector holding D parameters to be optimized. The number of rows of Foods matrix equals to the FoodNumber*/
    double f[]=new double[FoodNumber]; /*f is a vector holding objective function values associated with food sources */
    double fitness[]=new double[FoodNumber]; /*fitness is a vector holding fitness (quality) values associated with food sources*/
    double trial[]=new double[FoodNumber]; /*trial is a vector holding trial numbers through which solutions can not be improved*/
    double prob[]=new double[FoodNumber]; /*prob is a vector holding probabilities of food sources (solutions) to be chosen*/
    double solution[]=new double[D]; /*New solution (neighbour) proced by v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) j is a randomly chosen parameter and k is a randomlu chosen solution different from i*/

    double ObjValSol; /*Objective function value of new solution*/
    double FitnessSol; /*Fitness value of new solution*/
    int neighbour, param2change; /*param2change corrresponds to j, neighbour corresponds to k in equation v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})*/

    double GlobalMin; /*Optimum solution obtained by ABC algorithm*/
    double GlobalParams[]=new double[D]; /*Parameters of the optimum solution*/
    double GlobalMins[]=new double[runtime];
    /*GlobalMins holds the GlobalMin of each run in multiple runs*/
    double r; /*a random number in the range [0,1)*/

    /*a function pointer returning double and taking a D-dimensional array as argument */
    /*If your function takes additional arguments then change function pointer definition and lines calling "...=function(solution);" in the code*/

    // typedef double (*FunctionCallback)(double sol[D]);

    /*benchmark functions */

    // double sphere(double sol[D]);
    // double Rosenbrock(double sol[D]);
    // double Griewank(double sol[D]);
    // double Rastrigin(double sol[D]);

    /*Write your own objective function name instead of sphere*/
    // FunctionCallback function = &sphere;

    /*Fitness function*/
    double CalculateFitness(double fun)
    {
    double result=0;
    if(fun>=0)
    {
    result=1/(fun+1);
    }
    else
    {

    result=1+Math.abs(fun);
    }
    return result;
    }

    /*The best food source is memorized*/
    void MemorizeBestSource()
    {
    int i,j;

    for(i=0;i<FoodNumber;i++)
    {
    if (f[i]<GlobalMin)
    {
    GlobalMin=f[i];
    for(j=0;j<D;j++)
    GlobalParams[j]=Foods[i][j];
    }
    }
    }

    /*Variables are initialized in the range [lb,ub]. If each parameter has different range, use arrays lb[j], ub[j] instead of lb and ub */
    /* Counters of food sources are also initialized in this function*/

    void init(int index)
    {
    int j;
    for (j=0;j<D;j++)
    {
    r = ( (double)Math.random()*32767 / ((double)32767+(double)(1)) );
    Foods[index][j]=r*(ub-lb)+lb;
    solution[j]=Foods[index][j];
    }
    f[index]=calculateFunction(solution);
    fitness[index]=CalculateFitness(f[index]);
    trial[index]=0;
    }

    /*All food sources are initialized */
    void initial()
    {
    int i;
    for(i=0;i<FoodNumber;i++)
    {
    init(i);
    }
    GlobalMin=f[0];
    for(i=0;i<D;i++)
    GlobalParams[i]=Foods[0][i];

    }

    void SendEmployedBees()
    {
    int i,j;
    /*Employed Bee Phase*/
    for (i=0;i<FoodNumber;i++)
    {
    /*The parameter to be changed is determined randomly*/
    r = ((double) Math.random()*32767 / ((double)(32767)+(double)(1)) );
    param2change=(int)(r*D);

    /*A randomly chosen solution is used in procing a mutant solution of the solution i*/
    r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);

    /*Randomly selected solution must be different from the solution i*/
    // while(neighbour==i)
    // {
    // r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    // neighbour=(int)(r*FoodNumber);
    // }
    for(j=0;j<D;j++)
    solution[j]=Foods[i][j];

    /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
    r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    solution[param2change]=Foods[i][param2change]+(Foods[i][param2change]-Foods[neighbour][param2change])*(r-0.5)*2;

    /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
    if (solution[param2change]<lb)
    solution[param2change]=lb;
    if (solution[param2change]>ub)
    solution[param2change]=ub;
    ObjValSol=calculateFunction(solution);
    FitnessSol=CalculateFitness(ObjValSol);

    /*a greedy selection is applied between the current solution i and its mutant*/
    if (FitnessSol>fitness[i])
    {

    /*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
    trial[i]=0;
    for(j=0;j<D;j++)
    Foods[i][j]=solution[j];
    f[i]=ObjValSol;
    fitness[i]=FitnessSol;
    }
    else
    { /*if the solution i can not be improved, increase its trial counter*/
    trial[i]=trial[i]+1;
    }

    }

    /*end of employed bee phase*/

    }

    /* A food source is chosen with the probability which is proportioal to its quality*/
    /*Different schemes can be used to calculate the probability values*/
    /*For example prob(i)=fitness(i)/sum(fitness)*/
    /*or in a way used in the metot below prob(i)=a*fitness(i)/max(fitness)+b*/
    /*probability values are calculated by using fitness values and normalized by dividing maximum fitness value*/
    void CalculateProbabilities()
    {
    int i;
    double maxfit;
    maxfit=fitness[0];
    for (i=1;i<FoodNumber;i++)
    {
    if (fitness[i]>maxfit)
    maxfit=fitness[i];
    }

    for (i=0;i<FoodNumber;i++)
    {
    prob[i]=(0.9*(fitness[i]/maxfit))+0.1;
    }

    }

    void SendOnlookerBees()
    {

    int i,j,t;
    i=0;
    t=0;
    /*onlooker Bee Phase*/
    while(t<FoodNumber)
    {

    r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    if(r<prob[i]) /*choose a food source depending on its probability to be chosen*/
    {
    t++;

    /*The parameter to be changed is determined randomly*/
    r = ((double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    param2change=(int)(r*D);

    /*A randomly chosen solution is used in procing a mutant solution of the solution i*/
    r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);

    /*Randomly selected solution must be different from the solution i*/
    while(neighbour == i)
    {
    //System.out.println(Math.random()*32767+" "+32767);
    r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);
    }
    for(j=0;j<D;j++)
    solution[j]=Foods[i][j];

    /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
    r = ( (double)Math.random()*32767 / ((double)(32767)+(double)(1)) );
    solution[param2change]=Foods[i][param2change]+(Foods[i][param2change]-Foods[neighbour][param2change])*(r-0.5)*2;

    /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
    if (solution[param2change]<lb)
    solution[param2change]=lb;
    if (solution[param2change]>ub)
    solution[param2change]=ub;
    ObjValSol=calculateFunction(solution);
    FitnessSol=CalculateFitness(ObjValSol);

    /*a greedy selection is applied between the current solution i and its mutant*/
    if (FitnessSol>fitness[i])
    {
    /*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
    trial[i]=0;
    for(j=0;j<D;j++)
    Foods[i][j]=solution[j];
    f[i]=ObjValSol;
    fitness[i]=FitnessSol;
    }
    else
    { /*if the solution i can not be improved, increase its trial counter*/
    trial[i]=trial[i]+1;
    }
    } /*if */
    i++;
    if (i==FoodNumber-1)
    i=0;
    }/*while*/

    /*end of onlooker bee phase */
    }

    /*determine the food sources whose trial counter exceeds the "limit" value. In Basic ABC, only one scout is allowed to occur in each cycle*/
    void SendScoutBees()
    {
    int maxtrialindex,i;
    maxtrialindex=0;
    for (i=1;i<FoodNumber;i++)
    {
    if (trial[i]>trial[maxtrialindex])
    maxtrialindex=i;
    }
    if(trial[maxtrialindex]>=limit)
    {
    init(maxtrialindex);
    }
    }

    double calculateFunction(double sol[])
    {
    return Rastrigin (sol);
    }
    double sphere(double sol[])
    {
    int j;
    double top=0;
    for(j=0;j<D;j++)
    {
    top=top+sol[j]*sol[j];
    }
    return top;
    }

    double Rosenbrock(double sol[])
    {
    int j;
    double top=0;
    for(j=0;j<D-1;j++)
    {
    top=top+100*Math.pow((sol[j+1]-Math.pow((sol[j]),(double)2)),(double)2)+Math.pow((sol[j]-1),(double)2);
    }
    return top;
    }

    double Griewank(double sol[])
    {
    int j;
    double top1,top2,top;
    top=0;
    top1=0;
    top2=1;
    for(j=0;j<D;j++)
    {
    top1=top1+Math.pow((sol[j]),(double)2);
    top2=top2*Math.cos((((sol[j])/Math.sqrt((double)(j+1)))*Math.PI)/180);

    }
    top=(1/(double)4000)*top1-top2+1;
    return top;
    }

    double Rastrigin(double sol[])
    {
    int j;
    double top=0;

    for(j=0;j<D;j++)
    {
    top=top+(Math.pow(sol[j],(double)2)-10*Math.cos(2*Math.PI*sol[j])+10);
    }
    return top;
    }
    }

    使用方法是:
    public class test {
    static beeColony bee=new beeColony();

    public static void main(String[] args) {
    int iter=0;
    int run=0;
    int j=0;
    double mean=0;
    //srand(time(NULL));
    for(run=0;run<bee.runtime;run++)
    {
    bee.initial();
    bee.MemorizeBestSource();
    for (iter=0;iter<bee.maxCycle;iter++)
    {
    bee.SendEmployedBees();
    bee.CalculateProbabilities();
    bee.SendOnlookerBees();
    bee.MemorizeBestSource();
    bee.SendScoutBees();
    }
    for(j=0;j<bee.D;j++)
    {
    //System.out.println("GlobalParam[%d]: %f\n",j+1,GlobalParams[j]);
    System.out.println("GlobalParam["+(j+1)+"]:"+bee.GlobalParams[j]);
    }
    //System.out.println("%d. run: %e \n",run+1,GlobalMin);
    System.out.println((run+1)+".run:"+bee.GlobalMin);
    bee.GlobalMins[run]=bee.GlobalMin;
    mean=mean+bee.GlobalMin;
    }
    mean=mean/bee.runtime;
    //System.out.println("Means of %d runs: %e\n",runtime,mean);
    System.out.println("Means of "+bee.runtime+"runs: "+mean);

    }

    }

    Ⅸ 求 人工蜂群演算法用於無線感測器網路路由協議的模擬代碼

    我有個基於tinyos的nesc 語言的代碼模擬,不知道你需要不,另外好像這個蟻群演算法好像沒有太大的研究意義。PS.這個不是我的電話號碼

    Ⅹ 求人工蜂群演算法的c程序源代碼``````謝謝各位大神了``````

    /* ABC algorithm coded using C programming language */

    /* Artificial Bee Colony (ABC) is one of the most recently defined algorithms by Dervis Karaboga in 2005,
    motivated by the intelligent behavior of honey bees. */

    /* Referance Papers*/

    /*D. Karaboga, AN IDEA BASED ON HONEY BEE SWARM FOR NUMERICAL OPTIMIZATION,TECHNICAL REPORT-TR06, Erciyes University, Engineering Faculty, Computer Engineering Department 2005.*/

    /*D. Karaboga, B. Basturk, A powerful and Efficient Algorithm for Numerical Function Optimization: Artificial Bee Colony (ABC) Algorithm, Journal of Global Optimization, Volume:39, Issue:3,pp:459-171, November 2007,ISSN:0925-5001 , doi: 10.1007/s10898-007-9149-x */

    /*D. Karaboga, B. Basturk, On The Performance Of Artificial Bee Colony (ABC) Algorithm, Applied Soft Computing,Volume 8, Issue 1, January 2008, Pages 687-697. */

    /*D. Karaboga, B. Akay, A Comparative Study of Artificial Bee Colony Algorithm, Applied Mathematics and Computation, 214, 108-132, 2009. */

    /*Copyright © 2009 Erciyes University, Intelligent Systems Research Group, The Dept. of Computer Engineering*/

    /*Contact:
    Dervis Karaboga ([email protected] )
    Bahriye Basturk Akay ([email protected])
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <conio.h>
    #include <time.h>

    /* Control Parameters of ABC algorithm*/
    #define NP 20 /* The number of colony size (employed bees+onlooker bees)*/
    #define FoodNumber NP/2 /*The number of food sources equals the half of the colony size*/
    #define limit 100 /*A food source which could not be improved through "limit" trials is abandoned by its employed bee*/
    #define maxCycle 2500 /*The number of cycles for foraging {a stopping criteria}*/

    /* Problem specific variables*/
    #define D 100 /*The number of parameters of the problem to be optimized*/
    #define lb -100 /*lower bound of the parameters. */
    #define ub 100 /*upper bound of the parameters. lb and ub can be defined as arrays for the problems of which parameters have different bounds*/

    #define runtime 30 /*Algorithm can be run many times in order to see its robustness*/

    double Foods[FoodNumber][D]; /*Foods is the population of food sources. Each row of Foods matrix is a vector holding D parameters to be optimized. The number of rows of Foods matrix equals to the FoodNumber*/
    double f[FoodNumber]; /*f is a vector holding objective function values associated with food sources */
    double fitness[FoodNumber]; /*fitness is a vector holding fitness (quality) values associated with food sources*/
    double trial[FoodNumber]; /*trial is a vector holding trial numbers through which solutions can not be improved*/
    double prob[FoodNumber]; /*prob is a vector holding probabilities of food sources (solutions) to be chosen*/
    double solution [D]; /*New solution (neighbour) proced by v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) j is a randomly chosen parameter and k is a randomlu chosen solution different from i*/
    double ObjValSol; /*Objective function value of new solution*/
    double FitnessSol; /*Fitness value of new solution*/
    int neighbour, param2change; /*param2change corrresponds to j, neighbour corresponds to k in equation v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij})*/
    double GlobalMin; /*Optimum solution obtained by ABC algorithm*/
    double GlobalParams[D]; /*Parameters of the optimum solution*/
    double GlobalMins[runtime]; /*GlobalMins holds the GlobalMin of each run in multiple runs*/
    double r; /*a random number in the range [0,1)*/

    /*a function pointer returning double and taking a D-dimensional array as argument */
    /*If your function takes additional arguments then change function pointer definition and lines calling "...=function(solution);" in the code*/
    typedef double (*FunctionCallback)(double sol[D]);

    /*benchmark functions */
    double sphere(double sol[D]);
    double Rosenbrock(double sol[D]);
    double Griewank(double sol[D]);
    double Rastrigin(double sol[D]);

    /*Write your own objective function name instead of sphere*/
    FunctionCallback function = &sphere;

    /*Fitness function*/
    double CalculateFitness(double fun)
    {
    double result=0;
    if(fun>=0)
    {
    result=1/(fun+1);
    }
    else
    {
    result=1+fabs(fun);
    }
    return result;
    }

    /*The best food source is memorized*/
    void MemorizeBestSource()
    {
    int i,j;

    for(i=0;i<FoodNumber;i++)
    {
    if (f[i]<GlobalMin)
    {
    GlobalMin=f[i];
    for(j=0;j<D;j++)
    GlobalParams[j]=Foods[i][j];
    }
    }
    }

    /*Variables are initialized in the range [lb,ub]. If each parameter has different range, use arrays lb[j], ub[j] instead of lb and ub */
    /* Counters of food sources are also initialized in this function*/
    void init(int index)
    {
    int j;
    for (j=0;j<D;j++)
    {
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    Foods[index][j]=r*(ub-lb)+lb;
    solution[j]=Foods[index][j];
    }
    f[index]=function(solution);
    fitness[index]=CalculateFitness(f[index]);
    trial[index]=0;
    }

    /*All food sources are initialized */
    void initial()
    {
    int i;
    for(i=0;i<FoodNumber;i++)
    {
    init(i);
    }
    GlobalMin=f[0];
    for(i=0;i<D;i++)
    GlobalParams[i]=Foods[0][i];

    }

    void SendEmployedBees()
    {
    int i,j;
    /*Employed Bee Phase*/
    for (i=0;i<FoodNumber;i++)
    {
    /*The parameter to be changed is determined randomly*/
    r = ((double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    param2change=(int)(r*D);

    /*A randomly chosen solution is used in procing a mutant solution of the solution i*/
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);

    /*Randomly selected solution must be different from the solution i*/
    while(neighbour==i)
    {
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);
    }
    for(j=0;j<D;j++)
    solution[j]=Foods[i][j];

    /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    solution[param2change]=Foods[i][param2change]+(Foods[i][param2change]-Foods[neighbour][param2change])*(r-0.5)*2;

    /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
    if (solution[param2change]<lb)
    solution[param2change]=lb;
    if (solution[param2change]>ub)
    solution[param2change]=ub;
    ObjValSol=function(solution);
    FitnessSol=CalculateFitness(ObjValSol);

    /*a greedy selection is applied between the current solution i and its mutant*/
    if (FitnessSol>fitness[i])
    {
    /*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
    trial[i]=0;
    for(j=0;j<D;j++)
    Foods[i][j]=solution[j];
    f[i]=ObjValSol;
    fitness[i]=FitnessSol;
    }
    else
    { /*if the solution i can not be improved, increase its trial counter*/
    trial[i]=trial[i]+1;
    }

    }

    /*end of employed bee phase*/

    }

    /* A food source is chosen with the probability which is proportioal to its quality*/
    /*Different schemes can be used to calculate the probability values*/
    /*For example prob(i)=fitness(i)/sum(fitness)*/
    /*or in a way used in the metot below prob(i)=a*fitness(i)/max(fitness)+b*/
    /*probability values are calculated by using fitness values and normalized by dividing maximum fitness value*/
    void CalculateProbabilities()
    {
    int i;
    double maxfit;
    maxfit=fitness[0];
    for (i=1;i<FoodNumber;i++)
    {
    if (fitness[i]>maxfit)
    maxfit=fitness[i];
    }

    for (i=0;i<FoodNumber;i++)
    {
    prob[i]=(0.9*(fitness[i]/maxfit))+0.1;
    }

    }

    void SendOnlookerBees()
    {

    int i,j,t;
    i=0;
    t=0;
    /*onlooker Bee Phase*/
    while(t<FoodNumber)
    {

    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    if(r<prob[i]) /*choose a food source depending on its probability to be chosen*/
    {
    t++;

    /*The parameter to be changed is determined randomly*/
    r = ((double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    param2change=(int)(r*D);

    /*A randomly chosen solution is used in procing a mutant solution of the solution i*/
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);

    /*Randomly selected solution must be different from the solution i*/
    while(neighbour==i)
    {
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    neighbour=(int)(r*FoodNumber);
    }
    for(j=0;j<D;j++)
    solution[j]=Foods[i][j];

    /*v_{ij}=x_{ij}+\phi_{ij}*(x_{kj}-x_{ij}) */
    r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
    solution[param2change]=Foods[i][param2change]+(Foods[i][param2change]-Foods[neighbour][param2change])*(r-0.5)*2;

    /*if generated parameter value is out of boundaries, it is shifted onto the boundaries*/
    if (solution[param2change]<lb)
    solution[param2change]=lb;
    if (solution[param2change]>ub)
    solution[param2change]=ub;
    ObjValSol=function(solution);
    FitnessSol=CalculateFitness(ObjValSol);

    /*a greedy selection is applied between the current solution i and its mutant*/
    if (FitnessSol>fitness[i])
    {
    /*If the mutant solution is better than the current solution i, replace the solution with the mutant and reset the trial counter of solution i*/
    trial[i]=0;
    for(j=0;j<D;j++)
    Foods[i][j]=solution[j];
    f[i]=ObjValSol;
    fitness[i]=FitnessSol;
    }
    else
    { /*if the solution i can not be improved, increase its trial counter*/
    trial[i]=trial[i]+1;
    }
    } /*if */
    i++;
    if (i==FoodNumber-1)
    i=0;
    }/*while*/

    /*end of onlooker bee phase */
    }

    /*determine the food sources whose trial counter exceeds the "limit" value. In Basic ABC, only one scout is allowed to occur in each cycle*/
    void SendScoutBees()
    {
    int maxtrialindex,i;
    maxtrialindex=0;
    for (i=1;i<FoodNumber;i++)
    {
    if (trial[i]>trial[maxtrialindex])
    maxtrialindex=i;
    }
    if(trial[maxtrialindex]>=limit)
    {
    init(maxtrialindex);
    }
    }

    /*Main program of the ABC algorithm*/
    int main()
    {
    int iter,run,j;
    double mean;
    mean=0;
    srand(time(NULL));

    for(run=0;run<runtime;run++)
    {

    initial();
    MemorizeBestSource();
    for (iter=0;iter<maxCycle;iter++)
    {
    SendEmployedBees();
    CalculateProbabilities();
    SendOnlookerBees();
    MemorizeBestSource();
    SendScoutBees();
    }
    for(j=0;j<D;j++)
    {
    printf("GlobalParam[%d]: %f\n",j+1,GlobalParams[j]);
    }
    printf("%d. run: %e \n",run+1,GlobalMin);
    GlobalMins[run]=GlobalMin;
    mean=mean+GlobalMin;
    }
    mean=mean/runtime;
    printf("Means of %d runs: %e\n",runtime,mean);
    getch();
    }

    double sphere(double sol[D])
    {
    int j;
    double top=0;
    for(j=0;j<D;j++)
    {
    top=top+sol[j]*sol[j];
    }
    return top;
    }

    double Rosenbrock(double sol[D])
    {
    int j;
    double top=0;
    for(j=0;j<D-1;j++)
    {
    top=top+100*pow((sol[j+1]-pow((sol[j]),(double)2)),(double)2)+pow((sol[j]-1),(double)2);
    }
    return top;
    }

    double Griewank(double sol[D])
    {
    int j;
    double top1,top2,top;
    top=0;
    top1=0;
    top2=1;
    for(j=0;j<D;j++)
    {
    top1=top1+pow((sol[j]),(double)2);
    top2=top2*cos((((sol[j])/sqrt((double)(j+1)))*M_PI)/180);

    }
    top=(1/(double)4000)*top1-top2+1;
    return top;
    }

    double Rastrigin(double sol[D])
    {
    int j;
    double top=0;

    for(j=0;j<D;j++)
    {
    top=top+(pow(sol[j],(double)2)-10*cos(2*M_PI*sol[j])+10);
    }
    return top;
    }

    熱點內容
    塗鴉論文 發布:2021-03-31 13:04:48 瀏覽:698
    手機資料庫應用 發布:2021-03-31 13:04:28 瀏覽:353
    版面217 發布:2021-03-31 13:04:18 瀏覽:587
    知網不查的資源 發布:2021-03-31 13:03:43 瀏覽:713
    基金贖回參考 發布:2021-03-31 13:02:08 瀏覽:489
    懸疑故事範文 發布:2021-03-31 13:02:07 瀏覽:87
    做簡單的自我介紹範文 發布:2021-03-31 13:01:48 瀏覽:537
    戰略地圖參考 發布:2021-03-31 13:01:09 瀏覽:463
    收支模板 發布:2021-03-31 13:00:43 瀏覽:17
    電氣學術會議 發布:2021-03-31 13:00:32 瀏覽:731