📄 baimabeiopti.cpp
字号:
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;
}
}
population[i].Fitness=ZhiLiang;
}
//假设第一个体为最优
for(j=0;j<GenNum*2;j++)
{
BestUnit->Gens[j]=population[0].Gens[j];
// BestUnit->Limit[j]=population[0].Limit[j];
}
BestUnit->Fitness=population[0].Fitness;
//比较确定种群中最优个体
for(i=0;i<popsize;i++)
{
if(population[i].Fitness<BestUnit->Fitness)
{
for(j=0;j<GenNum*2;j++)
{
BestUnit->Gens[j]=population[i].Gens[j];
// BestUnit->Limit[j]=population[i].Limit[j];
}
BestUnit->Fitness=population[i].Fitness;
}
}
}
void TTBaiMaBeiOpti::GetPipePara()
{
/*
GuanJing=GuanJing*1000+2*BiHou;
ADOPipe->Sort="WaiJing ASC";
ADOPipe->First();
while(!ADOPipe->Eof)
{
if(ADOPipe->FieldByName("WaiJing")->AsFloat<GuanJing)
{
ADOPipe->Next();
}
else
{
GuanJing=ADOPipe->FieldByName("WaiJing")->AsFloat;
if(ADOPipe->FieldByName("WaiJing")->AsFloat==GuanJing&&ADOPipe->FieldByName("BiHou")->AsFloat<BiHou)
{
ADOPipe->Next();
}
else
{
GuanJing=ADOPipe->FieldByName("NeiJing")->AsFloat;
BiHou=ADOPipe->FieldByName("BiHou")->AsFloat;
DanWeiZhiLiang=ADOPipe->FieldByName("ZhongLiang")->AsFloat;
break;
}
}
} */
DanWeiZhiLiang=20;
GuanJing*=1000;
}
void TTBaiMaBeiOpti::GetWellPara()
{
WellUnit *Well,*CurrentWell;
bool Selected;
//读取基础信息
TFileStream *File;
File=new TFileStream("SuanFa.cfg",fmOpenRead|fmShareExclusive);
File->Read(&Generation,sizeof(int));
File->Read(&popsize,sizeof(int));
File->Read(&PCross,sizeof(double));
File->Read(&PMutation,sizeof(double));
File->Read(&JiShuBanJing,sizeof(double));
delete File;
File=new TFileStream("Common.dat",fmOpenRead|fmShareExclusive);
//含水率
File->Read(&ShuRuHanShuiLv,sizeof(ShuRuHanShuiLv));
if(ShuRuHanShuiLv==0)
{
File->Read(&SheJiHanShuiLv,sizeof(SheJiHanShuiLv));
}
//设计参数
File->Read(&YouSheJiYaLi,sizeof(YouSheJiYaLi));
File->Read(&JingKouHuiYa,sizeof(JingKouHuiYa));
File->Read(&ZuiDiRuZhanYaLi,sizeof(ZuiDiRuZhanYaLi));
File->Read(&ZuiDiRuWenDu,sizeof(double));
File->Read(&JingKouWenDu,sizeof(JingKouWenDu));
File->Read(&TuRangWenDu,sizeof(TuRangWenDu));
File->Read(&JingJiLiuSu,sizeof(JingJiLiuSu));
File->Read(&NianDu50,sizeof(JingJiLiuSu));
File->Read(&MiDu20,sizeof(JingJiLiuSu));
File->Read(&QiXiangDuiMiDu,sizeof(double));
File->Read(&K,sizeof(double));
JingKouHuiYa*=1000000;
YouSheJiYaLi*=1000000;
ZuiDiRuZhanYaLi*=1000000;
WuXing.Initial(QiXiangDuiMiDu,MiDu20,NianDu50);
delete File;
//读取油井信息
ADOWell->Active=true;
ADOWell->Sort="纵坐标,横坐标";
ADOWell->First();
while(!ADOWell->Eof)
{
Selected=false;
if(ADOWell->FieldByName("位置")->AsString=="白马北")
Selected=true;
if(Selected)
{
Well=(WellUnit*) new WellUnit;
Well->Next=0;
Well->X=ADOWell->FieldByName("横坐标")->AsFloat;
Well->Y=ADOWell->FieldByName("纵坐标")->AsFloat;
if(ShuRuHanShuiLv==1)
Well->HanShuiLv=SheJiHanShuiLv;
else
Well->HanShuiLv=ADOWell->FieldByName("含水率")->AsFloat;
Well->QiYouBi=ADOWell->FieldByName("气油比")->AsFloat;
Well->Part=BAI_MA_BEI;
Well->LiuLiang=ADOWell->FieldByName("产量")->AsFloat;
Well->No=ADOWell->FieldByName("井号")->AsString;
Head->Well=Well;
CurrentWell=Well;
ADOWell->Next();
break;
}
ADOWell->Next();
}
while(!ADOWell->Eof)
{
Selected=false;
if(ADOWell->FieldByName("位置")->AsString=="白马北")
Selected=true;
if(Selected)
{
Well=(WellUnit*) new WellUnit;
Well->Next=0;
Well->X=ADOWell->FieldByName("横坐标")->AsFloat;
Well->Y=ADOWell->FieldByName("纵坐标")->AsFloat;
if(ShuRuHanShuiLv==1)
Well->HanShuiLv=SheJiHanShuiLv;
else
Well->HanShuiLv=ADOWell->FieldByName("含水率")->AsFloat;
Well->QiYouBi=ADOWell->FieldByName("气油比")->AsFloat;
Well->Part=BAI_MA_BEI;
Well->LiuLiang=ADOWell->FieldByName("产量")->AsFloat;
Well->No=ADOWell->FieldByName("井号")->AsString;
CurrentWell->Next=Well;
CurrentWell=Well;
}
ADOWell->Next();
}
ADOWell->Active=false;
}
void TTBaiMaBeiOpti::Initialize()
{
WellUnit *Well,*CurrentWell,*TempWell,*TempPreWell,*BaseWell,*PreWell;
WellHead *CurrentHead=Head,*TempHead,*CurrentTemp;
GetWellPara();
//读入当前站布局信息(联合站,转油站)
TFileStream *File=new TFileStream("CurrentData.dat",fmOpenRead|fmShareExclusive);
double TempDouble;
int TempInt,n=1;
AnsiString TempStr;
char *str;
__int64 Position;
//文件长度
Position=File->Size;
while(File->Position<Position)
{
//标识位
File->Read(&TempInt,sizeof(int));
if(TempInt==1)
{
//联合站
File->Read(&TempInt,sizeof(int));
str=new char[TempInt+1];
File->Read(str,TempInt);
str[TempInt]=0;
TempStr=(AnsiString)str;
delete str;
//名称
Head->No =TempStr;
//坐标
File->Read(&TempDouble,sizeof(double));
Head->X=TempDouble;
File->Read(&TempDouble,sizeof(double));
Head->Y=TempDouble;
//最大处理量
File->Read(&TempDouble,sizeof(double));
Head->MaxLiang=TempDouble*1000/(3600*24);
//当前处理量
File->Read(&TempDouble,sizeof(double));
Head->YouLiuLiang=TempDouble*1000/(3600*24);
//固定位置
Head->Fixed=true;
Head->Sub=0;
Head->Next=0;
CurrentHead=Head;
}
else
{
TempHead=(WellHead*)new WellHead;
TempHead->Next=0;
TempHead->Sub=0;
TempHead->Well=0;
//转油站
File->Read(&TempInt,sizeof(int));
str=new char[TempInt+1];
File->Read(str,TempInt);
str[TempInt]=0;
TempStr=(AnsiString)str;
delete str;
//名称
TempHead->No=TempStr;
//坐标
File->Read(&TempDouble,sizeof(double));
TempHead->X= TempDouble;
File->Read(&TempDouble,sizeof(double));
TempHead->Y= TempDouble;
//最大处理量
File->Read(&TempDouble,sizeof(double));
TempHead->MaxLiang=TempDouble*1000/(3600*24);
//当前处理量
File->Read(&TempDouble,sizeof(double));
TempHead->YouLiuLiang=TempDouble*1000/(3600*24);
//固定位置
TempHead->Fixed=true;
CurrentHead->Next=TempHead;
CurrentHead=TempHead;
}
}
delete File;
//油井分组
int WellNum;
Well=Head->Well;
Head->Sub=0;
Head->Well=0;
//开始判断距离,分组
//先判断是否可以接到原转油站
CurrentHead=Head->Next;
while(CurrentHead!=0)
{
TempDouble=CurrentHead->YouLiuLiang;
CurrentHead->Well=0;
CurrentHead->Sub=0;
WellNum=0;
CurrentWell=Well;
PreWell=0;
while(CurrentWell!=0)
{
if(sqrt((CurrentHead->X-CurrentWell->X)*(CurrentHead->X-CurrentWell->X)+
(CurrentHead->Y-CurrentWell->Y)*(CurrentHead->Y-CurrentWell->Y))
<JiShuBanJing&&CurrentHead->YouLiuLiang+CurrentWell->LiuLiang<=CurrentHead->MaxLiang)
{
//是否是第一口井
if(PreWell==0)
{
//将该井插入本井群链表,修改井群链表头
Well=Well->Next;
CurrentHead->Well=CurrentWell;
TempWell=CurrentWell;
CurrentWell->Next=0;
CurrentWell=Well;
WellNum++;
}
else
{
//从原井群众删除该节点,并将其插入当前井群链表中
PreWell->Next=CurrentWell->Next;
CurrentWell->Next=0;
TempWell->Next=CurrentWell;
TempWell=CurrentWell;
CurrentWell=PreWell->Next;
WellNum++;
}
CurrentHead->YouLiuLiang+=CurrentWell->LiuLiang;
}
else
{
//当前指针后移
PreWell=CurrentWell;
CurrentWell=CurrentWell->Next;
}
}
CurrentHead->MaxLiang=TempDouble;
if(CurrentHead->Next==0)
{
break;
}
CurrentHead=CurrentHead->Next;
}
while(Well!=0)
{
TempHead=(WellHead*) new WellHead;
TempHead->Sub=0;
TempHead->Next=0;
TempHead->Fixed=false;
BaseWell=Well;
Well=Well->Next;
BaseWell->Next=0;
TempHead->Well=BaseWell;
PreWell=0;
CurrentWell=Well;
TempWell=BaseWell;
WellNum=0;
while(CurrentWell!=0)
{
//判断是否在本井群范围内
if(sqrt((BaseWell->X-CurrentWell->X)*(BaseWell->X-CurrentWell->X)+
(BaseWell->Y-CurrentWell->Y)*(BaseWell->Y-CurrentWell->Y))
<JiShuBanJing)
{
//是否是第一口井
if(PreWell==0)
{
//将该井插入本井群链表,修改井群链表头
Well=Well->Next;
CurrentWell->Next=TempWell->Next;
TempWell->Next=CurrentWell;
TempWell=CurrentWell;
CurrentWell=Well;
WellNum++;
}
else
{
//从原井群众删除该节点,并将其插入当前井群链表中
PreWell->Next=CurrentWell->Next;
CurrentWell->Next=TempWell->Next;
TempWell->Next=CurrentWell;
TempWell=CurrentWell;
CurrentWell=PreWell->Next;
WellNum++;
}
}
else
{
//当前指针后移
PreWell=CurrentWell;
CurrentWell=CurrentWell->Next;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -