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

📄 airportdepview.cpp

📁 使飞机进离港航班的时间在一时间段内达到最小.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

void CAirportDepView::doOneGenerationModified()  //修改一代种群
{
	int toCross = (population * CROSS_FACTOR) / 100;  
    int toMute = (population * MUTE_FACTOR) / 100; 	
        
    cross(toCross, toMute);  //交叉    
    mute(toCross, toMute);  //变异
	sort();                  //排序
	eliminate(toCross, toMute);  //去除路径长度相同的个体(免疫选择)    	
}

void CAirportDepView::cross(int toCross, int toMute)        //选择一些种群进行交叉操作
{
   int outputStart;
   int l1,l2;

   outputStart = population - toCross - toMute;    
   for(int i = outputStart; i < population-toMute; i++)
   {
	   l1=rand()%(outputStart);
       l2=rand()%(outputStart);
	   Clone(cross2Group(airport[l1],airport[l2]),airport[i]); 
   }
}

void CAirportDepView::Clone(Airport g,Airport & newAirport)       //克隆父代  
{      
   vector<Flight> fArrTmp,fDepTmp;
   
   if(!fArrTmp.empty())
	   fArrTmp.erase(fArrTmp.begin(),fArrTmp.end());
   if(!fDepTmp.empty())
	   fDepTmp.erase(fDepTmp.begin(),fDepTmp.end());   

   for(int i=0;i<flight_ArrNumber;i++)      //克隆到达航班
   {	   
	   fArrTmp.push_back(g.GetFlightArr(i));	   
   }
   for(i=0;i<flight_ArrNumber;i++)
   {
	   fArrTmp[i].Clear_Flight_Delay();
	   fArrTmp[i].Set_Flight_Real(-1);
	   fArrTmp[i].SetFlightFind(false);

   }
   for(i=0;i<flight_DepNumber;i++)          //克隆出发航班
   {
	   fDepTmp.push_back(g.GetFlightDep(i));
   }  
   for(i=0;i<flight_DepNumber;i++)          
   {
	   fDepTmp[i].Clear_Flight_Delay();
	   fDepTmp[i].Set_Flight_Real(-1);
	   fDepTmp[i].SetFlightFind(false);
   } 

   newAirport.InitialAirport(true);  //随机产生到达和出发容量
  /* for(int t=0;t<T;t++)
   {
	   newAirport.SetAirport_Arr(t,g.GetAirport_Arr(t));     //克隆到达航班容量
	   newAirport.SetAirport_Dep(t);
   } */

   newAirport.SetFlightArr(fArrTmp);
   newAirport.SetFlightDep(fDepTmp);   
   newAirport.SetAirport_ArrFlight();
   newAirport.SetAirport_DepFlight();
   newAirport.CountDelay_Arr();
   newAirport.CountDelay_Dep();
   newAirport.CountDelay();   
   newAirport.SetOptDone(g.isOptDone());   
}


Airport CAirportDepView::cross2Group(Airport g1,Airport g2)   //交叉两个种群
{
   		Airport child,groupRand;
		vector<Flight> path1,path2,pathTmp,farr;//fdep;
		vector<int> tempArray;
		int fcount,k,r,count=0;	
		bool fg1 = true,fg2=true,fg=true;
		int town,townInG1 = 0,townInG2=0,Num;
        
		if(!path1.empty())
			path1.erase(path1.begin(),path1.end());
		if(!path2.empty())
			path2.erase(path2.begin(),path2.end());
		if(!farr.empty())
		    farr.erase(farr.begin(),farr.end());  
		//if(!fdep.empty())
			//fdep.erase(fdep.begin(),fdep.end());
		if(!pathTmp.empty())
			pathTmp.erase(pathTmp.begin(),pathTmp.end());
		if(!tempArray.empty())
			tempArray.erase(tempArray.begin(),tempArray.end());
        
		town=rand()%(flight_ArrNumber);	
		
		for(int j=0;j<flight_ArrNumber;j++)
		{
			path1.push_back(g1.GetFlightArr(j));   		
			path2.push_back(g2.GetFlightArr(j));
		}
        for(int i=0;i<flight_ArrNumber;i++)
        {  
			if(CompareFlightNum(path1[i],Flight_Arr[town]))
			    townInG1 = i;
			if(CompareFlightNum(path2[i],Flight_Arr[town]))
				townInG2 = i;
        }        
		tempArray.push_back(town);
	    count++;
        do
        {
			townInG1--;        townInG2++;
            if(townInG1 < 0)    fg1 = false;            
			if(townInG2 >= flight_ArrNumber)    fg2 = false;   
            if(fg1)
            {                
                //tg1=path1[townInG1].Get_Flight_Num();
				for(k=0;k<count;k++)
				{
					fcount=tempArray[k];
					if(CompareFlightNum(Flight_Arr[fcount],path1[townInG1]))
						fg1=false;
				}
				if(fg1)
				{				    
					//tempArray[count]=tg1;
					r=-1;
					do
					{ r++; }					
					while(!CompareFlightNum(Flight_Arr[r],path1[townInG1]));
					tempArray.push_back(r);
				    count++;
				}                   
            }
            if(fg2)
            {                
				//tg2=path2[townInG2].Get_Flight_Num();
                for(k=0;k<count;k++)
				{
					fcount=tempArray[k];					
					if(CompareFlightNum(Flight_Arr[fcount],path2[townInG2]))
						 fg2=false;
				}
				if(fg2)
				{
					r=-1;
					do
					{ r++; }					
					while(!CompareFlightNum(Flight_Arr[r],path2[townInG2]));
					tempArray.push_back(r);
				    //tempArray[count]=tg2;
					count++;
				}                
            }
        } while(fg1 || fg2);   
		
		if(count<flight_ArrNumber)
        {			
			groupRand.SetFlightArr(true);            
			for(j=0;j<flight_ArrNumber;j++)
				pathTmp.push_back(groupRand.GetFlightArr(j));            
			for(i=0;i<flight_ArrNumber;i++)
            {                
                //rt=pathTmp[i].Get_Flight_Num();
                for(k=0;k<count;k++)
				{
					fcount=tempArray[k];				
					if(CompareFlightNum(Flight_Arr[fcount],pathTmp[i]))
						fg=false;
				}
				if(fg)
				{ 
					r=-1;
					do
					{ r++; }					
					while(!CompareFlightNum(Flight_Arr[r],pathTmp[i]));
					tempArray.push_back(r);				  
				    count++;
				} 
                fg=true;
            }
        }		
        for(i = 0; i < count; i++)
		{	
			Num=tempArray[i];			
			//child.SetFlightArr(i,Flight_Arr[Num]);
			farr.push_back(Flight_Arr[Num]);
		}
		for(i=0;i<flight_ArrNumber;i++)
		{
			farr[i].Clear_Flight_Delay();
			farr[i].Set_Flight_Real(-1);
			farr[i].SetFlightFind(false);
		}
	/*	for(i=0;i<flight_DepNumber;i++)
		{
			fdep.push_back(Flight_Dep[i]);
		}

		for(i=0;i<flight_DepNumber;i++)
		{
			fdep[i].Clear_Flight_Delay();
			fdep[i].Set_Flight_Real(-1);
			fdep[i].SetFlightFind(false);
		} */

		child.SetFlightArr(farr);
		child.SetFlightDep(Flight_Dep);
		child.InitialAirport(true);
		child.SetAirport_ArrFlight();
		child.SetAirport_DepFlight();
		child.CountDelay_Arr();
		child.CountDelay_Dep();
		child.CountDelay();
		//child.CountDelayFlight_Arr();
		//child.CountDelayFlight_Dep();
		//child.CountDelayFlight();
		child.SetOptDone(false);            
        return child;
}

void CAirportDepView::mute(int toCross, int toMute)    //选择一些种群进行变异操作
{     
     Airport oldGen,newGen;
	 int n1,n2; 
	 Flight ff;
	 vector<Flight> ArrTmp;      
     
	 ArrTmp.erase(ArrTmp.begin(),ArrTmp.end());

	 n1=rand()%(flight_ArrNumber);
	 n2=rand()%(flight_ArrNumber);	 
	 for(int k = 0; k < toMute; k++)
     {
        if(k == 0)			
			oldGen=airport[0];
        else			
			oldGen=airport[rand()%(population-toMute)];
		Clone(oldGen,newGen);
        if(!oldGen.isOptDone())
        {
            newGen.do2Opt();
        } 
		else
        {					
			for(int i=0;i<flight_ArrNumber;i++)      //克隆到达航班
			{
				ff=newGen.GetFlightArr(i);
				ArrTmp.push_back(ff);	                	   
			}
			for(i=0;i<flight_ArrNumber;i++)      
			{				
				ArrTmp[i].Clear_Flight_Delay();
				ArrTmp[i].Set_Flight_Real(-1);
				ArrTmp[i].SetFlightFind(false);
			}
			ff=ArrTmp[n1];				
			ArrTmp[n1]=ArrTmp[n2];
			ArrTmp[n2]=ff;				
			
			newGen.SetFlightArr(ArrTmp);
			newGen.SetFlightDep(Flight_Dep);
			//newGen.InitialAirport(true);
			newGen.SetAirport_ArrFlight();
			newGen.SetAirport_DepFlight();
			newGen.CountDelay_Arr();
			newGen.CountDelay_Dep();
			newGen.CountDelay();
			//newGen.CountDelayFlight_Arr();
			//newGen.CountDelayFlight_Dep();
			//newGen.CountDelayFlight();
			newGen.SetOptDone(false);
            newGen.do2Opt();
        }      
		Clone(newGen,airport[(k+population)-toMute]);
	 }
}    


bool CAirportDepView::CompareFlightNum(Flight f1,Flight f2)  //比较航班号 
{
	int result;
/*	char tmp1[7],tmp2[7];	

	for(int k=0;k<6;k++)
	{
		tmp1[k]=buf1[k];
		tmp2[k]=buf2[k];
	}
	tmp1[k+1]='\0';
	tmp2[k+1]='\0';
	result=strcmp(tmp1,tmp2);	*/
	result=strcmp(f1.Get_Flight_Num(),f2.Get_Flight_Num());	
	if(result==0)
		return true;
	else
		return false;
} 

void CAirportDepView::SetBacter()   //妥协方法接种疫苗(疫苗取自代理理想点)
{
	int cRand,i,j,k; 		
	vector<Flight> pathTmp1,pathTmp2,temp1,temp2;

	//for(int u=(CROSS_FACTOR/10); u<MUTE_FACTOR; u++)
	for(int u=2; u<50; u++)
	{	
		pathTmp1.erase(pathTmp1.begin(),pathTmp1.end());
		pathTmp2.erase(pathTmp2.begin(),pathTmp2.end());
		temp1.erase(temp1.begin(),temp1.end());
		temp2.erase(temp2.begin(),temp2.end());

		for(i=0;i<flight_ArrNumber;i++)						
		    pathTmp1.push_back(airport[u].GetFlightArr(i));
		for(i=0;i<flight_ArrNumber;i++)			
			pathTmp2.push_back(airport[0].GetFlightArr(i));		
		
		cRand=rand()%(flight_ArrNumber-1);
		
		i=0;
		
		if(!CompareFlightNum(pathTmp1[i],pathTmp2[cRand]))
		{
			do
			{ i++; }
			while(!CompareFlightNum(pathTmp1[i],pathTmp2[cRand]));			
		}		

		for(k=0;k<2;k++)
		{
			do
			{
				if(i==flight_ArrNumber-1)
					i=0;
				else	i++;
				if(cRand==flight_ArrNumber-1)
					cRand=0;
				else 	cRand++;
			}while(CompareFlightNum(pathTmp1[i],pathTmp2[cRand]));
			temp1.push_back(pathTmp1[i]);
			temp2.push_back(pathTmp2[cRand]);
			pathTmp1[i]=pathTmp2[cRand];			
            pathTmp1[i].SetFlightFind(true);
		}			
		
		for(k=0;k<temp2.size();k++)
		{        
			j=-1;
			do
			{ j++; }		
            while(!(CompareFlightNum(pathTmp1[j],temp2[k]))||(pathTmp1[j].GetFlightFind()));
			pathTmp1[j]=temp1[k];			
		}		
		
		for(i=0;i<flight_ArrNumber;i++)
		{
			pathTmp1[i].Clear_Flight_Delay();
			pathTmp1[i].Set_Flight_Real(-1);
			pathTmp1[i].SetFlightFind(false);
		}
		airport[u].SetFlightArr(pathTmp1);
		airport[u].SetFlightDep(Flight_Dep);
		
		airport[u].SetAirport_ArrFlight();		
		airport[u].SetAirport_DepFlight();
		airport[u].CountDelay_Arr();
		airport[u].CountDelay_Dep();
		airport[u].CountDelay();
		//airport[u].CountDelayFlight_Arr();
		//airport[u].CountDelayFlight_Dep();
		//airport[u].CountDelayFlight();
	}
	sort();
}

void CAirportDepView::OnCIA() 
{
	// TODO: Add your command handler code here
    m_ptOrigin=0;
	CClientDC dc(this);	
	ReleaseDC(&dc); //使窗口重绘
    
	m_strArray.RemoveAll(); //清空数组

	Generate_Airport();
	
    //doOneGenerationModified();
	//SetBacter();  //接种疫苗
	for(int m=0;m<5;m++)
	{
		SetBacter();  //接种疫苗
		doOneGenerationModified();
	    //SetBacter();  //接种疫苗
	}
    sort();
    for(int i=0;i<10;i++)
		OutAirport(airport[i]); 
}

void CAirportDepView::OnFCFS() //先来先服务算法
{
	// TODO: Add your command handler code here
    
	Airport air;

	airport.erase(airport.begin(),airport.end());

	for(int i=0;i<population;i++)
	{
		air.SetFlightArr(true);
	    air.SetFlightDep(true);
		air.InitialAirport(true);

		air.Set_FCFSArrFlight();
	   	air.Set_FCFSDepFlight();
		air.CountDelay_Arr();
		air.CountDelay_Dep();
		air.CountDelay();

		airport.push_back(air);    
	}
	sort();
	for(i=0;i<10;i++)
		OutAirport(airport[i]);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -