📄 baimabeiopti.cpp
字号:
i++;
Well=TempHead->Well;
while(Well!=0)
{
//标识位
TempInt=0;
File->Write(&TempInt,sizeof(int));
//油井编号
TempInt=Well->No.Length();
File->Write(&TempInt,sizeof(int));
File->Write(Well->No.c_str(),Well->No.Length());
Well=Well->Next;
}
TempHead=TempHead->Sub;
}
CurrentHead->X=BestUnit->Gens[2*i];
CurrentHead->Y=BestUnit->Gens[2*i+1];
i++;
CurrentHead=CurrentHead->Next;
}
Head->Sub->X=BestUnit->Gens[2*i];
Head->Sub->Y=BestUnit->Gens[2*i+1];
}
delete File;
}
//杂交
void TTBaiMaBeiOpti::Cross(long generation)
{
double P;
int i,j,n,pos,Num=2*GenNum;
for(i=0;i<popsize;i++)
{
if(Terminated)
{
return;
}
//确定交叉率
P=(rand()%1000)/1000.0;
if(P<PCross)
{
if(generation%2==1)
{
//普通交叉
//随机确定与当前染色体交叉的染色体序号
while((n=rand()%popsize)==i);
//确定交叉位置
pos=rand()%Num;
//单点交叉
for(j=0;j<pos;j++)
{
NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
// NewPop[NewPopsize].Limit[j]=population[i].Limit[j];
NewPop[NewPopsize+1].Gens[j]=population[n].Gens[j];
// NewPop[NewPopsize+1].Limit[j]=population[n].Limit[j];
}
for(j=pos;j<Num;j++)
{
NewPop[NewPopsize].Gens[j]=population[n].Gens[j];
// NewPop[NewPopsize].Limit[j]=population[n].Limit[j];
NewPop[NewPopsize+1].Gens[j]=population[i].Gens[j];
// NewPop[NewPopsize+1].Limit[j]=population[i].Limit[j];
}
}
else
{
//优势交叉
//确定交叉位置
pos=rand()%Num;
//单点交叉
for(j=0;j<pos;j++)
{
NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
// NewPop[NewPopsize].Limit[j]=population[i].Limit[j];
NewPop[NewPopsize+1].Gens[j]=BestUnit->Gens[j];
// NewPop[NewPopsize+1].Limit[j]=BestUnit->Limit[j];
}
for(j=pos;j<Num;j++)
{
NewPop[NewPopsize].Gens[j]=BestUnit->Gens[j];
// NewPop[NewPopsize].Limit[j]=BestUnit->Limit[j];
NewPop[NewPopsize+1].Gens[j]=population[i].Gens[j];
// NewPop[NewPopsize+1].Limit[j]=population[i].Limit[j];
}
}
NewPopsize+=2;
}
else
{
for(j=0;j<Num;j++)
{
NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
// NewPop[NewPopsize].Limit[j]=population[i].Limit[j];
}
NewPopsize++;
}
}
}
//评估
void TTBaiMaBeiOpti::Evaluate()
{
WellUnit *Well;
WellHead *CurrentHead,*TempHead;
int i,j,GenNo;
double L,ZhiLiang;
double x,y,X,Y;
for(i=0;i<NewPopsize;i++)
{
if(Terminated)
{
return;
}
//获得所有坐标
GenNo=0;
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
TempHead->X=NewPop[i].Gens[2*GenNo];
TempHead->Y=NewPop[i].Gens[2*GenNo+1];
GenNo++;
TempHead=TempHead->Sub;
}
CurrentHead->X=NewPop[i].Gens[2*GenNo];
CurrentHead->Y=NewPop[i].Gens[2*GenNo+1];
GenNo++;
CurrentHead=CurrentHead->Next;
}
Head->X=NewPop[i].Gens[2*GenNo];
Head->Y=NewPop[i].Gens[2*GenNo+1];
GenNo++;
CurrentHead=Head->Sub;
if(CurrentHead!=0)
{
CurrentHead->X=NewPop[i].Gens[2*GenNum-2];
CurrentHead->Y=NewPop[i].Gens[2*GenNum-1];
CurrentHead=CurrentHead->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
TempHead->X=NewPop[i].Gens[2*GenNo];
TempHead->Y=NewPop[i].Gens[2*GenNo+1];
GenNo++;
TempHead=TempHead->Sub;
}
CurrentHead->X=NewPop[i].Gens[2*GenNo];
CurrentHead->Y=NewPop[i].Gens[2*GenNo+1];
GenNo++;
CurrentHead=CurrentHead->Next;
}
}
ZhiLiang=0;
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
//如果有增压点先计算增压点
while(TempHead!=0)
{
Well=TempHead->Well;
x=TempHead->X;
y=TempHead->Y;
while(Well!=0)
{
L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
Well=Well->Next;
}
TempHead=TempHead->Sub;
}
//计算该站点到油井所需管材
Well=CurrentHead->Well;
x=CurrentHead->X;
y=CurrentHead->Y;
while(Well!=0)
{
L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
Well=Well->Next;
}
//计算该转油站到联合站所需管材
X=Head->X;
Y=Head->Y;
L=Map.GetLength(x,y,X,Y)*1000;
if(!CurrentHead->Fixed)
{
ZhiLiang+=L*CurrentHead->GuanDanWeiZhiLiang;
}
//计算增压点到转油站所需管材
x=CurrentHead->X;
y=CurrentHead->Y;
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
X=TempHead->X;
Y=TempHead->Y;
L=Map.GetLength(X,Y,x,y)*1000;
ZhiLiang+=L*TempHead->GuanDanWeiZhiLiang;
TempHead=TempHead->Sub;
}
CurrentHead=CurrentHead->Next;
if(Terminated)
{
return;
}
}
CurrentHead=Head->Sub;
if(CurrentHead!=0)
{
CurrentHead=CurrentHead->Next;
}
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
//如果有增压点先计算增压点
while(TempHead!=0)
{
Well=TempHead->Well;
x=TempHead->X;
y=TempHead->Y;
while(Well!=0)
{
L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
Well=Well->Next;
}
TempHead=TempHead->Sub;
}
//计算该站点到油井所需管材
Well=CurrentHead->Well;
x=CurrentHead->X;
y=CurrentHead->Y;
while(Well!=0)
{
L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
Well=Well->Next;
}
//计算该转油站到联合站所需管材
X=Head->Sub->X;
Y=Head->Sub->Y;
L=Map.GetLength(x,y,X,Y)*1000;
if(!CurrentHead->Fixed)
{
ZhiLiang+=L*CurrentHead->GuanDanWeiZhiLiang;
}
//计算增压点到转油站所需管材
x=CurrentHead->X;
y=CurrentHead->Y;
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
X=TempHead->X;
Y=TempHead->Y;
L=Map.GetLength(X,Y,x,y)*1000;
ZhiLiang+=L*TempHead->GuanDanWeiZhiLiang;
TempHead=TempHead->Sub;
}
CurrentHead=CurrentHead->Next;
if(Terminated)
{
return;
}
}
NewPop[i].Fitness=ZhiLiang;
}
}
void TTBaiMaBeiOpti::GetBest()
{
WellUnit *Well;
WellHead *CurrentHead,*TempHead;
int i,j,GenNo;
double L,ZhiLiang;
double x,y,X,Y;
//对初始种群进行评估
for(i=0;i<popsize;i++)
{
if(Terminated)
{
return;
}
//获得所有坐标
GenNo=0;
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
TempHead->X=population[i].Gens[2*GenNo];
TempHead->Y=population[i].Gens[2*GenNo+1];
GenNo++;
TempHead=TempHead->Sub;
}
CurrentHead->X=population[i].Gens[2*GenNo];
CurrentHead->Y=population[i].Gens[2*GenNo+1];
GenNo++;
CurrentHead=CurrentHead->Next;
}
Head->X=population[i].Gens[2*GenNo];
Head->Y=population[i].Gens[2*GenNo+1];
GenNo++;
CurrentHead=Head->Sub;
if(CurrentHead!=0)
{
CurrentHead->X=population[i].Gens[2*GenNum-2];
CurrentHead->Y=population[i].Gens[2*GenNum-1];
CurrentHead=CurrentHead->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
TempHead->X=population[i].Gens[2*GenNo];
TempHead->Y=population[i].Gens[2*GenNo+1];
GenNo++;
TempHead=TempHead->Sub;
}
CurrentHead->X=population[i].Gens[2*GenNo];
CurrentHead->Y=population[i].Gens[2*GenNo+1];
GenNo++;
CurrentHead=CurrentHead->Next;
}
}
ZhiLiang=0;
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
//如果有增压点先计算增压点
while(TempHead!=0)
{
Well=TempHead->Well;
x=TempHead->X;
y=TempHead->Y;
while(Well!=0)
{
L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
Well=Well->Next;
}
TempHead=TempHead->Sub;
}
//计算该站点到油井所需管材
Well=CurrentHead->Well;
x=CurrentHead->X;
y=CurrentHead->Y;
while(Well!=0)
{
L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
Well=Well->Next;
}
//计算该转油站到联合站所需管材
X=Head->X;
Y=Head->Y;
L=Map.GetLength(x,y,X,Y)*1000;
if(!CurrentHead->Fixed)
{
ZhiLiang+=L*CurrentHead->GuanDanWeiZhiLiang;
}
//计算增压点到转油站所需管材
x=CurrentHead->X;
y=CurrentHead->Y;
TempHead=CurrentHead->Sub;
while(TempHead!=0)
{
X=TempHead->X;
Y=TempHead->Y;
L=Map.GetLength(X,Y,x,y)*1000;
ZhiLiang+=L*TempHead->GuanDanWeiZhiLiang;
TempHead=TempHead->Sub;
}
CurrentHead=CurrentHead->Next;
if(Terminated)
{
return;
}
}
CurrentHead=Head->Sub;
if(CurrentHead!=0)
{
CurrentHead=CurrentHead->Next;
}
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
//如果有增压点先计算增压点
while(TempHead!=0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -