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

📄 baimabeiopti.cpp

📁 石油公司网管系统优化系统软件源码,很有价值的.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
                i++;
                Well=TempHead->Well;
                while(Well!=0)
                {
                    //标识位
                    TempInt=0;
                    File->Write(&TempInt,sizeof(int));
                    //油井编号
                    TempInt=Well->No.Length();
                    File->Write(&TempInt,sizeof(int));
                    File->Write(Well->No.c_str(),Well->No.Length());
                    Well=Well->Next;
                }
                TempHead=TempHead->Sub;
            }
            CurrentHead->X=BestUnit->Gens[2*i];
            CurrentHead->Y=BestUnit->Gens[2*i+1];
            i++;
            CurrentHead=CurrentHead->Next;
        }
        Head->Sub->X=BestUnit->Gens[2*i];
        Head->Sub->Y=BestUnit->Gens[2*i+1];
    }
    delete File;
}
//杂交
void TTBaiMaBeiOpti::Cross(long generation)
{
    double P;
    int i,j,n,pos,Num=2*GenNum;
    for(i=0;i<popsize;i++)
    {
        if(Terminated)
        {
            return;
        }
        //确定交叉率
        P=(rand()%1000)/1000.0;
        if(P<PCross)
        {
            if(generation%2==1)
            {
                //普通交叉
                //随机确定与当前染色体交叉的染色体序号
                while((n=rand()%popsize)==i);
                //确定交叉位置
                pos=rand()%Num;
                //单点交叉
                for(j=0;j<pos;j++)
                {
                    NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
//                    NewPop[NewPopsize].Limit[j]=population[i].Limit[j];
                    NewPop[NewPopsize+1].Gens[j]=population[n].Gens[j];
//                    NewPop[NewPopsize+1].Limit[j]=population[n].Limit[j];
                }
                for(j=pos;j<Num;j++)
                {
                    NewPop[NewPopsize].Gens[j]=population[n].Gens[j];
//                    NewPop[NewPopsize].Limit[j]=population[n].Limit[j];
                    NewPop[NewPopsize+1].Gens[j]=population[i].Gens[j];
//                    NewPop[NewPopsize+1].Limit[j]=population[i].Limit[j];
                }
            }
            else
            {
                //优势交叉
                //确定交叉位置
                pos=rand()%Num;
                //单点交叉
                for(j=0;j<pos;j++)
                {
                    NewPop[NewPopsize].Gens[j]=population[i].Gens[j];
//                    NewPop[NewPopsize].Limit[j]=population[i].Limit[j];
                    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 TTBaiMaBeiOpti::Evaluate()
{
    WellUnit *Well;
    WellHead *CurrentHead,*TempHead;
    int i,j,GenNo;
    double L,ZhiLiang;
    double x,y,X,Y;
    for(i=0;i<NewPopsize;i++)
    {
        if(Terminated)
        {
            return;
        }
        //获得所有坐标
        GenNo=0;
        CurrentHead=Head->Next;
        while(CurrentHead!=0)
        {
            TempHead=CurrentHead->Sub;
            while(TempHead!=0)
            {
                TempHead->X=NewPop[i].Gens[2*GenNo];
                TempHead->Y=NewPop[i].Gens[2*GenNo+1];
                GenNo++;
                TempHead=TempHead->Sub;
            }
            CurrentHead->X=NewPop[i].Gens[2*GenNo];
            CurrentHead->Y=NewPop[i].Gens[2*GenNo+1];
            GenNo++;
            CurrentHead=CurrentHead->Next;
        }
        Head->X=NewPop[i].Gens[2*GenNo];
        Head->Y=NewPop[i].Gens[2*GenNo+1];
        GenNo++;
        CurrentHead=Head->Sub;
        if(CurrentHead!=0)
        {
            CurrentHead->X=NewPop[i].Gens[2*GenNum-2];
            CurrentHead->Y=NewPop[i].Gens[2*GenNum-1];
            CurrentHead=CurrentHead->Next;
            while(CurrentHead!=0)
            {
                TempHead=CurrentHead->Sub;
                while(TempHead!=0)
                {
                    TempHead->X=NewPop[i].Gens[2*GenNo];
                    TempHead->Y=NewPop[i].Gens[2*GenNo+1];
                    GenNo++;
                    TempHead=TempHead->Sub;
                }
                CurrentHead->X=NewPop[i].Gens[2*GenNo];
                CurrentHead->Y=NewPop[i].Gens[2*GenNo+1];
                GenNo++;
                CurrentHead=CurrentHead->Next;
            }
        }
        ZhiLiang=0;
        CurrentHead=Head->Next;
        while(CurrentHead!=0)
        {
            TempHead=CurrentHead->Sub;
            //如果有增压点先计算增压点
            while(TempHead!=0)
            {
                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->X;
            Y=Head->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;
            }
        }
        CurrentHead=Head->Sub;
        if(CurrentHead!=0)
        {
            CurrentHead=CurrentHead->Next;
        }
        while(CurrentHead!=0)
        {
            TempHead=CurrentHead->Sub;
            //如果有增压点先计算增压点
            while(TempHead!=0)
            {
                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;
            }
        }
        NewPop[i].Fitness=ZhiLiang;
    }
}

void TTBaiMaBeiOpti::GetBest()
{
    WellUnit *Well;
    WellHead *CurrentHead,*TempHead;
    int i,j,GenNo;
    double L,ZhiLiang;
    double x,y,X,Y;
    //对初始种群进行评估
    for(i=0;i<popsize;i++)
    {
        if(Terminated)
        {
            return;
        }
        //获得所有坐标
        GenNo=0;
        CurrentHead=Head->Next;
        while(CurrentHead!=0)
        {
            TempHead=CurrentHead->Sub;
            while(TempHead!=0)
            {
                TempHead->X=population[i].Gens[2*GenNo];
                TempHead->Y=population[i].Gens[2*GenNo+1];
                GenNo++;
                TempHead=TempHead->Sub;
            }
            CurrentHead->X=population[i].Gens[2*GenNo];
            CurrentHead->Y=population[i].Gens[2*GenNo+1];
            GenNo++;
            CurrentHead=CurrentHead->Next;
        }
        Head->X=population[i].Gens[2*GenNo];
        Head->Y=population[i].Gens[2*GenNo+1];
        GenNo++;
        CurrentHead=Head->Sub;
        if(CurrentHead!=0)
        {
            CurrentHead->X=population[i].Gens[2*GenNum-2];
            CurrentHead->Y=population[i].Gens[2*GenNum-1];
            CurrentHead=CurrentHead->Next;
            while(CurrentHead!=0)
            {
                TempHead=CurrentHead->Sub;
                while(TempHead!=0)
                {
                    TempHead->X=population[i].Gens[2*GenNo];
                    TempHead->Y=population[i].Gens[2*GenNo+1];
                    GenNo++;
                    TempHead=TempHead->Sub;
                }
                CurrentHead->X=population[i].Gens[2*GenNo];
                CurrentHead->Y=population[i].Gens[2*GenNo+1];
                GenNo++;
                CurrentHead=CurrentHead->Next;
            }
        }
        ZhiLiang=0;
        CurrentHead=Head->Next;
        while(CurrentHead!=0)
        {
            TempHead=CurrentHead->Sub;
            //如果有增压点先计算增压点
            while(TempHead!=0)
            {
                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->X;
            Y=Head->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;
            }
        }
        CurrentHead=Head->Sub;
        if(CurrentHead!=0)
        {
            CurrentHead=CurrentHead->Next;
        }
        while(CurrentHead!=0)
        {
            TempHead=CurrentHead->Sub;
            //如果有增压点先计算增压点
            while(TempHead!=0)
            {

⌨️ 快捷键说明

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