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