内存溢出,是哪儿的问题啊?
//利用遗传算法找优化问题的最优解/*该优化问题为:
max f(x1,x2)=21.5+x1*sin(4*π*x1)+x2*sin(20*π*x2)
s.t. -3.0<=x1<=12.1
4.1<=x2<=5.8 (保留后五位小数)
*/
#include <cstdlib>
#include<time.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define PI 3.1415926535
main()
{int pop[100][33],pop2[100][33],pop3[100][33],i,j,m,n,gen,k,randcut;
double s1[100],s2[100],randnum[100],randpc,randpm;
double a1,b1,a2,b2,pc,pm,F,x1[100],x2[100],eval[100],p[100],q[100];
//赋初值
a1=-3.0;
b1=12.1;
a2=4.1;
b2=5.8;
pc=0.25;
pm=0.11;
gen=0;
for(i=0;i<100;i++)
{s1[i]=0.0;
s2[i]=0.0;
}
//得到100*33个随机数,作为初始种群
srand((unsigned)time(0));
for(i=0;i<100;i++)
for(j=0;j<33;j++)
{pop[i][j]=rand()%2;}
/**********************************************************/
/**********************************************************/
/*开始进行适应度计算、判别终止条件、选择、交叉、变异的循环*/
/**********************************************************/
/**********************************************************/
for(gen=0;gen<900;gen++)
{
//解码:把基因转为性状
for(i=0;i<100;i++)
{for(j=0;j<=17;j++)
{s1[i]=s1[i]+pop[i][j]*pow(2,(17-j));}
x1[i]=a1+s1[i]*(b1-a1)/(pow(2,18)-1.0);
}
for(i=0;i<100;i++)
{for(j=18;j<=32;j++)
{s2[i]=s2[i]+pop[i][j]*pow(2,(32-j));}
x2[i]=a2+s2[i]*(b2-a2)/(pow(2,15)-1.0);
}
//计算适应度
for(i=0;i<100;i++)
{eval[i]=21.5+x1[i]*sin(4*PI*x1[i])+x2[i]*sin(20*PI*x2[i]);}
//进行选择
F=0.0;
for(i=0;i<100;i++)
{F=F+eval[i];}
for(i=0;i<100;i++)
{p[i]=eval[i]/F;}
q[0]=p[0];//位置待定
for(i=1;i<100;i++)
{q[i]=q[i-1]+p[i];} //求得累积概率q[i]
//srand((unsigned)time(0));
for(i=0;i<100;i++)
{randnum[i]=rand()/(double)(RAND_MAX);} //0-1之间的随机数
for(i=0;i<100;i++)
for(k=0;k<100;k++)
if(randnum[i]<=q[k])
{for(j=0;j<33;j++)
pop2[i][j]=pop[k][j];
k=100;//break????
}
for(i=0;i<100;i++)
for(j=0;j<33;j++)
pop[i][j]=pop2[i][j];
//进行交叉
for(k=0;k<50;k++)
{//srand((unsigned)time(0));
randpc=rand()/(double)(RAND_MAX);
if(randpc<=pc)
{do
{//srand((unsigned)time(0));
m=rand()%100; //0-99之间的随机数
//srand((unsigned)time(0));
n=rand()%100;
}
while(m==n); //m与n分别表示要交叉的染色体个体序号,m和n都是随机取的
//srand((unsigned)time(0));
randcut=rand()%33; //0-32之间的随机数
for(j=randcut;j<33;j++)
{pop2[m][j]=pop[n][j];
pop2[n][j]=pop[m][j];
}
for(j=0;j<33;j++)
{pop3[2*k][j]=pop2[m][j];
pop3[2*k+1][j]=pop2[n][j];
}
}//本次交叉结束
else
for(j=0;j<33;j++)
{pop3[2*k][j]=pop[m][j];
pop3[2*k+1][j]=pop[n][j];
}//如果随机数大于交叉概率,则不交叉
}//50次交叉结束
//进行变异
for(k=0;k<100;k++)
{//srand((unsigned)time(0));
randpm=rand()/(double)(RAND_MAX);
if(randpm<=pm)
{//srand((unsigned)time(0));
randcut=rand()%33;
pop3[k][randcut]=!(pop3[k][randcut]);
}
}//变异结束
for(i=0;i<100;i++)
for(j=0;j<33;j++)
{pop[i][j]=pop3[i][j];}
}//大循环结束
printf("x1 x2 f\n");
for(i=0;i<100;i++)
{printf("%f %f %f\n",x1[i],x2[i],eval[i]);
}
}//main结束
--------------------------------------------------------------------
在VC和WINTC下编译都没有问题,但是在VC运行的时候提示内存错误,某内存不能被read,在WINTC上运行则提示内存溢出。我现在检查不出哪儿的问题,希望各位高手能给于指导,感激不尽。