📄 airportdepview.cpp
字号:
}
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 + -