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

📄 airport.cpp

📁 使飞机进离港航班的时间在一时间段内达到最小.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				
				if((t_real<0) && (t_plan<(t+1)))
				{										
					Airport_DepFlight[t].push_back(flightDep[j]);
					flightDep[j].Set_Flight_Real(t+1);
					flightDep[j].Set_Flight_Delay();
					num++;
					if(num==Airport_Dep[t])
						full=true;									
				}
				j++;
			}while((j<flight_DepNumber)&&(!full));	
		}
	/*	if(!full)
		{ //尽量使该时间段的出发航班数达到该时间段的出发容量
			j=0;
			do
			{
				t_real=flightDep[j].Get_Flight_Real();
				t_plan=flightDep[j].Get_Flight_Plan();
				if((t_real<0)&&(t_plan=(t+2)))
				{
					Airport_DepFlight[t].push_back(flightDep[j]);
					flightDep[j].Set_Flight_Real(t+1);
					if(t_plan<(t+1))
						flightDep[j].Set_Flight_Delay();
					num++;
					if(num==Airport_Dep[t])
						full=true;					
				}
				j++;
			}while((j<flight_DepNumber)&&(!full));
		} */
	}
}


void Airport::GetAirport_DepFlight(int t)       //获得机场在t时间段的出发航班
{
	Flight ff;
	vector<Flight>::iterator pos;
    for(pos=Airport_DepFlight[t].begin();pos!=Airport_DepFlight[t].end();pos++)
	{
		ff=*pos;
		cout<<ff.Get_Flight_Num()<<endl;
	}		
}

void Airport::CountDelay_Arr()  //计算到达延误时间段和航班数
{
	Flight ff;
	int k;

    DelayTime_Arr=0;
	DelayFlight_Arr=0;
	for(int i=0;i<flight_ArrNumber;i++)
	{
		ff=flightArr[i];
	/*	k=ff.Count_FlightDelay();
		DelayTime_Arr+=k; */
		if(ff.Get_Flight_Delay()>0)
		{
			k=ff.Get_Flight_Real()-ff.Get_Flight_Plan();
			DelayTime_Arr+=k;
			DelayFlight_Arr++;
		}
		else
			if(ff.Get_Flight_Real()<0)
			{
				k=(T+1)-ff.Get_Flight_Plan();
				DelayTime_Arr+=k;
				DelayFlight_Arr++;
			}		
	}
}

void Airport::CountDelay_Dep()  //计算出发延误时间段和航班数
{
	Flight ff;
	int k;

	DelayTime_Dep=0;
	DelayFlight_Dep=0;
	for(int i=0;i<flight_DepNumber;i++)
	{
		ff=flightDep[i];
	/*	k=ff.Count_FlightDelay();
		DelayTime_Dep+=k;  */
		if(ff.Get_Flight_Delay()>0)
		{
			k=ff.Get_Flight_Real()-ff.Get_Flight_Plan();
			DelayTime_Dep+=k;
			DelayFlight_Dep++;
		}
		else
			if(ff.Get_Flight_Real()<0)
			{
				k=(T+1)-ff.Get_Flight_Plan();
				DelayTime_Dep+=k;
				DelayFlight_Dep++;
			}		
	}
}

void Airport::CountDelay()  //计算总的延误时间段数和航班数
{	
	DelayTime=(DelayTime_Arr*2)+DelayTime_Dep; 
	DelayFlight=DelayFlight_Arr+DelayFlight_Dep;
}

/*void Airport::CountDelayFlight_Arr()  //计算到达延误航班数
{
	Flight ff;

    DelayFlight_Arr=0;
	for(int i=0;i<flight_ArrNumber;i++)
	{
        ff=flightArr[i];
		if(ff.Get_Flight_Delay()>0)		
			DelayFlight_Arr++;
		else
			if(ff.Get_Flight_Real()<0)
				DelayFlight_Arr++; 
	}
}

void Airport::CountDelayFlight_Dep()  //计算出发延误航班数
{
	Flight ff;

	DelayFlight_Dep=0;
	for(int i=0;i<flight_DepNumber;i++)
	{
        ff=flightDep[i];
		if(ff.Get_Flight_Delay()>0)		
			DelayFlight_Dep++;
		else
			if(ff.Get_Flight_Real()<0)
				DelayFlight_Dep++;
	}
}*/

void Airport::Reverse_flightArr(int startIndex, int stopIndex)   //改变到达航班容器中航班的位置
{
    Flight ff;

	if(startIndex >= stopIndex || startIndex >= flight_ArrNumber || stopIndex < 0)
            return ;
    for(; startIndex < stopIndex; stopIndex--)
    {          
		ff=flightArr[startIndex];
		flightArr[startIndex]=flightArr[stopIndex];
		flightArr[stopIndex]=ff;
		startIndex++;        
	}
}

void Airport::Reverse_flightDep(int startIndex, int stopIndex)   //改变出发航班容器中航班的位置
{
    Flight ff;

	if(startIndex >= stopIndex || startIndex >= flight_DepNumber || stopIndex < 0)
            return ;
    for(; startIndex < stopIndex; stopIndex--)
    {          
		ff=flightDep[startIndex];
		flightDep[startIndex]=flightDep[stopIndex];
		flightDep[stopIndex]=ff;
		startIndex++;        
	}
}


void Airport::do2Opt()   //优化到达航班,通过换位使航班总的延误时间段减小
{
	bool done = false;
	int counts,t1,t2,t3,t4;
	Flight tmp;
		  
	if(optDone)
		return;	
	
	counts=flight_ArrNumber;	
	
	for(int k = 0; (k < counts) && (! done); k++)
    {
        done = true;
        for(int i = 0; i < counts; i++)
        {
			for(int j = i + 2; j < counts; j++)
			{
				//if((Distance(Path[i],Path[(i + 1) % counts])+ Distance(Path[j],Path[(j + 1) % counts])) > (Distance(Path[i],Path[j]) + Distance(Path[(i + 1) % counts],Path[(j + 1) % counts])))
                t1=flightArr[i].Count_FlightDelay()+flightArr[(i + 1) % counts].Count_FlightDelay();
				t2=flightArr[j].Count_FlightDelay()+flightArr[(j + 1) % counts].Count_FlightDelay();
                t3=flightArr[i].Count_FlightDelay()+flightArr[j].Count_FlightDelay();
                t4=flightArr[(i + 1) % counts].Count_FlightDelay()+flightArr[(j + 1) % counts].Count_FlightDelay();
				if((t1+t2)>(t3+t4))
				{					
				    tmp=flightArr[(i + 1) % counts];
					flightArr[(i + 1) % counts]=flightArr[j];
					flightArr[j]=tmp;

					Reverse_flightArr(i + 2, j - 1);
					//Reverse_flightDep(i + 2, j - 1);
					done = false;                    
				} 
			}
		}        
	}
	optDone = true; 
}

void Airport::Set_FCFSArrFlight()    //先来先服务算法设置机场在各个时间段的到达航班
{
	int num,j,t_plan,t_real,t_delay;
	bool full;

	for(int t=0;t<T;t++)
		Airport_ArrFlight[t].erase(Airport_ArrFlight[t].begin(),Airport_ArrFlight[t].end());	

	for(t=0;t<T;t++)       //各时间段
	{
		num=0;	j=0;  full=false;
		//使到达航班放入合适的到达航班容器中
		do
		{
			t_plan=flightArr[j].Get_Flight_Plan();
			t_real=flightArr[j].Get_Flight_Real();
			t_delay=flightArr[j].Get_Flight_DelayTime();
			
			if((t_plan<(t+1)) && (t_real<0))  //先来先服务算法
			{
				Airport_ArrFlight[t].push_back(flightArr[j]);
				flightArr[j].Set_Flight_Real(t+1);
				if(t_plan<(t+1))
					flightArr[j].Set_Flight_Delay();
				num++;
				if(num==Airport_Arr[t])
					full=true;
			}             	
			j++;					
		}while((j<flight_ArrNumber)&&(!full));	

		if(!full)
		{
			j=0;
			do
			{
				t_plan=flightArr[j].Get_Flight_Plan();
				t_real=flightArr[j].Get_Flight_Real();
				//t_delay=flightArr[j].Get_Flight_DelayTime();
				if((t_real<0)&&(t_plan==(t+1)))	
				{
					Airport_ArrFlight[t].push_back(flightArr[j]);
					flightArr[j].Set_Flight_Real(t+1);
					
					num++;
					if(num==Airport_Arr[t])
						full=true;
				} 
				j++;				
			}while((j<flight_ArrNumber)&&(!full));
		}	
	
	/*	if(!full)        //使到达和出发相关
		{			
			SetAirport_Arr(t,num);      //设置t时间段的到达容量
			SetAirport_Dep(t);			//设置t时间段的出发容量
		} 	*/	
	}	
}


void Airport::Set_FCFSDepFlight()    //先来先服务算法设置机场在各个时间段的出发航班
{
	int num,j,t_plan,t_real,t_delay;
	bool full;

	for(int t=0;t<T;t++)
		Airport_DepFlight[t].erase(Airport_DepFlight[t].begin(),Airport_DepFlight[t].end());

	for(t=0;t<T;t++)       //各时间段
	{
		num=0;	j=0;  full=false;
		//使出发航班放入合适的出发航班容器中
		do
		{		
			t_plan=flightDep[j].Get_Flight_Plan();	
			t_real=flightDep[j].Get_Flight_Real();
			t_delay=flightDep[j].Get_Flight_DelayTime();
			
			if((t_plan<(t+1)) && (t_real<0))		//先来先服务算法		
			{
				Airport_DepFlight[t].push_back(flightDep[j]);
				flightDep[j].Set_Flight_Real(t+1);
				if(t_plan<(t+1))
					flightDep[j].Set_Flight_Delay();
				num++;
				if(num==Airport_Dep[t])
					full=true;
			}
			
			j++;					
		}while((j<flight_DepNumber)&&(!full));

		if(!full)
		{
			j=0;
			do
			{
				t_plan=flightDep[j].Get_Flight_Plan();
				t_real=flightDep[j].Get_Flight_Real();
				
				if((t_real<0)&&(t_plan==(t+1)))						
				{
					Airport_DepFlight[t].push_back(flightDep[j]);
					flightDep[j].Set_Flight_Real(t+1);
					
					num++;
					if(num==Airport_Dep[t])
						full=true;
				} 
				j++;				
			}while((j<flight_DepNumber)&&(!full));
		}		
		
	/*	if(!full)
		{ //尽量使该时间段的出发航班数达到该时间段的出发容量
			j=0;
			do
			{
				t_real=flightDep[j].Get_Flight_Real();
				t_plan=flightDep[j].Get_Flight_Plan();
				if(t_real<0)
				{
					Airport_DepFlight[t].push_back(flightDep[j]);
					flightDep[j].Set_Flight_Real(t+1);
					if(t_plan<(t+1))
						flightDep[j].Set_Flight_Delay();
					num++;
					if(num==Airport_Dep[t])
						full=true;					
				}
				j++;
			}while((j<flight_DepNumber)&&(!full));
		} */
	}
}

⌨️ 快捷键说明

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