欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

1.cpp

本代码是一种随机改进粒子群优化代码
CPP
字号:

//库文件 

#include"stdio.h" 

#include"stdlib.h" 

#include"time.h" 

#include"math.h" 

 

//随机数定义 

#define rdint(i) (rand()%(int)(i)) 

#define rdft() (float)((double)rdint(16384)/(16383.0)) 

#define rnd(a,b) (rdint((int)(b)-(int)(a)+1)+(int)(a)) 

 

//宏定义 

#define POPSIZE 20 

#define DIMENSION 2 

 

//全局变量定义 

float W=1.0; 

float C1=1.8; 

float C2=1.8; 

float VMAX=2; 

float XMIN=-2.0; 

float XMAX=2.0; 

float P[DIMENSION]; 

float PBEST; 

 

struct indi 

{ 

 float number[DIMENSION]; 

 float best[DIMENSION]; 

 float bestfitness; 

 float fitness; 

 float speed[DIMENSION]; 

}individual[POPSIZE]; 

 

void initiate(void); 


void calculation(int number); 

void globalbest(int number); 

void localbest(int number); 

 

//程序初始化定义 

void initiate() 

{ 

 int i,j; 

 for(i=0;i<POPSIZE;i++) 

 for(j=0;j<DIMENSION;j++) 

 individual[i].number[j]=rdft()*(XMAX-XMIN)+XMIN; 

 for(i=0;i<POPSIZE;i++) 

 for(j=0;j<DIMENSION;j++) 

 individual[i].speed[j]=VMAX*rdft(); 

 for(i=0;i<POPSIZE;i++) 

 for(j=0;j<DIMENSION;j++) 

 individual[i].best[j]=individual[i].number[j]; 

 for(i=0;i<POPSIZE;i++) 

 calculation(i); 

 for(i=0;i<POPSIZE;i++) 

 individual[i].bestfitness=individual[i].fitness; 

 globalbest(0); 

} 

 

//微粒历史最优位置修改程序 

void localbest(int number) 

{ 

 int i; 

 if(individual[number].bestfitness>individual[number].fitness) 

 for(i=0;i<DIMENSION;i++) 

 individual[number].best[i]=individual[number].number[i]; 

 individual[number].bestfitness=individual[number].fitness; 

} 

 

//种群历史最优位置修改程序 

void globalbest(int number) 

{ 

 int i,j; 

 float s=0; 

 int flag=0; 

 if(number==0) 

 { 

 s=individual[0].fitness; 

 flag=0; 

 for(i=1;i<POPSIZE;i++) 

 if(individual[i].fitness<s) 

 { 

 s=individual[i].fitness; 

 flag=i; 

 } 

 for(i=0;i<DIMENSION;i++) 

 P[i]=individual[flag].number[i]; 

 PBEST=individual[flag].fitness; 

 } 

 else 

 { 

 for(i=0;i<POPSIZE;i++) 

 if(individual[i].bestfitness<PBEST) 

 { 

 for(j=0;j<DIMENSION;j++) 

 P[j]=individual[i].best[j]; 

 PBEST=individual[i].bestfitness; 

 } 

 } 

} 

 

//适应值函数计算程序 

void calculation(int num) 

{ 

 int i; 

 float s=0.0,h=0.0; 

 s=pow(individual[num].number[0]+individual[num].number[1]+1.0,2.0)*(19.0-14.0*individual[num].number[0]+3.0*pow(individual[num].number[0],2.0)-14.0*individual[num].number[1]+6.0*individual[num].number[0]*individual[num].number[1]+3.0*pow(individual[num].number[1],2.0))+1.0; 

 h=30.0+pow(2.0*individual[num].number[0]-3.0*individual[num].number[1],2.0)*(18.0-32.0*individual[num].number[0]+12.0*pow(individual[num].number[0],2.0)+48.0*individual[num].number[1]-36.0*individual[num].number[0]*individual[num].number[1]+27.0*pow(individual[num].number[1],2.0)
); 

 individual[num].fitness=s*h; 

} 

 

//主程序 

void  main() 

{ 

 int i,j,k,t,total=0; 

 float sum=0; 

 for(j=0;j<50;j++) 

 { 

 initiate(); 

 for(i=0;i<500;i++) 

 { 

 W=1.0-i*0.6/499; 


 if((PBEST-3.0)<0.0001) 

 { 

 total++; 

 sum=sum+i; 

 break; 

 } 

 else 

 { 

 for(k=0;k<POPSIZE;k++) 

 { 

 for(t=0;t<DIMENSION;t++) 

 { 

 
individual[k].speed[t]=W*individual[k].speed[t]+C1*rdft()*(individual[k].best[t]-individual[k].number[t])+C2*rdft()*(P[t]-individual[k].number[t]); 

 if(individual[k].speed[t]>VMAX) 

 individual[k].speed[t]=VMAX; 

 individual[k].number[t]=individual[k].number[t]+individual[k].speed[t]; 

 if(individual[k].number[t]<XMIN) 

 individual[k].number[t]=2*XMIN-individual[k].number[t]; 

 if(individual[k].number[t]>XMAX) 

 individual[k].number[t]=2*XMAX-individual[k].number[t]; 

 } 

 calculation(k); 

 localbest(k); 

 } 

 globalbest(1); 

 } 

 } 

 printf("%d,%f\t",i,PBEST); 

 } 

 printf("Total number is%d\n",total); 

 printf("Sum is %f\n",sum); 

 printf("Average is %f\n",sum/total); 

} 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -