⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pso.cpp

📁 C语言编程常见问题解答 这个帖子将不断扩充、更新 罗列大部分C语言编程的常见问题 希望各位观众支持帮助 毕竟一人之力太有限
💻 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

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");
}                    
                
    
               
                         
                
    

⌨️ 快捷键说明

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