3. Programas de Optimización de Ciclos Combinados mediante Algoritmos Genéticos
3.1.4. Creación de la Población Inicial
El primer paso del proceso de optimización consiste en la generación aleatoria de losNindividuos de la primera iteración. Es un proceso importante en el que se debe tener especial cuidado en los valores máximo mínimo que pueden tomar las variables optimizadas, en este caso la presión y el PP. Para la presión se ha establecido un intervalo de valores de entre 40 y 220 bares (se recuerda que se trata de optimización del ciclo subcrítico). El límite inferior se debe a que se sabe de antemano que el rendimiento aumenta con la presión, por lo que notiene sentido iterar con presiones menores. Para el PP se ha establecido un límite inferior de 2 grados Kelvin, dado que valores excesivamente bajos pueden llevar a un excesivo incremento del precio de la planta y de la superficie necesaria por los intercambiadores, y uno máximo de 30 K.
En el programa principal se ejecutariían las siguientes sentencias para llevar a cbo el proceso de creación de la primera población;
Ciclo 1P sin desgasificador: Optimización de la presión de línea y del PP
%% INICIO PROGRAMA & POBLACION INICIAL POB_historial=zeros([N, 2, gen_max]); FIT_historial=zeros([N, gen_max]); valor_criterio=zeros([gen_max,1]);
%% % 1 -Creacion de la poblacion inicial
[pob, inputs_fitness_pob]=Poblacion_Inicial_1P_sinDesg_sub(N, p_cond, AP, DT, DI, ... rend, perd_carga, t1_g, t4_g, x, MW_gases_comb, ratio, h1_g, h_anterior, s_anterior); POB_historial(:,:,1)=pob;
%% % 2 - Evaluacion de la poblacion inicial
[fitness_pob]=Fitness_1P_sinDesg(inputs_fitness_pob, rend_TG); FIT_historial(:,1)=fitness_pob;
[FIT_max, posic]=max(fitness_pob); FIT_media=sum(fitness_pob)/N; FIT_max_rel=100*FIT_media/FIT_max;
test_generacion=[FIT_max, FIT_media, FIT_max_rel]; %% % 3 - Indicadores de evolucion
MEJOR_individuo=zeros([gen_max, 2]); TEST_historial=zeros([gen_max, 3]); MEJOR_individuo(1,:)=pob(posic,:); TEST_historial(1,:)=test_generacion;
Paso 1: Creación de la nueva generación La creación de la población inicial propiamente dicha
tiene lugar únicamente durante el paso 1, y para ello se recurre a la función auxiliar
Poblacion_Inicial_1P_sinDesg_sub. Esta función recibe los inputs necesarios para crear losNprimeros
individuos y devuelve dos vectores; el primero de ellos contiene a la población, y el segundo los parámetros de entrada necesarios para calcular el fitness de cada individuo, que se comentarán más adelante. A continuación puede verse la citada función auxiliar:
function [pob, inputs_fitness]=Poblacion_Inicial_1P_sinDesg_sub(N, p_cond, AP, ...
DT_terminal, DT_inicial, rend, perd_carga, ...
t1_g, t4_g, x, MW_gases_comb, ratio, h1_g, h_anterior, s_anterior) %% Desarrollador: Joaquin Corredoyra Alcaraz
% Tutor: Ruben Abbas Camara % U.D. Motores Termicos % ETS Ingenieros Industriales % Universidad Politecnica de Madrid % 2016 %% PROGRAMA pob=zeros(N,2); inputs_fitness=zeros(N,5); p_min=40; p_max=220; PP_min=2; PP_max=30; for i=1:1:N
p=randi([p_min,p_max-1], 'double')+rand; PP=randi([PP_min,PP_max-1], 'double')+rand;
[p, PP, h5, h6, h1, h7, M, h1_g, h4_g]=Comprobar_Inputs_1P_sinDesg_sub( p, p_cond, AP, ... PP, DT_terminal, DT_inicial, s_anterior, h_anterior, rend, perd_carga, h1_g, t1_g, ... t4_g, x, MW_gases_comb, ratio);
pob(i,:)=[p, PP];
inputs_fitness(i,:)=[h5, h6, h1, h7, M, h1_g, h4_g]; end
El procedimiento de creación de un individuo por tanto incluye un primer paso en el que se asignan los valores aleatorios a dicho individuo y su posterior comprobación para ver si cumple con los criterios necesarios para considerar que se trata de una solución válida. Esta comprobación se realiza mediante la funciónComprobar_Inputs_1P_sinDesg_sub, la cual comprueba que la temperatura del vapor sobreca-
PROGRAMAS DE OPTIMIZACIÓN DE CICLOS COMBINADOS MEDIANTE ALGORITMOS GENÉTICOS
lentado no es superior a la de entrada de los GGCC, y que el título de vapor a la salida de la turbina de gas es mayor o igual a 0.85. A continuación se muestra dicha función;
function [p, PP, h5, h6, h1, h7, M, h1_g, h4_g]=Comprobar_Inputs_1P_sinDesg_sub( p, ...
p_cond, AP, PP, DT_terminal, DT_inicial,... s_anterior, h_anterior, rend, perd_carga,... h1_g, t1_g, t4_g, x, MW_gases_comb, ratio)
%% Desarrollador: Joaquin Corredoyra Alcaraz % Tutor: Ruben Abbas Camara
% U.D. Motores Termicos % ETS Ingenieros Industriales % Universidad Politecnica de Madrid % 2016 %% p_min=40; p_max=220; PP_min=2; PP_max=30; if p<p_min p=p_min; elseif p>p_max p=p_max; end if PP<PP_min PP=PP_min; elseif PP>PP_max PP=PP_max; end
[t5, x6, h5, h6, h1, h7, M, h1_g, h4_g]=Evaluar_Inputs_1P_sinDesg_sub( p, p_cond, AP, PP, ... DT_inicial, s_anterior, h_anterior, rend, perd_carga, h1_g, t4_g, x, MW_gases_comb, ... ratio); t5_limite=t1_g-DT_terminal; p_inicial=0; PP_inicial=0; p_nuevo=1; PP_nuevo=1;
while (p_inicial6=p_nuevo && PP_inicial6=PP_nuevo)&&(isnan(t5) || t5>t5_limite || x6<0.85)
variacion1=rand;
if ((PP+variacion1)≤PP_max||(p-variacion1)≥p_min) && (x6≥0.85 || isnan(x6)) PP=PP+variacion1;
p=p-variacion1;
[t5, x6, h5, h6, h1, h7, M, h1_g, h4_g]=Evaluar_Inputs_1P_sinDesg_sub( p, p_cond, ... AP, PP, DT_inicial, s_anterior, h_anterior, rend, perd_carga, h1_g, t4_g, x, ... MW_gases_comb, ratio); elseif x6<0.85 p_inicial=p; PP_inicial=PP; variacion2=rand; if p-5*variacion2≥p_min p=p-5*variacion2; p_nuevo=p; end if PP-variacion2≥PP_min PP=PP-variacion2; PP_nuevo=PP; end [t5, x6, h5, h6, h1, h7, M, h1_g, h4_g]=Evaluar_Inputs_1P_sinDesg_sub( p, p_cond, ... AP, PP, DT_inicial, s_anterior, h_anterior, rend, perd_carga, h1_g, t4_g, x, ... MW_gases_comb, ratio);
if (p_inicial==p_nuevo && PP_inicial==PP_nuevo) h5=h6;
end end end
Ciclo 1P sin desgasificador: Optimización de la presión de línea y del PP
if x6<0.85 h5=h6; h1=h7; end
Esta función tiene el objetivo de corregir cada individuo de manera que aporte soluciones válidas. Este proceso lo realiza la función mostrada y la subfunción Evaluar_Inputs_1P_sinDesg_sub. La primera se encarga de evaluar los valores de T5 y x6 devueltos por la seunda, y actúa en consecuencia según el caso en el que se encuentre. Esto se ha podido realizar porque al trabajar solo con dos variables es sencillo determinar los pasos a seguir necesarios para conseguir un individuo válido; en la optimización de 2P es más sencillo recurrir a penalizaciones dado que la cantidad de variables y la correlación entre las mismas es considerablemente mayor. Las penalizaciones consisten en disminuir el fitness de un individuo no válido de forma proporcional a la magnitud del fallo que tiene. Esta modificación de los valroes se realiza mediante las variables auxiliaresvariacion1 yvariable2, las cuales se asignan aleatoriamente con el fin de mantener la esencia de los AG de crear individuos aleatoriamente, a pesar de que se esté dirigiendo este proceso para corregir a los individuos.
Se ha tenido en cuenta la posibilidad de que para una determinada TG no se consiga alcanzar el mínimo dex6 = 0,85, por lo que para evitar que el programa entre en un bucle infinito se han implementado las variablesp_inicial, p_final, PP_inicial yPP_final, que en caso de llegar a los valores máximo o mínimo alcanzables por los individuos producir’an una detención de este proceso, asignando a h5 y h1 valores que producirán que el rendimiento de la turbina de vapor sea nulo, por lo que quedaráηCC =ηT G.
function [t5, x6, h5, h6, h1, h7, M, h1_g, h4_g]=Evaluar_Inputs_1P_sinDesg_sub( p, p_cond, ...
AP, PP, DT_inicial, s_anterior, h_anterior, rend, perd_carga,... h1_g, t4_g, x, MW_gases_comb, ratio)
%% Desarrollador: Joaquin Corredoyra Alcaraz % Tutor: Ruben Abbas Camara
% U.D. Motores Termicos % ETS Ingenieros Industriales % Universidad Politecnica de Madrid % 2016 %% % 7 h7=h_anterior; %1s p1=p*(1+perd_carga(1)/100); h1s=XSteam('h_ps', p1, s_anterior); %1 (1s-7)/(1-7)=rend h1=h_anterior+(h1s-h_anterior)/rend(1); t1=XSteam('T_ph', p1, h1); %3 t3=XSteam('Tsat_p', p); %4 h4=XSteam('hV_p',p); %2 h2=XSteam('h_pT', p, t3-AP); %3g t3_g=t3+PP+273.15;
h3_g=(x(1)*th_prop('h','CO2',t3_g)+x(2)*th_prop('h','H2O',t3_g)+ ...
x(3)*th_prop('h','N2',t3_g)+x(4)*th_prop('h','O2',t3_g))/MW_gases_comb*ratio; % Balance de energia-->ma(h3g-h4g)=mv(h2-h1); Sacamos M=ma/mv-->
if t1+DT_inicial>t4_g
t4_g=t1+DT_inicial+273.15; else
t4_g=t4_g+273.15; end
h4_g=(x(1)*th_prop('h','CO2',t4_g)+x(2)*th_prop('h','H2O',t4_g)+ ...
x(3)*th_prop('h','N2',t4_g)+x(4)*th_prop('h','O2',t4_g))/MW_gases_comb*ratio; M=(h2-h1)/(h3_g-h4_g);
%Balance de energia-->ma(h2g-h3g)=mv(h4-h2); Sacamos el punto 2g--> h2_g=h3_g+(1/M)*(h4-h2);
%Balance de energia-->ma(h1g-h2g)=mv(h5-h4)-->sacamos el punto 5 h5=h4+M*(h1_g-h2_g);
p5=p*(1-perd_carga(2)/100); t5=XSteam('T_ph', p5, h5);
PROGRAMAS DE OPTIMIZACIÓN DE CICLOS COMBINADOS MEDIANTE ALGORITMOS GENÉTICOS s5=XSteam('s_ph', p5, h5); %6s h6s=XSteam('h_ps', p_cond, s5); %6 h6=h5-rend(2)*(h5-h6s); x6=XSteam('x_ph', p_cond, h6);
Como se puede ver, esta función se encarga de realizar el ciclo 1P subcrítico sin desgasificador de forma acelerada con el fin de obtener los valoresT5 yx6. Aprovechando que se realiza una simulación del ciclo, también se obtienen los valores necesarios para calcular el rendimiento del ciclo vapor; las entalpías antes y después de la expansión en la turbina y de la compresión en la bomba de circulación a la salida del condensador, la realción de caudalesM, y la entalpía de los gases de combustión a la entrada y a la salida de la CRC. Esto se realiza para evitar realizar una nueva simulación para cada individuo válido con el fin de obtener su fitness; de esta forma, la función que asigna la fortaleza de cada individuo simplemente tomará estos valores y realizará con ellos la operación necesaria para hallar dicho rendimiento.
Paso 2: Evaluación de la generación creada Una vez que se ha completado el paso 1 del AG,
se pasa a evaluar la población obtenida. Esto se realiza mediante el paso 2 del programa principal, por medio de la función auxiliar Fitness_1P_sinDesg. Esta función toma como variables de entrada los valores necesarios para calcular el rendimiento del ciclo de vapor, y el rendimiento del ciclo gas para el cual se está realizando la optimización. Se trata de una función sencilla en la que se inicializan los valores introducidos por el vectorinputs_fitnessy se obtiene el rendimiento. En caso de que el rendimiento no exista porque se halla producido algún caso no previsto y alguno de los parámetros de entrada no halla sido obtenido por las funciones anteriores debido a que no es físicamente posible, al rendimiento del ciclo se le asigna el valor−1.
function [rend_Ciclo]=Fitness_1P_sinDesg(inputs_fitness, rend_TG)
%% Desarrollador: Joaquin Corredoyra Alcaraz % Tutor: Ruben Abbas Camara
% U.D. Motores Termicos % ETS Ingenieros Industriales % Universidad Politecnica de Madrid % 2016
%%
[N_indiv, ¬]=size(inputs_fitness); rend_Ciclo=zeros([N_indiv, 1]);
%% Calculo Rentimiento del Ciclo Combinado for i=1:1:N_indiv h5=inputs_fitness(i,1); h6=inputs_fitness(i,2); h1=inputs_fitness(i,3); h7=inputs_fitness(i,4); M=inputs_fitness(i,5); h1_g=inputs_fitness(i,6); h4_g=inputs_fitness(i,7); %% RESULTADOS rend_TV=((h5-h6)-(h1-h7))/(M*(h1_g-h4_g))*100; rend_CC=rend_TV+rend_TG-rend_TV*rend_TG/100; if isnan(rend_CC) rend_Ciclo(i)=-1; else rend_Ciclo(i)=rend_CC; end end
Paso 3: Rellenado de los registros de la generación inicial Tras finalizar el proceso de
evaluación de la población inicial se guarda en los registros el mejor individuo de dicha población en
Ciclo 1P sin desgasificador: Optimización de la presión de línea y del PP