Stack overflow 怎么办( 代码)

stellaxyq 2000-05-26 12:10:00
加精
上次没有贴的代码:

#define MAXCN 500 //最大群体规模
//#define MAXVN 30 //最大变量数
//#define MAXSCOPE 12 //最大的变量二进制位数
#define MAXLENGTH 400
#define PI 3.1415926

#include "stdlib.h"
#include "stdio.h"
#include "math.h"

float Gauss(int i,int j)
{
return 0;
}


class Colony
{
private:
int Chromosome[MAXCN][MAXLENGTH]; //染色体,第一维是群体规模,第二维是染色体值
int n; //群体规模
int vn; //变量数
float value[MAXCN]; //适应值
int p; //联赛选择规模
float pc; //杂交率
float pm; //变异率
int scope; //变量范围
int off; //小数点偏移位数
public:

Colony( int n_v, int vn_v, int p_v,float pc_v,float pm_v,int scope_v,int off_v);
//~Colony();
//void cal_val( float( *function)(int i) );
void choice();
void intercross(); //交叉
void variation(); //变异
void f1();
void f2();
void f3();
void f4();
void f5();
float selectbest();
};

Colony::Colony(int n_v,int vn_v,int p_v,float pc_v,float pm_v,int scope_v,int off_v)
{
int i,j;
float random; //0-1之间的随机数
n=n_v;
vn=vn_v;
p=p_v;
pc=pc_v;
pm=pm_v;
scope=scope_v;
off=off_v;
for (i=0;i<n;i++)
{
for(j=0;j<(vn*scope);j++)
{
//随机产生一个变量
random=rand()/(float)RAND_MAX;
Chromosome[i][j]=(int)(2*random);
}

}
}




//void Colony::cal_val( float (*function)())
//{
// int i;
// for(i=0;i<n;i++)
// value[i]=(*function)(i);
//}

void Colony::choice()
{
int i,j;
float random; //0-1之间的随机数
int max=0; //适应值最高的染色体位置
int num;
int next_chromosome[MAXCN][MAXLENGTH];
for(i=0;i<n;i++)
{
max=0;
for (j=0;j<p;j++)
{
//随机选择一个染色体
random=rand()/(float)RAND_MAX;
num=(int)(random*n);
if (value[num]>value[max])
max=num;
}
for(j=0;j<vn*scope;j++)
next_chromosome[i][j]=Chromosome[max][j];

}
for(i=0;i<n;i++)
for(j=0;j<vn*scope;j++)
Chromosome[i][j]=next_chromosome[i][j];

}


void Colony::intercross()
{
int i,j;
float random;
int internum=0;
int locatex,locatey,interlocate;
int temp;
for (i=0;i<n;i++)
{
//产生0-1之间的随机数
random=rand()/(float)RAND_MAX;
if (random<pc)
{
internum++;
if(internum==1)
locatex=i;
if(internum==2)
{
internum=0;
locatey=i;
random=rand()/(float)RAND_MAX;
interlocate=(int)(random*vn*scope);
for(j=interlocate;j<vn*scope;j++)
{
temp=Chromosome[locatex][j];
Chromosome[locatex][j]=Chromosome[locatey][j];
Chromosome[locatey][j]=temp;
}
}
}
}
}



void Colony::variation()
{
int i;
int vlocate;
float random;
for(i=0;i<n;i++)
{
random=rand()/(float)RAND_MAX;
if (random<pm)
{
random=rand()/(float)RAND_MAX;
vlocate=(int)(random*vn*scope);
if (Chromosome[i][vlocate]==0)
Chromosome[i][vlocate]=1;
if (Chromosome[i][vlocate]==1)
Chromosome[i][vlocate]=0;

}
}
}


void Colony::f1()
{
float val=0;
int i,j,k;
float x;
for (j=0;j<n;j++)
{
val=0;
for (i=0;i<5;i++)
{
x=0;
for(k=0;k<10;k++) //二进制转换成十进制
x=2*x+Chromosome[j][i*10+k];
x=(float)((x-512)/100.0);
val+=x*x;
}
value[j]= val;
}
}

void Colony::f2()
{
int i,k;
float val=0;
float x1,x2;
for (i=0;i<n;i++)
{
x1=0;
x2=0;
for(k=0;k<12;k++)
x1=2*x1+Chromosome[i][k];
for(k=0;k<12;k++)
x2=2*x2+Chromosome[i][12+k];
x1=(float)((x1-2048)/1000.0);
x2=(float)((x2-2048)/1000.0);
val=(float)(100*pow(x1*x1-x2,2)+pow(1-x1,2));
value[i]=val;
}
}

void Colony::f3()
{
float x,val=0;
int i,j,k;
for(j=0;j<n;j++)
{
val=0;
for (i=0;i<5;i++)
{
x=0;
for(k=0;k<10;k++)
x=2*x+Chromosome[j][i*10+k];
val+=(int)((x-512)/100.0);
}
value[j]=val;
}
}

void Colony::f4()
{
float x,val=0;
int i,j,k;
for (j=0;j<n;j++)
{
val=Gauss(0,1);
for(i=0;i<30;i++)
{
x=0;
for(k=0;k<8;k++)
x=2*x+Chromosome[j][i*8+k];
x=(float)((x-128)/100.0);
val+=(float)(i*pow(x,4));
}
value[j]=val;
}
}

void Colony::f5()
{
int i,k;
float val=0;
float x,y;
for(i=0;i<n;i++)
{
x=0;
y=0;
for(k=0;k<8;k++)
x=2*x+Chromosome[i][k];
for(k=0;k<8;k++)
y=2*y+Chromosome[i][8+k];
x=(float)((x-128)/100.0);
y=(float)((x-128)/100.0);
val=(float)(4+x*x+y*y-8*cos(2*PI*x)-8*cos(2*PI*y));
value[i]=-val;
}
}

float Colony::selectbest()
{
int i,k;
float maxv=0;//最大适应值
int maxnum=0;//最大适应值的染色体位置;
float x;
for(i=0;i<n;i++)
{
if(value[i]>maxv)
{
maxv=value[i];
maxnum=i;
}
}
printf("The best variable is:\n");
for(i=0;i<vn;i++)
{
x=0;
for(k=0;k<scope;k++)
x=2*x+Chromosome[maxnum][i*scope+k];
x=(float)((x-pow(2,scope))/pow(10,off));
printf("%f\t",x);
}
printf("\n");
return maxv;
}



void main(void)
{
int eranum=200;//指定代数
int gen;//当前代数
int cn=400;//群体规模
float pcv=0.6;//交叉率
float pmv=0.01;//变异率
int pv=100;//联赛规模
float maxvalue;

//Colony ex[5];
//printf("输入群体规模:");
//scanf("%d",&cn);
//printf("输入运行代数:");
//scanf("%d",&eranum);

//初始化5个群体
Colony ex0(cn,5,pv,pcv,pmv,10,2);
Colony ex1(cn,2,pv,pcv,pmv,12,3);
Colony ex2(cn,5,pv,pcv,pmv,10,2);
Colony ex3(cn,30,pv,pcv,pmv,8,2);
Colony ex4(cn,2,pv,pcv,pmv,8,2);

//for(i=0;i<n;i++)
//{

for(gen=0;gen<eranum;gen++)
{
ex0.f1();
ex0.choice();
ex0.intercross();
ex0.variation();
}
ex0.f1();
printf("Function 1:\n");
maxvalue=ex0.selectbest();
printf("The best value is :%f\n",maxvalue);
printf("\n");

for(gen=0;gen<eranum;gen++)
{
ex1.f2();
ex1.choice();
ex1.intercross();
ex1.variation();
}
ex1.f2();
printf("Function 2:\n");
maxvalue=ex1.selectbest();
printf("The best value is :%f\n",maxvalue);
printf("\n");


for(gen=0;gen<eranum;gen++)
{
ex2.f3();
ex2.choice();
ex2.intercross();
ex2.variation();
}
ex2.f3();
printf("Function 3:\n");
maxvalue=ex2.selectbest();
printf("The best value is :%f\n",maxvalue);
printf("\n");

for(gen=0;gen<eranum;gen++)
{
ex3.f4();
ex3.choice();
ex3.intercross();
ex3.variation();
}
ex3.f4();
printf("Function 4:\n");
maxvalue=ex3.selectbest();
printf("The best value is :%f\n",maxvalue);
printf("\n");

for(gen=0;gen<eranum;gen++)
{
ex4.f5();
ex4.choice();
ex4.intercross();
ex4.variation();
}
ex4.f5();
printf("Function 5:\n");
maxvalue=-ex4.selectbest();
printf("The best value is :%f\n",maxvalue);
printf("\n");
}


...全文
319 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2000-05-26
  • 打赏
  • 举报
回复
你每个Colony类实例至少占空间 802028 字节。5个占多大空间? 它们全都在堆栈中分配你想,这能不overflow呢?
我把你的程序改了一下:
...
void main(void)
{
...
Colony *ex0=new Colony(cn,5,pv,pcv,pmv,10,2);
Colony *ex1=new Colony(cn,2,pv,pcv,pmv,12,3);
Colony *ex2=new Colony(cn,5,pv,pcv,pmv,10,2);
Colony *ex3=new Colony(cn,30,pv,pcv,pmv,8,2);
Colony *ex4=new Colony(cn,2,pv,pcv,pmv,8,2);
//用new 是在全局堆中分配。
...
//相应的改动:
//...
for(gen=0;gen<eranum;gen++)
{
ex0->f1();
ex0->choice();
ex0->intercross();
ex0->variation();
}
ex0->f1();
//.....
delete ex0;delete ex1;delete ex2;....//最后别忘了释放内存.

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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