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

📄 dongzhiopti.cpp

📁 石油公司网管系统优化系统软件源码,很有价值的.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                    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 TTDongZhiOpti::Evaluate()
{
    WellUnit *Well;
    WellHead *CurrentHead,*TempHead;
    int i,j,GenNo,SubNo;
    double L,ZhiLiang;
    double x,y,X,Y;
    for(i=0;i<NewPopsize;i++)
    {
        if(Terminated)
        {
            return;
        }
        CurrentHead=Head->Next;
        ZhiLiang=0;
        GenNo=0;//记录基因序号
        while(CurrentHead!=0)
        {
            SubNo=0;//记录增压点个数
            TempHead=CurrentHead->Sub;
            //如果有增压点先计算增压点
            while(TempHead!=0)
            {
                Well=TempHead->Well;
                x=NewPop[i].Gens[2*GenNo];
                y=NewPop[i].Gens[2*GenNo+1];
                GenNo++;
                while(Well!=0)
                {
                    L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
                    ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
                    Well=Well->Next;
                }
                SubNo++;
                TempHead=TempHead->Sub;
            }
            //计算该站点到油井所需管材
            Well=CurrentHead->Well;
            x=NewPop[i].Gens[2*GenNo];
            y=NewPop[i].Gens[2*GenNo+1];
            GenNo++;
            while(Well!=0)
            {
                L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
                ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
                Well=Well->Next;
            }
            //计算该转油站到联合站所需管材
            X=NewPop[i].Gens[2*GenNum-2];
            Y=NewPop[i].Gens[2*GenNum-1];
            L=Map.GetLength(x,y,X,Y)*1000;
            ZhiLiang+=L*CurrentHead->GuanDanWeiZhiLiang;
            //计算增压点到转油站所需管材
            TempHead=CurrentHead->Sub;
            for(j=SubNo;j>0;j--)
            {
                X=NewPop[i].Gens[2*(GenNo-j)];
                Y=NewPop[i].Gens[2*(GenNo-j)+1];
                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 TTDongZhiOpti::GetBest()
{
    WellUnit *Well;
    WellHead *CurrentHead,*TempHead;
    int i,j,GenNo,SubNo;
    double L,ZhiLiang;
    double x,y,X,Y;
    //对初始种群进行评估
    for(i=0;i<popsize;i++)
    {
        CurrentHead=Head->Next;
        ZhiLiang=0;
        GenNo=0;//记录基因序号
        while(CurrentHead!=0)
        {
            SubNo=0;//记录增压点个数
            TempHead=CurrentHead->Sub;
            //如果有增压点先计算增压点
            while(TempHead!=0)
            {
                Well=TempHead->Well;
                x=population[i].Gens[2*GenNo];
                y=population[i].Gens[2*GenNo+1];
                GenNo++;
                while(Well!=0)
                {
                    L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
                    ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
                    Well=Well->Next;
                }
                SubNo++;
                TempHead=TempHead->Sub;
            }
            //计算该站点到油井所需管材
            Well=CurrentHead->Well;
            x=population[i].Gens[2*GenNo];
            y=population[i].Gens[2*GenNo+1];
            GenNo++;
            while(Well!=0)
            {
                L=Map.GetLength(Well->X,Well->Y,x,y)*1000;
                ZhiLiang+=L*Well->GuanDanWeiZhiLiang;
                Well=Well->Next;
            }
            //计算增压点到转油站所需管材
            TempHead=CurrentHead->Sub;
            for(j=SubNo;j>0;j--)
            {
                X=population[i].Gens[2*(GenNo-j)];
                Y=population[i].Gens[2*(GenNo-j)+1];
                L=Map.GetLength(X,Y,x,y)*1000;
                ZhiLiang+=L*TempHead->GuanDanWeiZhiLiang;
                TempHead=TempHead->Sub;
            }
            //求转油站到联合站管材
            X=population[i].Gens[2*GenNum-2];
            Y=population[i].Gens[2*GenNum-1];
            L=Map.GetLength(x,y,X,Y)*1000;
            ZhiLiang+=L*Head->GuanDanWeiZhiLiang;
            CurrentHead=CurrentHead->Next;
        }
        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 TTDongZhiOpti::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 TTDongZhiOpti::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;
            if(ADOWell->FieldByName("位置")->AsString=="白马北")
                Well->Part=BAI_MA_BEI;
            if(ADOWell->FieldByName("位置")->AsString=="白马南")
                Well->Part=BAI_MA_NAN;
            if(ADOWell->FieldByName("位置")->AsString=="董志")
                Well->Part=DONG_ZHI;
            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;
            if(ADOWell->FieldByName("位置")->AsString=="白马北")
                Well->Part=BAI_MA_BEI;
            if(ADOWell->FieldByName("位置")->AsString=="白马南")
                Well->Part=BAI_MA_NAN;
            if(ADOWell->FieldByName("位置")->AsString=="董志")
                Well->Part=DONG_ZHI;
            Well->LiuLiang=ADOWell->FieldByName("产量")->AsFloat;
            Well->No=ADOWell->FieldByName("井号")->AsString;
            CurrentWell->Next=Well;
            CurrentWell=Well;
        }
        ADOWell->Next();
    }
    ADOWell->Active=false;
}

void TTDongZhiOpti::Initialize()
{
    WellUnit *Well,*CurrentWell,*TempWell,*TempPreWell,*BaseWell,*PreWell;
    WellHead *CurrentHead=Head,*TempHead,*CurrentTemp;

    GetWellPara();
//油井分组
    int WellNum;
    Well=CurrentHead->Well;
    Head->Next=0;
    Head->Sub=0;
    CurrentHead->Well=0;


    //开始判断距离,分组
    while(Well!=0)
    {
        TempHead=(WellHead*) new WellHead;
        TempHead->No="";
        TempHead->Sub=0;
        TempHead->Next=0;
        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;
            }
        }
/*
        if(WellNum<2)
        {
            CurrentWell=CurrentHead->Well;
            while(CurrentWell->Next!=0)
            {
                CurrentWell=CurrentWell->Next;
            }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -