📄 dongzhiopti.cpp
字号:
Well=Well->Next;
}
XX+=Well->X;
YY+=Well->Y;
}
XX=XX/3;
YY=YY/3;
}
else
{
Well=TempHead->Well;
for(j=0;j<Num;j++)
{
XX+=Well->X;
YY+=Well->Y;
Well=Well->Next;
}
XX=XX/Num;
YY=YY/Num;
}
//将该站坐标写入基因
population[i].Gens[n]=XX;
// population[i].Limit[n]=x_max-x_min;
Uper[n]=x_max;
Lower[n]=x_min;
population[i].Gens[n+1]=YY;
// population[i].Limit[n+1]=y_max-y_min;
Uper[n+1]=y_max;
Lower[n+1]=y_min;
n+=2;
TempHead=TempHead->Sub;
}
Well=CurrentHead->Well;
//统计该站点下的油井个数
Num=0;
x_max=Well->X;
x_min=Well->X;
y_max=Well->Y;
y_min=Well->Y;
while(Well!=0)
{
Num++;
if(Well->X>x_max)
x_max=Well->X;
if(Well->X<x_min)
x_min=Well->X;
if(Well->Y>y_max)
y_max=Well->Y;
if(Well->Y<y_min)
y_min=Well->Y;
Well=Well->Next;
}
//确定该站点初始坐标
XX=0;
YY=0;
if(Num>3)
{
for(j=0;j<3;j++)
{
k=rand()%Num;
Well=CurrentHead->Well;
for(m=0;m<k;m++)
{
Well=Well->Next;
}
XX+=Well->X;
YY+=Well->Y;
}
XX=XX/3;
YY=YY/3;
}
else
{
Well=CurrentHead->Well;
for(j=0;j<Num;j++)
{
XX+=Well->X;
YY+=Well->Y;
Well=Well->Next;
}
XX=XX/Num;
YY=YY/Num;
}
//将该站点坐标写入基因
population[i].Gens[n]=XX;
// population[i].Limit[n]=x_max-x_min;
population[i].Gens[n+1]=YY;
// population[i].Limit[n+1]=y_max-y_min;
Uper[n]=x_max;
Lower[n]=x_min;
Uper[n+1]=y_max;
Lower[n+1]=y_min;
n+=2;
CurrentHead=CurrentHead->Next;
}
//确定联合站初始坐标
XX=0;
YY=0;
//确定中间站个数
Num=0;
for(j=0;j<GenNum;j++)
{
if(StationFlag[j]==2)
{
Num++;
if(Num==1)
{
x_max=population[i].Gens[j*2];
x_min=population[i].Gens[j*2];
y_max=population[i].Gens[j*2+1];
y_min=population[i].Gens[j*2+1];
}
else
{
if(population[i].Gens[j*2]>x_max)
x_max=population[i].Gens[j*2];
if(population[i].Gens[j*2]<x_min)
x_min=population[i].Gens[j*2];
if(population[i].Gens[j*2+1]>y_max)
y_max=population[i].Gens[j*2+1];
if(population[i].Gens[j*2+1]<y_min)
y_min=population[i].Gens[j*2+1];
}
}
}
if(Num>3)
{
for(j=0;j<3;j++)
{
k=rand()%Num;
for(m=(n-1)/2;k>0;m--)
{
if(StationFlag[m]==2)
{
k--;
}
}
XX+=population[i].Gens[2*m];
YY+=population[i].Gens[2*m+1];
}
XX=XX/3;
YY=YY/3;
}
else
{
k=Num;
for(m=(n-1)/2;k>0;m--)
{
if(StationFlag[m]==2)
{
k--;
XX+=population[i].Gens[2*m];
YY+=population[i].Gens[2*m+1];
}
}
XX=XX/Num;
YY=YY/Num;
}
//将联合站坐标写入基因
population[i].Gens[n]=XX;
// population[i].Limit[n]=x_max-x_min;
population[i].Gens[n+1]=YY;
// population[i].Limit[n+1]=y_max-y_min;
Uper[n]=x_max;
Lower[n]=x_min;
Uper[n+1]=y_max;
Lower[n+1]=y_min;
n+=2;
}
NewPopsize=0;
}
void TTDongZhiOpti::Mutate(long generation)
{
double P,pp;
int i,j,Num=GenNum*2;
for(i=0;i<popsize;i++)
{
if(Terminated)
{
return;
}
if(generation%2==1)
{
//普通变异
for(j=0;j<Num;j++)
{
//确定变异率
P=(rand()%1000)/1000.0;
if(P<PMutation)
{
pp=rand()%10000/10000.0;
//确定变异量最大变异量为油井所在范围
// pp=population[i].Limit[j]*pp;
NewPop[NewPopsize].Gens[j]=Lower[j]+(Uper[j]-Lower[j])*pp;
// NewPop[NewPopsize].Gens[j]=population[i].Gens[j]+pp;
}
else
{
NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
}
}
NewPopsize+=1;
}
else
{
//精细变异
for(j=0;j<Num;j++)
{
//确定变异率
P=(rand()%1000)/1000.0;
if(P<PMutation)
{
pp=(rand()%10000-5000)/5000.0;
//确定变异量最大变异量为油井所在范围的1/10
pp=(Uper[j]-Lower[j])*pp/10;
NewPop[NewPopsize].Gens[j]=population[i].Gens[j]+pp;
if(NewPop[NewPopsize].Gens[j]>Uper[j])
{
NewPop[NewPopsize].Gens[j]=Uper[j];
}
if(NewPop[NewPopsize].Gens[j]<Lower[j])
{
NewPop[NewPopsize].Gens[j]=Lower[j];
}
}
else
{
NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
}
}
NewPopsize+=1;
}
}
}
void TTDongZhiOpti::Select()
{
//在新产生的个体中进行选择,使用赌轮算法
int i,j,k;
double SumFit,P;
if(Terminated)
{
return;
}
//保持最优解
for(i=0;i<NewPopsize;i++)
{
if(NewPop[i].Fitness<BestUnit->Fitness)
{
for(j=0;j<GenNum*2;j++)
{
BestUnit->Gens[j]=NewPop[i].Gens[j];
// BestUnit->Limit[j]=NewPop[i].Limit[j];
}
BestUnit->Fitness=NewPop[i].Fitness;
}
}
SumFit=0;
//计算适应值之和
for(i=0;i<NewPopsize;i++)
{
SumFit+=NewPop[i].Fitness;
}
//计算相对适应率
for(i=0;i<NewPopsize;i++)
{
NewPop[i].CFitness=NewPop[i].Fitness/SumFit;
}
//计算累计适应率
for(i=1;i<NewPopsize;i++)
{
NewPop[i].CFitness+=NewPop[i-1].CFitness;
}
//赌轮转动popsize次,选出新的种群
if(Terminated)
{
return;
}
for(i=0;i<popsize;i++)
{
//生成随机数
P=(rand()%1000)/1000.0;
for(j=0;j<NewPopsize;j++)
{
if(P<NewPop[j].CFitness)
{
for(k=0;k<GenNum*2;k++)
{
population[i].Gens[k]=NewPop[j].Gens[k];
// population[i].Limit[k]=NewPop[j].Limit[k];
}
population[i].Fitness=NewPop[j].Fitness;
break;
}
}
}
NewPopsize=0;
}
void TTDongZhiOpti::ShuiLiJiSuan()
{
WellUnit *Well;
WellHead *CurrentHead,*TempHead;
double a,b,L,G,Q0,Cpg,Cpl,Cp,T0,Tr,Trr,Prr,Z,Tz,ShuiLiPoJiang,d,MoZuXiShu,Re,TiJiHanYe,TiJiHanShui;
double ZhiLiang,ZhiLianHanYe,S0,C,A,w,Pz,Pr,_P,_T,GaoCha,dH,ql,Rs,B,Ql,Qg;
double YouMiDu,QiMiDu,QiNianDu,YouNianDu,ShuiMiDu,YeMiDu,YeNianDu,MiDu,NianDu,ZhiLiangHanQi;
double x,y,X,Y;
int i;
AnsiString TempStr;
ADOResult->TableName="pipe_dong";
ADOResult->Open();
if(!ADOResult->IsEmpty())
{
ADOResult->First();
while(!ADOResult->Eof)
{
ADOResult->Delete();
// ADOResult->Next();
}
}
ADOResult->Close();
ADOResult->TableName="station_dong";
ADOResult->Open();
if(!ADOResult->IsEmpty())
{
ADOResult->First();
while(!ADOResult->Eof)
{
ADOResult->Delete();
// ADOResult->Next();
}
}
ADOResult->Close();
ADOResult->TableName="pipe_dong";
ADOResult->Open();
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
TempHead=CurrentHead->Sub;
//如果有增压点先计算增压点
while(TempHead!=0)
{
Well=TempHead->Well;
//取得坐标
x=TempHead->X;
y=TempHead->Y;
while(Well!=0)
{
ADOResult->Append();
X=Well->X;
Y=Well->Y;
d=Well->GuanJing/1000;
L=Map.GetLength(X,Y,x,y,&GaoCha)*1000;
dH=Map.GetHeight(x,y)-Map.GetHeight(X,Y);
//油井编号
ADOResult->FieldByName("起点编号")->AsString=Well->No;
ADOResult->FieldByName("终点编号")->AsString=TempHead->No;
G=Well->YouLiuLiang;
Tr=JingKouWenDu;
//管径,壁厚 管长
ADOResult->FieldByName("管径")->AsFloat=Well->GuanJing;
ADOResult->FieldByName("壁厚")->AsFloat=Well->BiHou;
ADOResult->FieldByName("管长")->AsFloat=L;
if(L==0)
{
G=0;
Tr=0;
Tz=0;
Pz=0;
Pr=0;
}
//流量
ADOResult->FieldByName("流量")->AsString=G;
//入口温度
ADOResult->FieldByName("入口温度")->AsFloat=Tr;
//假设出口温度
T0=Tr-2;
for(i=0;i<100&&L>0;i++)
{
//平均温度
_T=Tr/3+T0*2/3;
//出口压力
Pz=ZuiDiRuZhanYaLi;
//求入口压力
Pr=GetYaJiang(G,_T,Pz,Well->QiYouBi,Well->HanShuiLv,d,L,GaoCha);
if(Pr==0)
{
return;
}
//平均压力
_P=(Pz+Pr)/2;
QiMiDu=WuXing.GetQiMiDu(_T,_P);
if(QiMiDu==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -