为什么我的程序运行起来会有基础类应用程序已停止工作,求大神帮助

lantuanjubu21 2015-11-20 08:56:45

//构造函数
CRobot::CRobot()
{
stop = false ;
}


// 目标函数
double CRobot::function()
{
double r = m_deathdirectionnum + m_rotateamo +m_RRcollisionnum +m_ROcollisionnum+m_rotatenum;// +m_rotatenum+ m_deathdistancenum
return r;
}

// 初始化
void CRobot::initial(int pn, int d )
{
fg = MAX;
bestIndex = 0;
pNum = pn;
dim = d;
int i,j;//,k;

static int kk = (unsigned) time (NULL); // 随机函数的时间种子
srand( (unsigned)time(NULL) + kk++ );

if( particle==NULL )
{
particle = new Particle[pn]; // 创建粒子数组实例对象

for( i=0; i<pn; ++i )
{
particle[i].setDim(d); // 设置粒子的维数

particle[i].position = new double[d];
particle[i].velocity = new double[d];
particle[i].position[0]= m_gptemp.x + rand()*1.0/RAND_MAX*5;
particle[i].position[1]= m_gptemp.y + rand()*1.0/RAND_MAX*5;
for( j=0; j<d; ++j )
{
particle[i].velocity[j]=rand()/(double)RAND_MAX;
}
}
}

p = new double *[pn]; // 粒子数

for( i=0; i<pn; ++i )
{
p[i] = new double[d];
for( j=0; j<dim; ++j )
p[i][j] = particle[i].position[j]; // 初始化局部最优位置
m_gptemp.x=p[i][0];
m_gptemp.y=p[i][1];
particle[i].fit = function();//计算粒子的适应度

// 获取全局最小
if( particle[i].fit<fg )
{
fg= particle[i].fit;
bestIndex = i; // 改变全局最优 的索引位置
}
}
}

//更新粒子的速度、和位置
void CRobot::createNew()
{
int i,j,k,l;
Vmax = (UP - DOWN)*1.0/8;

static int kk = (unsigned) time (NULL); // 随机函数的时间种子
srand( (unsigned)time(NULL) + kk++ );
// 更新速度
for( i=0; i<pNum; ++i )
{
for( j=0; j<particle[i].dim; ++j )
{
particle[i].velocity[j] = w[i]*particle[i].velocity[j] +
rand()/(double)RAND_MAX * c1 *( p[i][j]-particle[i].position[j] ) +
rand()/(double)RAND_MAX * c2 * (p[bestIndex][j]-particle[i].position[j]);

if( particle[i].velocity[j]>Vmax )//检查速度最大值
particle[i].velocity[j]=Vmax;
else if( particle[i].velocity[j]<DOWN )//检查速度最小值
particle[i].velocity[j]=DOWN;
}
}
// 更新位置
for( i=0; i<pNum; ++i )
{
for( j=0; j<particle[i].dim; ++j )
{
particle[i].position[j] += particle[i].velocity[j]; //根据公式更新位置

if( particle[i].position[0]>(m_gptemp.x+UP) )//保护粒子的位置在最大和最小之间
particle[i].position[0]= m_gptemp.x+UP;
else if( particle[i].position[0]<(m_gptemp.x+DOWN) )
particle[i].position[0]=m_gptemp.x+DOWN;

if( particle[i].position[1]>(m_gptemp.y+UP) )
particle[i].position[1]= m_gptemp.y+UP;
else if( particle[i].position[1]<(m_gptemp.y+DOWN) )
particle[i].position[1]=m_gptemp.y+DOWN;

}
m_gptemp.x = particle[i].position[0];
m_gptemp.y = particle[i].position[1];
// 计算该位置的函数值
double tf = function();
double FitBak[4000];
FitBak[i]=particle[i].fit;
if(FitBak[i]=FitBak[i+1])
{
l++;
if(l>10)
QuanjucreateNew();
}
// 检查是否局部最优
if( tf<particle[i].fit )
{
particle[i].fit = tf;
for( k=0; k<particle[i].dim; ++k )
p[i][k] = particle[i].position[k];//个体局部最优
// 检查是否全局最优
if( tf<fg )
{
lastFG = fg;
fg = tf;
bestIndex = i;
}
}

}
}

//用简单的莱维飞行更新最优粒子
extern double myAbs(double);
double myAbs(double num)
{
return num>=0?num:-num;
}
double randval(double low,double high)
{
double val;
val=((double)(rand()%RAND_MAX)/(double)RAND_MAX)*(high-low)+low;
return(val);
}
double gauss(double mean, double sigma)
{
int i;
double x=0,y;
for(i=0;i<16;i++)
x+=randval(0.0,1.0);
x=x-8.0;
y=mean+x*sigma;
return y;
}

//计算gamma 函数值
double gamma_fn(double y)
{
double a[25],F;
int i;
a[0]=1.0;
a[1]=0.5772156649015329;
a[2]=-0.6558780715202538;
a[3]=-0.0420026350340952;
a[4]=0.1665386113822915;
a[5]=-0.0421977345555443;
a[6]=-0.009621971527877;
a[7]=0.007218943246663;
a[8]=-0.0011651675918591;
a[9]=-0.0002152416741149;
a[10]=0.0001280502823882;
a[11]=-0.0000201348547807;
a[12]=-0.0000012504934821;
a[13]=0.000001133027232;
a[14]=-0.0000002056338417;
a[15]=0.000000006116095;
a[16]=0.0000000050020075;
a[17]=-0.0000000011812746;
a[18]=0.0000000001043427;
a[19]=0.0000000000077823;
a[20]=-0.0000000000036968;
a[21]=0.00000000000051;
a[22]=-0.0000000000000206;
a[23]=-0.0000000000000054;
a[24]=0.00000000000000014;
F=a[24];
for(i=23;i>=0;i--)
{
F=F*y+a[i];
}
F*=y;
return (1.0/F);
}

double gamma(double beta)
{
double prod=1.0;
double result;

if(beta>2)
{
while(beta>2)
{
beta--;
prod*=beta;
}
result=prod*gamma_fn(beta);
}

else
{
result=gamma_fn(beta);
}
return result;
}

void CRobot::QuanjucreateNew()
{
double beta=1.5;
double sigma=pow((gamma(1.0+beta)*sin(PI*beta/2.0))/gamma(((1.0+beta)/2.0)*beta*pow(2,(beta-1.0)/2.0)),1.0/beta);
int i,j;
double u,v,step,stepSize;
for( i=0; i<pNum; ++i )
{
for( j=0; j<particle[i].dim; ++j )
{
u=gauss(0.0,1.0)*sigma;
v=gauss(0.0,1.0);
step=u/pow(myAbs(v),1.0/beta);
stepSize=0.01*step*(particle[i].position[j]-particle[bestIndex].position[j]);
particle[i].position[j]+=stepSize*gauss(0,1.0);
if( particle[i].position[0]>(m_gptemp.x+UP) )
particle[i].position[0]= m_gptemp.x+UP;
else if( particle[i].position[0]<(m_gptemp.x+DOWN) )
particle[i].position[0]=m_gptemp.x+DOWN;

if( particle[i].position[1]>(m_gptemp.y+UP) )
particle[i].position[1]= m_gptemp.y+UP;
else if( particle[i].position[1]<(m_gptemp.y+DOWN) )
particle[i].position[1]=m_gptemp.y+DOWN;
}
m_gptemp.x = particle[i].position[0];
m_gptemp.y = particle[i].position[1];
// 计算该位置的函数值
double tf = function();
// 检查是否局部最优
if( tf<particle[i].fit )
{
particle[i].fit = tf;
for(int k=0; k<particle[i].dim; ++k )
p[i][k] = particle[i].position[k];
// 检查是否全局最优
if( tf<fg )
{
lastFG = fg;
fg = tf;
bestIndex = i;
}
}
}
}


bool CRobot::isExited( int n )
{
if(fabs(fg-lastFG)/fg<g || n>CNT )
return true;
return false;
}
// 粒子群算法求解
void CRobot::doPSO(int pn,int d )
{
int n=0;
double w[4000];
initial(pn, d );
do
{
w[n]=0.9-1.2*(0.9-0.25)*log(n)/log(400);
c1 = 2;//c1i - (c1i - c1f)*n/CNT ;
c2= 2;//(c2f - c2i)*n/CNT + c2i;
createNew();
++n;
}while(!isExited(n));//!isExited(n)
}
...全文
256 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-11-20
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧