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
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] Costo [€/m]
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=[ ]; nDprog=length(Dprog); %costi al m in € %Dprog=[ ]; costi= [ ]; 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 for i=1:nind ValFO(i)=FO(Chrom(i,:)); end 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 … %Mutazione … 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 … ChromFO=ChromNEWFO; bestFO(g)=min(ChromNEWFO(:,npar+1)); end %Chiusura ciclo sulle generazioni [val,pos_migl]=min(ChromFO(:,npar+1)); 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