粒子群优化算法 简洁 c语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
粒子群优化算法的C代码如下,运行后为什么提示:d:\program files\microsoft visual studio\vc98\include\eh.h(32) : fatal error C1189: #error : "eh.h is only for C++!"
费解了。
由于学matlab,我C语言长时间未碰,有点生疏。
还请各位多多指导,真的谢谢了!
#include<iostream>
#include<fstream>
#include<cmath>
#include<ctime>
#include<string>
#include<iomanip>
#include<cstdlib>
using namespace std;
#include"ran_number.h"
const double pi=3.1415926;
const int num=60; /*粒子群规模*/
const int T=2000; /*最大迭代次数*/
//**************适应度函数*************//
double func(double x)
{
double f=x*sin(10*x*pi)+2.0;
f=1.0/f;
return f;
}
//----------------主程序----------------//
void main(int argc,char* argv[])
{
double ran; //随机变量
RandomNumber rand;
double c1=2.05,c2=2.05; //学习因子
double d1=0.2,d2=0.7; //控制因子
double ws=0.9,we=0.4; //最大最小惯性权重
double x_down=-1.0,x_up=2.0; //粒子空间上下界
double w; //惯性权重
int m=2;
double Vmax; //粒子最大速度
double x[num]; //粒子位置(控制参数)
double v[num]; //粒子速度
double g[num]; //粒子适应度
double pbest[num]; //粒子个体最好值
double pbest_x[num]; //粒子个体最好位值
double gbest; //粒子群体最好值
double gbest_x; //粒子群体最好位置
Vmax=(x_up-x_down)/8;
//--初始化粒子群:位置、速度、个体最优值
for(int i=0;i<num;i++)
{
pbest[i]=0.0;
ran=rand.fRandom();
x[i]=x_down+(x_up-x_down)*ran;
v[i]=Vmax*(2*ran-1); //初始化粒子速度
pbest[i]=func(x[i]);
pbest_x[i]=x[i];
}
gbest=pbest[0];
gbest_x=x[0];
//--------------第一次迭代得到的群体最优----------//
for(i=0;i<num;i++) // for 粒子数循环
{
if(pbest[i]<gbest)
{
gbest=pbest[i];
gbest_x=pbest_x[i];
}
}
//---------------共T次迭代过程---------------//
while(m<=T) //迭代次数循环
{
w=(ws-we-d1)*exp(1/(1+d2*(m-1)/t)); //惯性权重
for(i=0;i<num;i++) //粒子数循环
{
g[i]=0.0;
ran=rand.fRandom();
v[i]=w*v[i]+c1*ran*(pbest_x[i]-x[i])+c2*ran*(gbest_x-x[i]);
x[i]+=v[i];
if(x[i]<x_down)
{
x[i]=x_down;
} //保证粒子位置不能超越下界
if(x[i]>x_up)
{
x[i]=x_up;
} //保证粒子位置不能超出上界
g[i]=func(x[i]);
if(pbest[i]>g[i])
{
pbest[i]=g[i];
pbest_x[i]=x[i];
}
if(pbest[i]<gbest)
{
gbest=pbest[i];
gbest_x=pbest_x[i];
}
printf("第%d次迭代的群体最优值及最优位置
为%lf %lf ",m,gbest,gbest_x); //输出第m次迭代的群体最优值及最优位置
} //结束for循环
m=m+1;
} //结束while循环
printf("全局最优解及全局最优位置为%lf %lf ",gbest,gbest_x);
下面为改正点:
注意: vc在处理.c 文件是按C 语言编译的,所以
假如有以下文件: 1.c
#include <fstream>
int main(int argc, char* argv[])
{
return 0;
}
那么编译时就会出错:
fatal error C1189: #error : "eh.h is only for C++!"
这是因为fstream标准库要求用到eh.h文件,而Exception Handling的实现需要c++支持。
修改方法有两种:
1. 只要把1.c改成1.cpp即可,
2. 或者使用老式库fstream.h代替,修改如下:
#include "fstream.h"
int main(int argc, char* argv[])
{
return 0;
}
也可以。
但是第2种方法在你用到stlport的stl代替vc的stl的情况下编译时,
会出现同样的错误:
fatal error C1189: #error : "eh.h is only for C++!"
这是因为stlport实现的fstream.h同样需要c++支持。