Parte III – Dimensionamento rete di distribuzione ESERCITAZIONE DUE Parte III – Dimensionamento rete di distribuzione Si dimensioni la rete di distribuzione idrica schematizzata in figura al fine di minimizzare i costi garantendo un carico minimo di 25 m in tutti i nodi. A tal fine si implementi in ambiente Matlab un codice per il progetto ottimale a minimo costo con vincolo sul rispetto dei carichi minimi nodali basato sull’accoppiamento di un algoritmo genetico con il metodo del gradiente implementato nell’ambito della Parte II della Esercitazione 2. Si riporti: il codice l’andamento della funzione obiettivo i diametri di progetto i carichi in tutti i nodi ottenuti utilizzando i diametri di progetto
I diametri utilizzabili e i relativi costi sono La rete è alimentata da un serbatoio (Serb) a carico imposto pari a 30 m. Le caratteristiche della rete, quote e richieste idriche dei nodi a carico incognito e lunghezze e scabrezze delle condotte sono riportate nel file Dati_rete_dimensionamento.xlsx I diametri utilizzabili e i relativi costi sono D [mm] 75 100 150 200 250 300 350 400 500 600 Costo [€/m] 227 231 272 299 328 360 399 439 503 581
Programma main clear all close all clc global NT NN q H0 A10 A12 A21 L ks N n global costi Hmin Dprog global H Q %-------------------------------------------------------------------------% %Dati Dprog=[75 100 150 200 250 300 350 400 500 600]; nDprog=length(Dprog); %costi al m in € %Dprog=[ 75 100 150 200 250 300 350 400 500 600]; costi= [227 231 272 299 328 360 399 439 503 581]; Hmin=25; load tronchi.txt load nodi.txt %ricostruisco la matrice topologica della rete …. %Parametri Algoritmo genetico nind=200; ngen=500; npar=NT; Pmut=0.05; % prob del 5% %Range parametri par_min=ones(1,NT); par_max=ones(1,NT)*nDprog;
%-------------------------------------------------------------------------% %Popolazione iniziale for i=1:nind for j=1:npar Chrom(i,j)=round(par_min(j)+rand*(par_max(j)-par_min(j))); end %Valuto ciascun individuo della popolazione iniziale ValFO(i)=FO(Chrom(i,:)); ChromFO=[Chrom, ValFO']; for g=1:ngen %associo a ciascun individuo fitness=1/FO FIT=1./ChromFO(:,npar+1); ChromFO(:,npar+2)=FIT; %associo a ciascun individuo una probabilità P ChromFO=sortrows(ChromFO, npar+2); %riordina le righe in base alla colonna npar+2 (fitness) in senso crescente Prob=2/nind*([1:nind]-1)/(nind-1); Probcum=[cumsum(Prob)]; %Genero la nuova popolazione ChromNEW=[];
for i=1:(nind/2); %seleziono una coppia di genitori x1=rand; posg1=max(find(Probcum<x1)); g1=ChromFO(posg1,1:npar); x2=rand; … %Cross-over pettine=round(rand(1,npar)); f(1,:)=g1.*pettine+g2.*(1-pettine); f(2,:)=g2.*pettine+g1.*(1-pettine); %Mutazione for k=1:2 %ciclo sui due figli mut=rand; if mut<=Pmut genedamut=round(1+rand*(npar-1)); f(k,genedamut)=round(par_min(genedamut)+rand*(par_max(genedamut)-par_min(genedamut))); end end %Chiusura ciclo generazione nuova popolazione
%Valuto ciascun individuo della nuova popolazione for i=1:nind ValFO(i)=FO(ChromNEW(i,:)); end ChromNEWFO=[ChromNEW, ValFO']; %Elitismo if min(ChromNEWFO(:,npar+1))>min(ChromFO(:,npar+1)) [val,pos_pegg]=max(ChromNEWFO(:,npar+1)); [val,pos_migl]=min(ChromFO(:,npar+1)); %ChromNEWFO(pos_pegg,:)=ChromFO(pos_migl,:); ChromNEWFO(pos_pegg,1:npar+1)=ChromFO(pos_migl,1:npar+1); ChromFO=ChromNEWFO; bestFO(g)=min(ChromNEWFO(:,npar+1)); end %Chiusura ciclo sulle generazioni par_ott=ChromFO(pos_migl,1:npar) %-------------------------------------------------------------------------% %Simulazioni di verifica CostoBest=FO(par_ott); figure(1) plot(bestFO)
function costTot=FO(xD) global NT NN q H0 A10 A12 A21 L ks N n global costi Hmin Dprog global H Q D(:,1)=Dprog(xD)/1000; costo=sum(costi(xD).*L'); %-------------------------------------------------------------------------% %metodo gradiente ….. violazioni=find(H<Hmin); violTot=sum(Hmin-H(violazioni)); costTot=costo*(1+violTot);
costo generazione