C++中蚁群优化算法的实现

#include  < ctime >
#include 
< cstdlib >
#include 
< memory >

#define  frand() ((double)rand()/(double)RAND_MAX)
#define  MAXLONG (2147483647)

double   *  pso_optimization( int  s,  int  p,  int  d,  int  T,  double  c1,  double  c2,  double   * vmax,  double  wmax,  double  wmin,  double   * domax,  double   * domin, CAL_FIT cal_fit,  void   * adds)
{
    srand(time(NULL));
    
double *swm_v = (double*)malloc(s*p*d*sizeof(double));
    
double *swm_d = (double*)malloc(s*p*d*sizeof(double));
    
double *sbest = (double*)malloc(s*d*sizeof(double));
    
double *gbest = (double*)malloc(d*sizeof(double));
    
double *fswm_v = swm_v, *fswm_d = swm_d;
    memset(swm_v, 
0sizeof(swm_v));
    
double *fdomax = domax, *fdomin = domin, *fvmax = vmax;
    
for (int i = 0; i < s; i++)
        
for (int j = 0; j < p; j++)
        
{
            fdomax 
= domax; fdomin = domin;
            
for (int k = 0; k < d; k++, fdomax++, fdomin++, fswm_d++)
                
*fswm_d = (frand()*(*fdomax-*fdomin))+*fdomin;
        }


    
double *fsbest = sbest, fitness = 0;
    
double nowbest = 0*nowidx = NULL;
    
double nowsbest = 0*nowsidx = NULL;
    
double *ffsbest = NULL, *fgbest = NULL;
    
double w = 0;
    
for (int t = 0; t < T; t++)
    
{
        w 
= wmax-(double)t*(wmax-wmin)/(double)T;
        fswm_d 
= swm_d; fsbest = sbest;
        nowidx 
= NULL; nowbest = -MAXLONG;
        
for (int i = 0; i < s; i++, fsbest+=d)
        
{
            nowsbest 
= -MAXLONG; nowsidx = NULL;
            
for (int j = 0; j < p; j++, fswm_d+=d)
            
{
                fitness 
= cal_fit(fswm_d, d, adds);
                
if (fitness >= nowsbest)
                
{
                    nowsbest 
= fitness;
                    nowsidx 
= fswm_d;
                }

            }

            memcpy(fsbest, nowsidx, d
*sizeof(double));
            
if (nowsbest >= nowbest)
            
{
                nowbest 
= nowsbest;
                nowidx 
= fsbest;
            }

        }

        memcpy(gbest, nowidx, d
*sizeof(double));
        
if (t >= T) break;
        fsbest 
= sbest; fswm_v = swm_v; fswm_d = swm_d;
        
for (int i = 0; i < s; i++)
        
{
            
for (int j = 0; j < p; j++)
            
{
                fgbest 
= gbest; ffsbest = fsbest;
                fdomax 
= domax; fdomin = domin; fvmax = vmax;
                
for (int k = 0; k < d; k++, fgbest++, ffsbest++, fswm_v++, fswm_d++, fdomax++, fdomin++, fvmax++)
                
{
                    
*fswm_v = max(-*fvmax, min(*fswm_v*w+c1*frand()*(*ffsbest-*fswm_d)+c2*frand()*(*fgbest-*fswm_d), *fvmax));
                    
*fswm_d = max(*fdomin, min(*fswm_d+*fswm_v, *fdomax));
                }

            }

            fsbest 
= ffsbest;
        }

    }

    free(swm_v); free(swm_d); free(sbest);
    
return gbest;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值