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

📄 airport.cpp

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

#include "stdafx.h"
#include "AirportDep.h"
#include "Airport.h"

#include "Externs.h"  //包含全局变量

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Airport::Airport()
{
    Airport_Arr.erase(Airport_Arr.begin(),Airport_Arr.end());
	Airport_Dep.erase(Airport_Dep.begin(),Airport_Dep.end());
	flightArr.erase(flightArr.begin(),flightArr.end());
	flightDep.erase(flightDep.begin(),flightDep.end());
	for(int t=0;t<T;t++)
	{
		Airport_ArrFlight[t].erase(Airport_ArrFlight[t].begin(),Airport_ArrFlight[t].end());
		Airport_DepFlight[t].erase(Airport_DepFlight[t].begin(),Airport_DepFlight[t].end());
	}

	DelayTime_Dep=0;                     //机场航班总的出发延误时间段数
	DelayTime_Arr=0;                     //机场航班总的到达延误时间段数
	DelayTime=0;                         //机场航班总的延误时间段数
	DelayFlight_Dep=0;
	DelayFlight_Arr=0;
	DelayFlight=0;
	optDone=false;
}

Airport::~Airport()
{

}


void Airport::SetFlightArr(bool f)         //生成到达航班信息
{
	int rand1,rand2;
	Flight temp,ff;

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

	for(int i=0;i<flight_ArrNumber;i++)
	{	
		ff=Flight_Arr[i];
		flightArr.push_back(ff); 		
	}
	if(f)
		for(int j=0;j<(flight_ArrNumber*2);j++)
		{
			rand1=rand()%(flight_ArrNumber);
			rand2=rand()%(flight_ArrNumber);			
			temp=flightArr[rand1];
			flightArr[rand1]=flightArr[rand2];
			flightArr[rand2]=temp;		
		}
}

void Airport::SetFlightArr(vector<Flight> f_arr)  //根据已知到达航班生成到达航班信息
{	
    flightArr.erase(flightArr.begin(),flightArr.end());
	for(int i=0;i<flight_ArrNumber;i++)
		flightArr.push_back(f_arr[i]);
}

void Airport::SetFlightDep(bool f)         //生成出发航班信息
{
	int rand1,rand2;
	Flight temp,ff;

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

	for(int i=0;i<flight_DepNumber;i++)
	{		
		ff=Flight_Dep[i];
		flightDep.push_back(ff);	
	}
	if(f)
		for(int j=0;j<(flight_DepNumber*2);j++)
		{
			rand1=rand()%(flight_DepNumber);
			rand2=rand()%(flight_DepNumber);			
			temp=flightDep[rand1];
			flightDep[rand1]=flightDep[rand2];
			flightDep[rand2]=temp;		
		}
}

void Airport::SetFlightDep(vector<Flight> f_dep)  //根据已知出发航班生成出发航班信息
{	
    flightDep.erase(flightDep.begin(),flightDep.end());
	for(int i=0;i<flight_DepNumber;i++)
		flightDep.push_back(f_dep[i]);
}

void Airport::InitialAirport(bool f)     //随机产生机场在各个时间段的容量
{
	int rand1,rand2,temp;

	Airport_Arr.erase(Airport_Arr.begin(),Airport_Arr.end());
	Airport_Dep.erase(Airport_Dep.begin(),Airport_Dep.end());

	for(int i=0;i<T;i++)
	{
        rand1=rand()%4;
		rand1+=6;
		
		Airport_Arr.push_back(rand1);
	}
	if(f)
	{
		for(int j=0;j<T*2;j++)
		{
			rand1=rand()%(T);
			rand2=rand()%(T);
			temp=Airport_Arr[rand1];
			Airport_Arr[rand1]=Airport_Arr[rand2];
			Airport_Arr[rand2]=temp;		
		}
	}
	for(i=0;i<T;i++)
	{
		switch(Airport_Arr[i])
		{
			case 6: Airport_Dep.push_back(10);
				break;
		    case 7: Airport_Dep.push_back(9);
			    break;
		    case 8: Airport_Dep.push_back(8);
			    break;
		    case 9: Airport_Dep.push_back(6);
			    break;
		    default: Airport_Dep.push_back(10);
		}		
	}
}

void Airport::SetAirport_Dep(int t)        //设置机场某时间段的出发容量
{
	switch(Airport_Arr[t])
		{
			case 6: Airport_Dep[t]=10;
				break;
		    case 7: Airport_Dep[t]=9;
			    break;
		    case 8: Airport_Dep[t]=8;
			    break;
		    case 9: Airport_Dep[t]=6;
			    break;
		    default: Airport_Dep[t]=10;
		}
}

void Airport::SetAirport_Arr(int t,int flightCount)   //设置机场某时间段的到达容量
{ 	
/*	if(flightCount<=6)
	{
		Airport_Arr[t]=6;      
	}
	else */
		Airport_Arr[t]=flightCount;
}  


void Airport::SetAirport_ArrFlight()       //设置机场在各个时间段的到达航班
{
	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_real<0)&&(t_plan+t_delay==(t+1)))  //考虑航班允许的最大延误时间
			{
				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)
		{	//尽量使该时间段的到达航班数达到该时间段的到达容量
			j=0;
			do
			{
				t_plan=flightArr[j].Get_Flight_Plan();
				t_real=flightArr[j].Get_Flight_Real();
				
				if((t_real<0) && (t_plan<(t+1)))
				{									
					Airport_ArrFlight[t].push_back(flightArr[j]);
					flightArr[j].Set_Flight_Real(t+1);
					flightArr[j].Set_Flight_Delay();
					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时间段的出发容量
		} */
		
	/*	if(!full)  //到达和出发不相关时
		{ //尽量使该时间段的到达航班数达到该时间段的到达容量
			j=0;
			do
			{
				t_real=flightArr[j].Get_Flight_Real();
				t_plan=flightArr[j].Get_Flight_Plan();
				if(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));
		} */
	}
}


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


void Airport::SetAirport_DepFlight()       //设置机场在各个时间段的出发航班
{                                          
	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_real<0) && (t_plan+t_delay==(t+1)))  //考虑航班允许的最大延误时间段
			{
				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_plan=flightDep[j].Get_Flight_Plan();
				t_real=flightDep[j].Get_Flight_Real();			

⌨️ 快捷键说明

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