?? pso.cpp
字號(hào):
#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
long rdint(long i)
{
return rand()%(int)(i);
}
double rdft()
{
return (double)rdint(16384)/16383.0;
}
long rnd(long a,long b)
{
return rdint((int)(b)-(int)(a)+1)+(int)(a);
}
float W = 1.0 ;
float C1 = 1.8 ;
float C2 = 1.8 ;
//float K = 2 / sqrt( 19.51 ) ;
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];
int initiate(void);
float calculate(int number);
void globalbest(int number);
void localbest(int number);
int initiate()
{
int i , j ;
float s = 0 ;
int flag = 0 ;
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++) calculate(i) ;
for(i=0;i<POPSIZE;i++)
individual[i].bestfitness = individual[i].fitness ;
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;
return flag ;
}
void localbest(int number)
{
int i ;
if(individual[number].fitness<individual[number].bestfitness)
for(i=0;i<DIMENSION;i++)
individual[number].best[i] = individual[number].number[i] ;
individual[number].bestfitness = individual[number].fitness ;
}
int globalbest()
{
int i , j ;
float s = 0 ;
int flag = 0 , best = 0 ;
for(i=1;i<POPSIZE;i++)
if(individual[i].bestfitness<PBEST)
{
for(j=0;j<DIMENSION;j++)
P[j] = individual[i].best[j];
PBEST = individual[i].bestfitness;
best = i ;
}
return best ;
}
float calculate(int num)
{
int i ;
float s = 0.0 , h = 0.0 ;
s = pow( individual[num].number[0] + individual[num].number[1]
+ 1.0 , 2 ) * (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 )) ;
return individual[num].fitness = s * h ;
}
int main()
{
int i , j , k , t , v, b , b0 , total = 0 ;
float sum = 0 ;
freopen("out.txt","w",stdout);
for(j=0;j<50;j++)
//while(true)
{
b = initiate();
for(i=0;i<1000;i++)
{
W = 1.0 - i * 0.6 / 499 ;
if((PBEST - 3.0) < 0.0001)
{
printf("\n%d,b=%d,%f\n",i,b,PBEST);
printf("*******************************\n");
for(v=0;v<DIMENSION;v++)
printf("D[%d] = %f ; ",v,individual[b].number[v]);
printf("\nbest=%d bf=%f\n\n",b,individual[b].bestfitness);
//return 0;
total++;
sum += i;
break;
}
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].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];
calculate(k);
localbest(k);
}
b0 = globalbest();
if(b0)
{
b = b0 ;
//printf("i:%d,b:%d,",i,b);
//printf("pbest = %f\n",individual[b].bestfitness);
}
//globalbest();
}
}
//printf("%d,%f\n",i,PBEST);
}
printf("Total number is %d\n",total);
printf("Sum is %f\n",sum);
printf("Average is %f\n",sum/total);
//system("pause");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -