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

📄 dongzhiopti.cpp

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