P. 1
14.ALGORITMOS-GENÉTICOS-CONTROL_PI

14.ALGORITMOS-GENÉTICOS-CONTROL_PI

|Views: 1|Likes:

More info:

Published by: Uriel Arnauld van Hellsing on Sep 08, 2013
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

09/08/2013

pdf

text

original

ESCUELA POLITÉCNICA DEL EJÉRCITO CONTROL INTELIGENTE Autores: Alex Correa, Israel Iza, Ricardo Pérez Nivel: X EAC

Tema: ALGORITMOS GENÉTICOS

TEMA: Solución de un problema de optimización de un controlador PI  Realizar un programa para obtener la respuesta más optima para un controlador PI. 1. Para el presente ejercicio se debe realizar el lazo cerrado del sistema para lo cual se ha utilizado una planta de segundo orden. Para el sistema el parámetro que se desea optimizar es el siguiente:

Simulación en SimuLink
1 s Product Integrator 1

e_cuadr To Workspace

ki Step ganancia integral

1 s Integrator

1 s2 +3s+1 Transfer Fcn

salida To Workspace 3

kp Gain 1

tiempo Clock To Workspace 1

Desarrollo del Algoritmo Genético (creación de individuos, obtención código genético, reproducción, mutación, selección)

Codigo Matlab
clc clear all tsim=10; kimax=100; kpmax=100; gene=0; error_=0; %% NUMERO DE INDIVIDUOS nind=input('Ingrese numero de individuos ='); ngene=input('Ingrese el numero de generaciones ='); while (gene<=ngene) %% CREACION DE INDIVIDUOS ALEATORIAMENTE x=0:1:100; kp_ind=x(1)+(x(100)-x(1)).*rand(nind,1) ki_ind=x(1)+(x(100)-x(1)).*rand(nind,1) %% OBTENCION DEL CODIGO GENETICO DE LOS INDIVIDUOS for a=1:nind kp_yentero=fix(kp_ind(a)); ki_yentero=fix(ki_ind(a));%Saca el entero del valor kp_binent=dec2bin(kp_yentero,5);%%Transforma en binario al número entero______ ki_binent=dec2bin(ki_yentero,5); kp_ydecimal= kp_ind(a) - kp_yentero;%%Deja solo el valor decimal___ ki_ydecimal= ki_ind(a) - ki_yentero; %%Saca el número binario del valor decimal for b=1:5 kp_ydecimal=kp_ydecimal*2; kp_bindec(b)=fix(kp_ydecimal); kp_ydecimal=kp_ydecimal - kp_bindec(b); ki_ydecimal=ki_ydecimal*2; ki_bindec(b)=fix(ki_ydecimal); ki_ydecimal=ki_ydecimal - ki_bindec(b); end kp_auxbindec{a}=num2str(kp_bindec); ki_auxbindec{a}=num2str(ki_bindec); end for z=1:nind kp_repro=str2num(kp_auxbindec{z}); ki_repro=str2num(ki_auxbindec{z}); for y=1:length(kp_repro) kp_auxz(z,y)=kp_repro(y); ki_auxz(z,y)=ki_repro(y); end end kp_bin=kp_auxz; ki_bin=ki_auxz; for i=1:nind j=1; for z=1:10 if z<=5 pi_codg(i,z)=kp_bin(i,z); else

pi_codg(i,z)=ki_bin(i,j); j=j+1; end end end %% Seleccion Mejor Padre for i=1:nind kp=kp_ind(i); ki=ki_ind(i); sim('lazo_pi',tsim) auxe_ecuad(i)=1/e_cuadr; indiv(i,1:10)=pi_codg(i,1:10); indiv(i,11)=kp; indiv(i,12)=ki; indiv(i,13)=1/e_cuadr; end indiv mejor=max(auxe_ecuad) for i=1:nind if mejor==indiv(i,13) mejor_kp=indiv(i,11) mejor_ki=indiv(i,12) end end kp=mejor_kp; ki=mejor_ki; sim('lazo_pi',tsim) figure(1) plot(tiempo,salida) title('Mejor Padre') %% Reproducción if mod(nind,2)~=0 nind=nind-1 end auxz=pi_codg; hijos=auxz; disp('Punto de Cruce') ptoc=round(1+8.*rand(1,1)) i=1; m=nind; j=ptoc+1; while (i<=m) pr=0.1+(1-0.1).*rand(1,1) %Lanzamiento de rueda para cada pareja if pr<=0.8 for j=ptoc+1:10 hijos(i,j)=auxz(i+1,j); hijos(i+1,j)=auxz(i,j); end i=i+2 else i=i+2 end end

hijos %% Seleccion Mejor Hijo for i=1:nind long_crom=10; kp_codg=hijos(i,1:5); ki_codg=hijos(i,6:10); vector_pesos=2.^((long_crom/2)-1:-1:0); ki=sum((ki_codg).*vector_pesos)./(2.^(long_crom/2)-1)*kimax; kp=sum((kp_codg).*vector_pesos)./(2.^(long_crom/2)-1)*kpmax; sim('lazo_pi',tsim) auxe_ecuad(i)=1/e_cuadr; mat_hijos(i,1:10)=hijos(i,1:10); mat_hijos(i,11)=kp; mat_hijos(i,12)=ki; mat_hijos(i,13)=1/e_cuadr; end mat_hijos mejor_hij=max(auxe_ecuad) for i=1:nind if mejor_hij==mat_hijos(i,13) mejor_kp_hij=mat_hijos(i,11) mejor_ki_hij=mat_hijos(i,12) end end kp=mejor_kp_hij; ki=mejor_ki_hij; sim('lazo_pi',tsim) figure(2) plot(tiempo,salida) title('Mejor Hijo') %% Mutación mutacion=hijos disp('Punto de Mutación') n=10; ptom=round(1+(n-1).*rand(1,1)) for i=1:nind pm=0.01+(0.1-0.01).*rand(1,1) %Lanzamiento de rueda para mutacion if pm<=0.02 if hijos(i,ptom)==0 mutacion(i,ptom)=1; else mutacion(i,ptom)=0; end end end disp('Hijo Proceso de Mutación') mutacion disp('Epoca') gene=gene+1 disp('Error') error_=1/max(auxe_ecuad) pause end

Graficas: las graficas se actualizaran conforme se pase de época a época para la simulación se ingreso 100 individuos y 30 generaciones obteniendo los siguientes resultados

Mejor Padre 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0

0

1

2

3

4

5

6

7

8

9

10

Mejor Hijo 1.6 1.4 1.2 1 0.8 0.6 0.4 0.2 0

0

1

2

3

4

5

6

7

8

9

10

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->