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

📄 dongzhiopti.cpp

📁 石油公司网管系统优化系统软件源码,很有价值的.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                BaseWell->Next=0;
                CurrentTemp->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))
                       <0.8*ZuiDaLiuDongJuLi)
                    {
                        //是否是第一口井
                        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<3)
                {
                    CurrentWell=CurrentTemp->Well;
                    while(CurrentWell->Next!=0)
                    {
                        CurrentWell=CurrentWell->Next;
                    }
                    CurrentWell->Next=BaseWell;
                    TempHead->Well=0;
                    delete TempHead;
                }
                else
                {
                    CurrentTemp->Sub=TempHead;
                    CurrentTemp=TempHead;
                }
            }
        //确定转油站位置
            CurrentTemp=CurrentHead->Sub;
            MaxPos=0;
            MaxNum=0;
            Num=0;
            i=0;
            //寻找油井数最多的部分设立转油站
            while(CurrentTemp!=0)
            {
                Well=CurrentTemp->Well;
                Num=0;
                while(Well!=0)
                {
                    Well=Well->Next;
                    Num++;
                }
                if(MaxNum<Num)
                {
                    MaxNum=Num;
                    MaxPos=i;
                }
                i++;
                CurrentTemp=CurrentTemp->Sub;
            }
            CurrentTemp=CurrentHead;
            for(i=0;i<MaxPos;i++)
            {
                CurrentTemp=CurrentTemp->Sub;
            }
            //将该部分的油井接到第一个节点上,设立转油站
            TempHead=CurrentTemp->Sub;
            CurrentHead->Well=TempHead->Well;
            TempHead->Well=0;
            CurrentTemp->Sub=TempHead->Sub;
            delete TempHead;

*/
        }
        if(Terminated)
        {
            return;
        }
        CurrentHead=CurrentHead->Next;
    }
    //确定各站管径,流量
    if(Terminated)
    {
        return;
    }
    CurrentHead=Head->Next;
    while(CurrentHead!=0&&!Terminated)
    {
        TempHead=CurrentHead->Sub;
        CurrentHead->HanShuiLv=0;
        CurrentHead->YouLiuLiang=0;
        CurrentHead->QiYouBi=0;
        //增压点计算
        while(TempHead!=0)
        {
            Well=TempHead->Well;
            TempHead->HanShuiLv=0;
            TempHead->YouLiuLiang=0;
            TempHead->QiYouBi=0;
            //计算气液流量和含水率
            while(Well!=0)
            {
                TempHead->HanShuiLv+=Well->YouLiuLiang/(1-Well->HanShuiLv);
                TempHead->YouLiuLiang+=Well->YouLiuLiang;
                TempHead->QiYouBi+=Well->YouLiuLiang*Well->QiYouBi;
                Well=Well->Next;
            }
            //计算该转油站下增压点的总流量
            CurrentHead->HanShuiLv+=TempHead->HanShuiLv;
            CurrentHead->YouLiuLiang+=TempHead->YouLiuLiang;
            CurrentHead->QiYouBi+=TempHead->QiYouBi;
            //计算含水率,
            TempHead->HanShuiLv=(TempHead->HanShuiLv-TempHead->YouLiuLiang)/TempHead->HanShuiLv;
            //计算气油比
            TempHead->QiYouBi/=TempHead->YouLiuLiang;
            //计算管径,壁厚
            QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
            if(QiMiDu==0)
            {
                Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
                Terminate();
                return;
            }
            YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
            Q0=G/YouMiDu;
            ql=Q0/(1-TempHead->HanShuiLv);
            Rs=WuXing.GetRs(YouMiDu,YouSheJiYaLi,JingKouWenDu);
            B=WuXing.GetB(Rs,YouMiDu,JingKouWenDu);
            Ql=ql*B;
            Trr=(JingKouWenDu+273.15)/264.87;
            Prr=(YouSheJiYaLi)/(43.960*1e5);
            Z=WuXing.GetZ(Prr,Trr);
            if(Z==0)
            {
                Application->MessageBox("天然气压缩系数计算错误!计算中止!", "错误", MB_OK);
                Terminate();
                return;
            }
//            Qg=ql*(TempHead->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
            Qg=ql*(TempHead->QiYouBi-Rs)*101325*(JingKouWenDu+273.15)*Z/(YouSheJiYaLi*273.15);
            GuanJing=sqrt(4*(Ql+Qg)/(M_PI*JingJiLiuSu));
            BiHou=(YouSheJiYaLi*1e-6*GuanJing*1000)/(2*245*1*0.72)+1;
//            BiaoZhunHuaGuanJing(&GuanJing,&BiHou,&DanWeiZhiLiang);
//            GuanJing=GuanJing+2*BiHou;
            GetPipePara();
            TempHead->GuanJing=GuanJing;
            TempHead->BiHou=BiHou;
            TempHead->GuanDanWeiZhiLiang=DanWeiZhiLiang;
            TempHead=TempHead->Sub;
        }
        if(Terminated)
        {
            return;
        }
        Well=CurrentHead->Well;
        //计算该站点的总流量
        while(Well!=0)
        {
            CurrentHead->HanShuiLv+=Well->YouLiuLiang/(1-Well->HanShuiLv);
            CurrentHead->YouLiuLiang+=Well->YouLiuLiang;
            CurrentHead->QiYouBi+=Well->YouLiuLiang*Well->QiYouBi;
            Well=Well->Next;
        }
        CurrentHead->HanShuiLv=(CurrentHead->HanShuiLv-CurrentHead->YouLiuLiang)/CurrentHead->HanShuiLv;
        //计算气油比
        CurrentHead->QiYouBi/=CurrentHead->YouLiuLiang;
        //计算该站点管径,壁厚
        QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
        if(QiMiDu==0)
        {
            Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
            Terminate();
            return;
        }
        YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
        G=CurrentHead->YouLiuLiang;
        Q0=G/YouMiDu;
        ql=Q0/(1-CurrentHead->HanShuiLv);
        Rs=WuXing.GetRs(YouMiDu,YouSheJiYaLi,JingKouWenDu);
        B=WuXing.GetB(Rs,YouMiDu,JingKouWenDu);
        Ql=ql*B;
        Trr=(JingKouWenDu+273.15)/264.87;
        Prr=(YouSheJiYaLi)/(43.960*1e5);
        Z=WuXing.GetZ(Prr,Trr);
        if(Z==0)
        {
            Application->MessageBox("天然气压缩系数计算错误!计算中止!", "错误", MB_OK);
            Terminate();
            return;
        }
//        Qg=ql*(CurrentHead->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
        Qg=ql*(CurrentHead->QiYouBi-Rs)*101325*(JingKouWenDu+273.15)*Z/(YouSheJiYaLi*273.15);
        GuanJing=sqrt(4*(Ql+Qg)/(M_PI*JingJiLiuSu));
        BiHou=(YouSheJiYaLi*1e-6*GuanJing*1000)/(2*245*1*0.72)+1;
//        BiaoZhunHuaGuanJing(&GuanJing,&BiHou,&DanWeiZhiLiang);
//        GuanJing=GuanJing+2*BiHou;
        GetPipePara();
        CurrentHead->GuanDanWeiZhiLiang=DanWeiZhiLiang;
        CurrentHead->GuanJing=GuanJing;
        CurrentHead->BiHou=BiHou;
        CurrentHead=CurrentHead->Next;
    }
    //计算联合站管径,壁厚,流量
    Head->HanShuiLv=0;
    Head->YouLiuLiang=0;
    Head->QiYouBi=0;
    CurrentHead=Head->Next;
    while(CurrentHead!=0)
    {
        Head->HanShuiLv+=CurrentHead->YouLiuLiang/(1-CurrentHead->HanShuiLv);
        Head->YouLiuLiang+=CurrentHead->YouLiuLiang;
        Head->QiYouBi+=CurrentHead->QiYouBi*CurrentHead->YouLiuLiang;
        CurrentHead=CurrentHead->Next;
    }
    Head->HanShuiLv=(Head->HanShuiLv-Head->YouLiuLiang)/(Head->HanShuiLv);
    //计算气油比
    Head->QiYouBi/=Head->YouLiuLiang;
    //计算联合站管径,壁厚
    QiMiDu=WuXing.GetQiMiDu(JingKouWenDu,YouSheJiYaLi);
    if(QiMiDu==0)
    {
        Application->MessageBox("天然气密度计算错误!计算中止!", "错误", MB_OK);
        Terminate();
        return;
    }
    YouMiDu=WuXing.GetYouMiDu(JingKouWenDu);
    G=Head->YouLiuLiang;
    Q0=G/YouMiDu;
    ql=Q0/(1-Head->HanShuiLv);
    Rs=WuXing.GetRs(YouMiDu,YouSheJiYaLi,JingKouWenDu);
    B=WuXing.GetB(Rs,YouMiDu,JingKouWenDu);
    Ql=ql*B;
    Trr=(JingKouWenDu+273.15)/264.87;
    Prr=(YouSheJiYaLi)/(43.960*1e5);
    Z=WuXing.GetZ(Prr,Trr);
    if(Z==0)
    {
        Application->MessageBox("天然气压缩系数计算错误!计算中止!", "错误", MB_OK);
        Terminate();
        return;
    }
//    Qg=ql*(Head->QiYouBi*G/Q0-Rs)*0.101*JingKouWenDu*Z/(YouSheJiYaLi*20);
    Qg=ql*(Head->QiYouBi-Rs)*101325*(JingKouWenDu+273.15)*Z/(YouSheJiYaLi*273.15);
    GuanJing=sqrt(4*(Ql+Qg)/(M_PI*JingJiLiuSu));
    BiHou=(YouSheJiYaLi*1e-6*GuanJing*1000)/(2*245*1*0.72)+1;
//    BiaoZhunHuaGuanJing(&GuanJing,&BiHou,&DanWeiZhiLiang);
//    GuanJing=GuanJing+2*BiHou;
    GetPipePara();
    Head->GuanDanWeiZhiLiang=DanWeiZhiLiang;
    Head->GuanJing=GuanJing;
    Head->BiHou=BiHou;
    //计算染色体中基因个数
    GenNum=0;
    CurrentHead=Head->Next;
    while(CurrentHead!=0)
    {
        GenNum++;
        TempHead=CurrentHead->Sub;
        while(TempHead!=0)
        {
            GenNum++;
            TempHead=TempHead->Sub;
        }
        CurrentHead=CurrentHead->Next;
    }
    GenNum++;
//初始化种群
    if(Terminated)
    {
        return;
    }
    //申请内存空间
    population=new GenUnit[popsize];
    StationFlag=new int[GenNum];
    BestUnit=new GenUnit;
    NewPop=new GenUnit[popsize*3];
    Uper=new double[GenNum*2];
    Lower=new double[GenNum*2];
    BestUnit->Gens=new double[GenNum*2];
//    BestUnit->Limit=new double[GenNum*2];
    for(i=0;i<popsize;i++)
    {
        population[i].Gens=new double[GenNum*2];
//        population[i].Limit=new double[GenNum*2];
    }
    for(i=0;i<popsize*3;i++)
    {
        NewPop[i].Gens=new double[GenNum*2];
//        NewPop[i].Limit=new double[GenNum*2];
    }
    //记录染色体中的基因特性(站点/油井)
    //0-油井,1-增压点,2-转油站,3-联合站
    CurrentHead=Head->Next;
    i=0;
    Head->No="西二联";
    int Zeng=1,Zhuan=1;
    while(CurrentHead!=0)
    {
        if(CurrentHead->No=="")
        {
            CurrentHead->No=CurrentHead->No.sprintf("转%d",Zhuan);
            Zhuan++;
        }
        TempHead=CurrentHead->Sub;
        Zeng=1;
        while(TempHead!=0)
        {
            if(TempHead->No=="")
            {
                TempHead->No=TempHead->No.sprintf("增%d-%d",Zhuan,Zeng);
                Zeng++;
            }
            StationFlag[i]=1;
            TempHead=TempHead->Sub;
            i++;
        }
        StationFlag[i]=2;
        CurrentHead=CurrentHead->Next;
        i++;
    }
    StationFlag[i]=3;
    //生成染色体基因
    double XX,YY;
    double x_max,x_min,y_max,y_min;
    int n;
    for(i=0;i<popsize;i++)
    {
        if(Terminated)
        {
            return;
        }
        CurrentHead=Head->Next;
        //确定各中间站和增压点的初始坐标
        n=0;
        while(CurrentHead!=0)
        {
            if(Terminated)
            {
                return;
            }
            TempHead=CurrentHead->Sub;
            while(TempHead!=0)
            {
                //统计该增压点下的油井个数和坐标范围
                Num=0;
                Well=TempHead->Well;
                x_max=Well->X;
                x_min=Well->X;
                y_max=Well->Y;
                y_min=Well->Y;
                while(Well!=0)
                {
                    Num++;
                    if(Well->X<x_min)
                        x_min=Well->X;
                    if(Well->X>x_max)
                        x_max=Well->X;
                    if(Well->Y<y_min)
                        y_min=Well->Y;
                    if(Well->Y>y_max)
                        y_max=Well->Y;
                    Well=Well->Next;
                }
                //确定该增压点初始坐标
                XX=0;
                YY=0;
                if(Num>3)
                {
                    for(j=0;j<3;j++)
                    {
                        k=rand()%Num;
                        Well=TempHead->Well;
                        for(m=0;m<k;m++)
                        {

⌨️ 快捷键说明

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