📄 parallel.cc
字号:
break;
case 21:
ch_source = "0.2/21.txt";
break;
case 22:
ch_source = "0.2/22.txt";
break;
case 23:
ch_source = "0.2/23.txt";
break;
case 24:
ch_source = "0.2/24.txt";
break;
case 25:
ch_source = "0.2/25.txt";
break;
case 26:
ch_source = "0.2/26.txt";
break;
case 27:
ch_source = "0.2/27.txt";
break;
}
break;
case 1:
switch(num)
{
case 16:
ch_source = "0.1/16.txt";
break;
case 17:
ch_source = "0.1/17.txt";
break;
case 18:
ch_source = "0.1/18.txt";
break;
case 19:
ch_source = "0.1/19.txt";
break;
case 20:
ch_source = "0.1/20.txt";
break;
case 21:
ch_source = "0.1/21.txt";
break;
case 22:
ch_source = "0.1/22.txt";
break;
case 23:
ch_source = "0.1/23.txt";
break;
case 24:
ch_source = "0.1/24.txt";
break;
case 25:
ch_source = "0.1/25.txt";
break;
case 26:
ch_source = "0.1/26.txt";
break;
case 27:
ch_source = "0.1/27.txt";
break;
}
break;
case 0:
switch(num)
{
case 16:
ch_source = "0.0/16.txt";
break;
case 17:
ch_source = "0.0/17.txt";
break;
case 18:
ch_source = "0.0/18.txt";
break;
case 19:
ch_source = "0.0/19.txt";
break;
case 20:
ch_source = "0.0/20.txt";
break;
case 21:
ch_source = "0.0/21.txt";
break;
case 22:
ch_source = "0.0/22.txt";
break;
case 23:
ch_source = "0.0/23.txt";
break;
case 24:
ch_source = "0.0/24.txt";
break;
case 25:
ch_source = "0.0/25.txt";
break;
case 26:
ch_source = "0.0/26.txt";
break;
case 27:
ch_source = "0.0/27.txt";
break;
}
break;
}
strcat(ch_destination,ch_source);//a的值/num.txt"
fp=fopen(ch_destination,"w");
fprintf(fp,"%d\n",num);
for(int s=0;s<2*num;s+=2)
{
fprintf(fp,"%d%c%d\n",best[s],' ',best[s+1]);
tempoint.x = best[s];
tempoint.y = best[s+1];
Shade(tempoint);
MaxHDis(tempoint);
AdjustDis(tempoint);
for(int h=0;h<72;h++)
{
fprintf(fp,"%f\n",m_maxdis[h]);
}
}
Best_Fit = FitFunction(best,num);
fprintf(fp,"%d\n%f",Best_Fit,float(Best_Fit)/Global_area); //输出最好覆盖
fclose(fp);
}
/*******************************************************************************/
/*****************************主要的GA处理函数**********************************/
//int GASearch(int Num, int Size,float A,int Iteration)
void Coding()
{
for( int i = 0; i < size; i++ )
{
for( int j = 1; j <= num; j++ )
{
int temp_y = 15*j-1;
int temp_x = 15*j-8;
int m = individual_vector[i][2*j-1];
while(m/2!=0)
{
binary[i][temp_y] = m%2;
m = m/2;
temp_y--;
}
binary[i][temp_y] = 1;
m = individual_vector[i][2*j - 2];
while(m/2!=0)
{
binary[i][temp_x] = m%2;
m = m/2;
temp_x--;
}
binary[i][temp_x] = 1;
}
}
}
void CrossOver()
{
int tem;
int r;
//产生随机数时设置的种子
// srand((unsigned)time(NULL));
for( int i = 0; i < size/2; i++)
{
int inc_i = i+size/2;
r =int(randf()*(15*num-1));
for( int j = r+1; j < 15*num; j++)
{
tem = binary[i][j];
binary[i][j] = binary[inc_i][j];
binary[inc_i][j] = tem;
}
}
}
void Mutation()
{
int po;
float pm;
//srand((unsigned)time(NULL));
for(int i=0;i<size;i++)
{
pm=randf();
if(pm<=PMUTATION)
{
po=int(randf()*(15*num));
binary[i][po]=1-binary[i][po];
}
}
}
//解码时就把交叉和变异后的个体赋值给了newindividual_vector 的后半段 比较费时
void Decoding()
{
int exponential;
int exponential_x;
int i;
int j;
int sum_y;
int sum_x;
for( i = 0; i < size; i++ ) //i = 19的时候出现错误
{
for( j = 0; j < num; j++ )
{
sum_y = 0;
sum_x = 0;
for( int k = (j+1) * 15 - 7; k < ( j+1 ) * 15; k++)
{
exponential = 14-(k-15*j);
sum_y = binary[i][k] * int(pow(2, exponential)) + sum_y; // 把y坐标换算成十进制
}
newindividual_vector[i+size][2*j+1] = sum_y;
for( k = (j+1) * 15-15; k < (j+1) *15 - 7; k++ )
{
exponential_x = 7-(k-15*j);
sum_x = binary[i][k] * int(pow(2, exponential_x)) + sum_x;
}
newindividual_vector[i+size][2*j] = sum_x;
}
}
/* for(i = size-2; i < size; i++ ) //i = 19的时候出现错误
{
for( j = 0; j < num; j++ )
{
sum_y = 0;
sum_x = 0;
for( int k = (j+1) * 15 - 7; k < ( j+1 ) * 15; k++)
{
exponential = 14-(k-15*j);
sum_y = binary[i][k] * int(pow(2, exponential)) + sum_y; // 把y坐标换算成十进制
}
newindividual_vector[i+size][2*j+1] = sum_y;
for( k = (j+1) * 15-15; k < (j+1) *15 - 7; k++ )
{
exponential_x = 7-(k-15*j);
sum_x = binary[i][k] * int(pow(2, exponential_x)) + sum_x;
}
newindividual_vector[i+size][2*j] = sum_x;
//newindividual_vector[i+size][2*j] = sum_x; //为什么不能把值赋给它呢!!!!!!!!!!!!!!!!!!
}
}
*/
}
//限制条件判断 ,判断每个点是否在陆地上,假如不在陆地上,随机生成这个点就比较费时,
//同时计算新产成的个体的适应度,赋值给newindividual_vector[size] ~ newindividual_vector[2*size]
void Constrain()
{
int x_temp;
int y_temp;
int i;
int j;
for ( i=size;i<2*size;i++)
{
//for( j = 0; j <2*num; j++)
// newindividual_vector[i][j] = individual_vector[0][j];
for( j = 0; j < 2*num; j += 2)
{
x_temp = newindividual_vector[i][j]; //这里有问题
y_temp = newindividual_vector[i][j+1];
if(!Region_Flag[x_temp][y_temp])
{
y_temp = y_temp/2;
while(!Region_Flag[x_temp][y_temp])
{
y_temp = y_temp/2;
x_temp = x_temp/2;
}
newindividual_vector[i][j] = x_temp;
newindividual_vector[i][j+1] = y_temp;
}
}
// new_fit[i] =NewFitFunction(newindividual_vector[i],num,a);
}
}
void Selection()
//选择适应度最高的18个
{
int x_temp;
int y_temp;
int max_temp;
int i;
int j;
fit = new float[size];
individual_vector = new int*[size];
for(i = 0; i <size; i++)
individual_vector[i] = new int[2*num];
for( i = 0; i < size-3; i++ )
{
max_temp = MaxFit_index(new_fit,2*size);
fit[i] = new_fit[max_temp];
for( j = 0; j < 2*num; j++ )
individual_vector[i][j] = newindividual_vector[max_temp][j];
new_fit[max_temp] = 0;
}
for( i = 0; i < 2*size; i++ )
delete newindividual_vector[i];
delete newindividual_vector;
delete new_fit;
//随机产生剩下的两个个体 费时
CPoint p;
//每次初始化之前把标志为置为0 !!!!!!!!!!!!!!!!!!!
for( i = size-3; i < size; i++ )
{
for(int h=0;h<256;h++)
for(int l=0;l<128;l++)
{
Flag[h][l] = 0;
}
//individual_vector[i][0] =0;
//individual_vector[i][1] =0;
//int step_x = individual_vector[i][0];
//int step_y = individual_vector[i][1];
int k = 1;
int field = 452;
while(k<=num)
{
for( int j = 0; j < 256; j++ )
{
for( int m = 0; m <128; m++ )
{
if( (Region_Flag[j][m] == 1)&&( k <= num ) )
{
p.x = j;
p.y = m;
//AK = CalAk(p);
//if(AK >= field)
int AK = SingleSpotArea[j][m];
if((AK >= field)&&(Flag[j][m]!=1))
{
individual_vector[i][2*k-2] =j;
individual_vector[i][2*k-1] =m;
Fill(p);
k++;
}
}
}
}
field = field - randf()*100;
}
fit[i] = NewFitFunction(individual_vector[i],num,a);
}
}
float NewFitFunction(int *X, int Dem,float a)
{
float a_temp = a;
float F =0; //计算总的适应度
float Fa = 0; //计算第二项适应度
float Ak_Ac = 0;//计算2/(1+Ak/Ac) - 1
CPoint point_k;
float Ak = 0;
for(int h=0;h<256;h++)
for(int l=0;l<128;l++)
{
Flag[h][l] = 0;
}
for( int i = 0; i < Dem*2; i++ )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -