供水管网PDD模型源程序matlab

function [pop5,leak1,bestobj,H,dtemp]=PDDmoni(J,QL) 
    nmaxnum=100;  %进化代数
    popsize=100;  %种群大小
    chromlength=18;%染色体数组长度
    pc=0.8;    %交叉概率
    pm=0.05;   %变异概率
    node_count=17; %节点数
    pressure = zeros(popsize,node_count); %节点压力
    eddemand=zeros(1,node_count);%额定流量
    usewater = zeros(popsize,node_count); %实际用水量
    leak = zeros(popsize,node_count); %节点漏失水量
    flow= zeros(popsize,node_count); %节点流量
    newpop=zeros(popsize,chromlength);%新种群初始化
    pop=initpop(popsize,chromlength,J,QL); %种群初始化
    ZG=0;%最优个体
  %  test = round(rand(1,10));


    loadlibrary('D:\Program Files\EPA\epanet2.dll','D:\Program Files\EPA\epanet2.h');%调用epanet2
    calllib('epanet2','ENopen','E:\matlab\suanli\1yuanqi.inp','E:\matlab\suanli\1yuanqi.rpt','');%调用ENopen函数,打开suanli.inp文件
    pressurePtr = libpointer('singlePtr',node_count);%将节点压力设置成指针
    demandPtr = libpointer('singlePtr',node_count);
    for i=1:node_count
    calllib('epanet2','ENgetnodevalue',i,1,demandPtr);
    eddemand(1,i)= double(get(demandPtr,'value')) ;
    eddemand(1,i)=eddemand(1,i)-2;
    end
    eddemand(1,J)=eddemand(1,J)+QL;
for nindex=1:nmaxnum
    pressure = zeros(popsize,node_count);   %节点压力初始化
    popsize=size(pop,1);

    for i=1:popsize

        for j=1:node_count
            pop2=pop(i,j)/100;
            calllib('epanet2','ENsetnodevalue',j,1,pop2);%设置节点流量值
        end

        calllib('epanet2','ENsaveinpfile','E:\matlab\suanli\1yuanqi.inp');%保存给定节点流量后的inp文件
        calllib('epanet2','ENsolveH');%计算节点压力
        calllib('epanet2','ENsolveQ');%计算流量
        for k=1:node_count
            calllib('epanet2','ENgetnodevalue',k,11,pressurePtr);%调用获取节点压力函数指针
            pressure(i,k)= double(get(pressurePtr,'value')) ;%获取节点压力
            maxpressure=12;  %临界压力
            minpressure=2;   %最小压力
            chapressure=maxpressure-minpressure; %临界压力与最小压力的差值
                  if pressure(i,k)>=maxpressure  %节点压力大于等于临界压力
                     usewater(i,k) = eddemand(1,k); %节点实际用水量等于节点需水量
                  elseif pressure(i,k)<=minpressure %节点压力小于等于最小压力
                     usewater(i,k) =0; %节点实际用水量等于0
                  else   %节点压力在最小压力和临界压力之间
                      usewater(i,k) = eddemand(1,k)*((pressure(i,k)-minpressure)/chapressure)^0.5; %节点实际用水量
                  end 

              dtemp =( pop(i,node_count+1) / 31 )*0.05+ 0.05; %漏失系数控制在0.05-0.1之间
              leak(i,k) = dtemp * pressure(i,k)^1.18;  %节点漏失水量
            %   leak1 = leak1+leak(i,k); 
              flow(i,k) = usewater(i,k)+leak(i,k); %实际节点流量
        end 
    end

    calllib('epanet2','ENreport'); %EPANET报告
   % calllib('epanet2','ENclose'); %EPANET关闭
    %else 
     %   eval = -100000000; 
      %  end 
    objvalue=calobjvalue(pop,flow); %计算目标函数
   % fitvalue=calfitvalue(objvalue); %计算群体中每个个体的适应度
    newpop=selection(pop,objvalue); %复制
    
    newpop=crossover(newpop,pc); %交叉
    
    newpop=mutation(newpop,pm,J,QL); %变异
    pop=newpop;
    
end 
popsize=size(pop,1);
for i=1:popsize

        for j=1:node_count
            calllib('epanet2','ENsetnodevalue',j,1,pop(i,j));%设置节点流量值
        end

        calllib('epanet2','ENsaveinpfile','E:\matlab\suanli\1yuanqi.inp');%保存给定节点流量后的inp文件
        calllib('epanet2','ENsolveH');%计算节点压力
        calllib('epanet2','ENsolveQ');%计算流量
        for k=1:node_count
            calllib('epanet2','ENgetnodevalue',k,11,pressurePtr);%调用获取节点压力函数指针
            pressure(i,k)= double(get(pressurePtr,'value')) ;%获取节点压力
            maxpressure=12;  %临界压力
            minpressure=2;   %最小压力
            chapressure=maxpressure-minpressure; %临界压力与最小压力的差值
                  if pressure(i,k)>=maxpressure  %节点压力大于等于临界压力
                     usewater(i,k) = eddemand(1,k); %节点实际用水量等于节点需水量
                  elseif pressure(i,k)<=minpressure %节点压力小于等于最小压力
                     usewater(i,k) =0; %节点实际用水量等于0
                  else   %节点压力在最小压力和临界压力之间
                      usewater(i,k) = eddemand(1,k)*((pressure(i,k)-minpressure)/chapressure)^0.5; %节点实际用水量
                  end 

              dtemp =( pop(i,node_count+1) / 31 )*0.05+ 0.05; %漏失系数控制在0.05-0.1之间
              leak(i,k) = dtemp * pressure(i,k)^1.18;  %节点漏失水量
            %   leak1 = leak1+leak(i,k); 
              flow(i,k) = usewater(i,k)+leak(i,k); %实际节点流量
        end 
end
 calllib('epanet2','ENreport'); %EPANET报告
 calllib('epanet2','ENclose'); %EPANET关闭
    objvalue=calobjvalue(pop,flow); %计算目标函数
    [bestindividual,bestobj]=best(pop,objvalue); %求出群体中适应值最大的个体及其适应值
    leak1=zeros(1,node_count);
    i=1;
   
while (i<=popsize)
    if bestindividual(1,:)==pop(i,:);
        leak1=leak(i,:);ZG=i;
    end
        i=i+1;
end
dtemp =( pop(ZG,node_count+1) / 31 )*0.05+ 0.05;
H=pressure(ZG,:);
pop5=bestindividual; %种群中适应值最大的个体
    
%end
 

你可能感兴趣的:(水力模型,供水管网技术,智慧水务,数据结构)