這是從網上找來的演算法(本來是 英文注釋的,但是我給換成中文注釋了,可能會有不確切的地方)有幾個地方看不太懂,請教大神!!就是這幾個函式看不太懂,求大神幫忙啊,并且我是需要將這封群演算法應用到物流配送車輛調度中,所以有沒有大神能夠給我講一下這幾個函式的作用!求大神幫幫忙



typedef double (*FunctionCallback)(double sol[D]);
/*基準測驗函式 */
double sphere(double sol[D]);
double Rosenbrock(double sol[D]);
double Griewank(double sol[D]);
double Rastrigin(double sol[D]);
代碼:
/*蜂群演算法用于函式優化
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <time.h>
#define M_PI 3.1415926
/* ABC演算法的控制引數*/
#define NP 100 /* 蜂群的大小(引領蜂+跟隨蜂)的數量*/
#define FoodNumber NP/2 /*食物源的數量,也是引領蜂的數量*/
#define limit 2500 /*一個食物源如果在給定的limit限制步驟內適應度沒有被提高,則放棄該食物源*/
#define maxCycle 2000 /*停止條件*/
/* 函式的特定引數*/
#define D 50 /*函式引數的個數*/
#define lb -5.12 /*函式下界引數 */
#define ub 5.12 /*函式上界引數,上、下界引數可以被定義為對于其引數具有不同的邊界的問題陣列*/
#define runtime 30 /*運行次數*/
double Foods[FoodNumber][D]; /*食物矩陣的每一行是一個待優化的向量引數. 矩陣的行數與食物源的數量一致*/
double f[FoodNumber]; /*是一個與食物源有關的目標函式值*/
double fitness[FoodNumber]; /*食物源的質量(適應度)*/
double trial[FoodNumber]; /*初始化變數(區域搜索次數)*/
double prob[FoodNumber]; /*食物源被選中的概率*/
double solution [D]; /*產生新的解決解*/
double ObjValSol; /*新解的目標函式值*/
double FitnessSol; /*新解的fitness(適應度計算)*/
int neighbour, param2change; /*param2change=j, neighbour=k ,v_{ij}=x_{ij}+phi_{ij}*(x_{kj}-x_{ij})*/
double GlobalMin; /*演算法得到的最優解*/
double GlobalParams[D]; /*保存最優的食物源解集*/
double GlobalMins[runtime]; /*運行次數*/
double r; /*[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]);
/*基準測驗函式 */
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 = &Rastrigin;
/*通過食物源的適應度計算目標函式*/
double CalculateFitness(double fun)
{
double result=0;
if(fun>=0)
{
result=1/(fun+1);
}
else
{
result=1+fabs(fun);
}
return result;
}
/*記憶迄今為止最好的食物源*/
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;
}
/*所有的食物源都被初始化*/
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;
/*引領蜂*/
for (i=0;i<FoodNumber;i++)
{
/*隨機改變引數*/
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
param2change=(int)(r*D);
/*A randomly chosen solution is used in producing a mutant solution of the solution i*/
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
neighbour=(int)(r*FoodNumber);
/*隨機選的的解不能與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 (solution[param2change]<lb) solution[param2change]=lb;
if (solution[param2change]>ub) solution[param2change]=ub;
ObjValSol=function(solution);
FitnessSol=CalculateFitness(ObjValSol);
/*在當前解i和產生的解之間進行貪婪選擇*/
if (FitnessSol>fitness[i])
{
/*產生的解如果比當前解i好,當前解替代解i,并初始化搜索次數*/
trial[i]=0;
for(j=0;j<D;j++)
Foods[i][j]=solution[j];
f[i]=ObjValSol;
fitness[i]=FitnessSol;
}
else
{ /*如果產生的解沒有當前解i好,那么就增加其搜索次數*/
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;
/*跟隨蜂*/
while(t<FoodNumber)
{
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
if(r<prob[i]) /*選擇一個食物源取決于其被選擇的概率*/
{
t++;
/*隨機改變引數*/
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
param2change=(int)(r*D);
/**/
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
neighbour=(int)(r*FoodNumber);
/*隨機選的的解不能與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 (solution[param2change]<lb)
solution[param2change]=lb;
if (solution[param2change]>ub)
solution[param2change]=ub;
ObjValSol=function(solution);
FitnessSol=CalculateFitness(ObjValSol);
/*在當前解i和產生的解之間進行貪婪選擇*/
if (FitnessSol>fitness[i])
{
/*產生的解如果比當前解i好,當前解替代解i,并初始化搜索次數*/
trial[i]=0;
for(j=0;j<D;j++)
Foods[i][j]=solution[j];
f[i]=ObjValSol;
fitness[i]=FitnessSol;
}
else
{ /*如果產生的解沒有當前解i好,那么就增加搜索次數*/
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);
}
}
/*主函式*/
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;
//printf("%e\n",mean);
}
//printf("mean:%e\n",mean);
mean=mean/runtime;
//printf("runtime:%d\n",runtime);
printf("Means of %d runs: %e\n",runtime,mean);
getch();
return 0;
}
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;
}
uj5u.com熱心網友回復:
俗話說求人不如靠己,經過幾天的研究,演算法已經看懂啦,所以說自己學到的才是自己的,看來我還是需要繼續努力,
uj5u.com熱心網友回復:
樓主行內系方式是多少,還沒入門的 小菜鳥求給點思路。QQ73697320uj5u.com熱心網友回復:
確實,自力更生uj5u.com熱心網友回復:
老哥 我是剛起步想研究研究一下 但又不知道從哪下手 求給點建議 你學習的程序是?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/19131.html
標籤:基礎類
上一篇:Perl
下一篇:求助
