求大神赐教!为什么运行后不出结果?

bella19901010 2013-03-31 12:15:33
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include"iostream.h"

#define CLOCKS_PER_SEC ((clock_t)1000)
#define P_num 80 //粒子数目
#define dim 8 //粒子维数
#define low 1 //搜索域范围
#define high 8
#define iter_num 200
#define V_max 2 //速度范围
#define c1 2
#define c2 2
#define w 0.5
#define alp 1
int Deb=0;
int Fin=8192;
int iter;
int available;
int particle[P_num][dim]; //个体集合
int particle_loc_best[P_num][dim]; //每个个体局部最优向量
double particle_loc_fit[P_num]; //个体的局部最优适应度,有局部最优向量计算而来
int particle_glo_best[dim]; //全局最优向量
double gfit; //全局最优适应度,有全局最优向量计算而来
int particle_v[P_num][dim]; //记录每个个体的当前代速度向量
double particle_fit[P_num];
double particle_value[P_num];

void GenerateInitial(void);
void CalculateFitnessValue(void);
void OutputTextReport(void);
void FindPbestAndGbest(void);
void renew_particle();
void renew_var();


void main()
{
clock_t start, end;
start = clock();
available=rand()%2;
if(available==1)
{
iter=0;
GenerateInitial();
CalculateFitnessValue();
FindPbestAndGbest();
cout<<"gfit="<<gfit<<" ";
while(iter<iter_num)
{
iter++;
renew_var();
renew_particle();
CalculateFitnessValue();
FindPbestAndGbest();
OutputTextReport();
cout<<"gfit="<<gfit<<" ";
}
}
end = clock();
cout<<"Run time: "<<(double)(end - start) / CLOCKS_PER_SEC<<"S"<<endl;
}

void GenerateInitial(void)
{
int i,j,k,x,sum;
for(i=0;i<P_num;i++)
{
for(j=0;j<dim;j++)
{
x=rand()%8+1;
particle[i][j]=x;
for(k=0;k<j;k++)
{
if(particle[i][k]==particle[i][j])
{
j--;
break;
}
}
}
sum=particle[i][0]*pow(2.0,3)+particle[i][1]*pow(2.0,2)+particle[i][2]*2+particle[i][3]+particle[i][4]*pow(2.0,3)+particle[i][5]*pow(2.0,2)+particle[i][6]*2+particle[i][7];
while(sum>Fin)
{
for(j=0;j<dim;j++)
{
x=rand()%8+1;
particle[i][j]=x;
for(k=0;k<j;k++)
{
if(particle[i][k]==particle[i][j])
{
j--;
break;
}
}
}
sum=particle[i][0]*pow(2.0,3)+particle[i][1]*pow(2.0,2)+particle[i][2]*2+particle[i][3]+particle[i][4]*pow(2.0,3)+particle[i][5]*pow(2,2)+particle[i][6]*2+particle[i][7];
}


}
for(i=0;i<P_num;i++)
{
for(j=0;j<dim;j++)
{
particle_v[i][j]=rand()%5-2;
}
}

}

void CalculateFitnessValue(void)
{
double temp1,temp2,x1,x2;
int i;
for(i=0;i<P_num;i++)
{
if(particle_fit[i]>Fin)
break;
else
{
temp1=particle[i][0]*pow(2,3)+particle[i][1]*4+particle[i][2]*2+1;
temp2=particle[i][4]*pow(2,3)+particle[i][5]*4+particle[i][6]*2+1;
x1=4.096*temp1/1023.0-0.048;
x2=4.096*temp2/1023.0-0.048;
particle_value[i] = temp1+temp2;
particle_fit[i] = 1/(x1+x2);
}
}
}

void FindPbestAndGbest()
{
int i,j,a,b,p,q;
if(iter==0)
{
for(i=0;i<P_num;i++)
{
for(j=0;j<dim;j++)
{
particle_loc_best[i][j] = particle[i][j];
}
particle_loc_fit[i] = particle_fit[i];
}
gfit = particle_loc_fit[0];
j=0;
for(i=1; i<P_num; i++)
{
if(particle_loc_fit[i]>gfit)
{
gfit = particle_loc_fit[i];
j = i;
}
}
for(i=0; i<dim; i++)
{
particle_glo_best[i] = particle_loc_best[j][i];
}
}
else
{
for(a=0;a<P_num;a++)
{
if(particle_fit[a] > particle_loc_fit[a])
{
particle_loc_fit[a]=particle_fit[a];
for(b=0;b<dim;b++)
{
particle_loc_best[a][b] = particle[a][b];
}
}
}
for(p=0,q=-1;p<P_num;p++)
{
if(particle_loc_fit[p]>gfit)
{
gfit = particle_loc_fit[p];
q = p;
}
}
if(q != -1)
{
for(p=0; p<dim; p++)
{
particle_glo_best[p] = particle_loc_best[q][p];
}
}
}
}

void renew_particle()
{
int i,j,k;
for(i=0; i<P_num; i++)
{
for(j=0; j<dim; j++)
{

particle[i][j] += alp*particle_v[i][j];
if(particle[i][j] > high)
{
particle[i][j] = high;
}
if(particle[i][j] < low)
{
particle[i][j] = low;
}
for(k=0;k<j;k++)
{
if(particle[i][k]==particle[i][j])
{
j--;
break;
}
}

}
}
}

void renew_var()
{
int t,i,j;
t=rand()%11;
double l;
l=t/10.0;
for(i=0; i<P_num; i++)
{
for(j=0; j<dim; j++)
{
particle_v[i][j]=w*particle_v[i][j]+c1*l*(particle_loc_best[i][j]-particle[i][j])+c2*l*(particle_glo_best[j]-particle[i][j]);
if(particle_v[i][j] > V_max)
{
particle_v[i][j] = V_max;
}
if(particle_v[i][j] < -V_max)
{
particle_v[i][j] = -V_max;
}
}
}
}

void OutputTextReport(void)
{
int i;
cout<<"iter="<<iter<<" ";
for(i=0;i<dim;i++)
cout<<particle_glo_best[i];
cout<<endl;
}














...全文
73 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bella19901010 2013-03-31
  • 打赏
  • 举报
回复
引用 1 楼 tonforce 的回复:
C/C++ code?12345678910111213141516171819202122// 看你的这部分代码,这里的for循环很有可能会是个死循环:for(j=0; j<dim; j++){ particle[i][j] += alp*particle_v[i][j]; if(particle[i][j] > high) { pa……
那句代码的意图是不能出现重复的数字,如果出现就重新生成。 而且 如果我不加void renew_var()程序是可以运行的。
bella19901010 2013-03-31
  • 打赏
  • 举报
回复
那句代码的意图是不能出现重复的数字,如果出现就重新生成。
tonforce 2013-03-31
  • 打赏
  • 举报
回复

// 看你的这部分代码,这里的for循环很有可能会是个死循环:
for(j=0; j<dim; j++)
{

	particle[i][j] +=  alp*particle_v[i][j];
	if(particle[i][j] > high)
	{
		particle[i][j] = high;
	}
	if(particle[i][j] < low)
	{
		particle[i][j] = low;
	}
	for(k=0;k<j;k++)
	{
		if(particle[i][k]==particle[i][j]) // 这个条件?
		{
			j--; // j-- ?,j++ 后 又j--,j还是原数,所以很有可能是这个地方造成了死循环
			break;
		}
	}
}

64,654

社区成员

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

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