⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parallel.cc

📁 主从式并行遗传算法
💻 CC
📖 第 1 页 / 共 5 页
字号:
							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 + -