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

📄 baimabeiopti.cpp

📁 石油公司网管系统优化系统软件源码,很有价值的.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                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 + -