tag:blogger.com,1999:blog-76607738576541289912024-03-08T07:04:34.073-08:00Helio MasterHeliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-7660773857654128991.post-41639985191361521882008-05-26T03:53:00.000-07:002008-05-26T04:09:45.324-07:00Séptimo ejercicioEn este ejercicio utilizaremos el paquete de perl Algorithm::Evolutionary para implementar un algoritmo genético para minimizar la función de Griewank. En este caso usaremos codificación real para los cromosomas.<br /><br /><pre><strong>use</strong> Algorithm::Evolutionary::Individual::Vector;<br /><strong>use</strong> Algorithm::Evolutionary::Op::Easy;<br /><strong>use</strong> Algorithm::Evolutionary::Op::GaussianMutation;<br /><strong>use</strong> Algorithm::Evolutionary::Op::VectorCrossover;<br /><br /><span style="color: rgb(68, 68, 68);"># Definición de la función de Griewank:<br /># -------------------------------------<br /># f(x) = 1/4000*sum(xi^2) - prod(cos(xi)/sqrt(i)) + 1<br />#<br /># -600 <= x(i) <= 600<br /># i = 1..n (n = número de dimensiones del problema)<br />#<br /># Mínimo global: f(x) = 0 se alcanza con x = (0, ..., 0)<br />#<br /><br /># Función de Griewank<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$funcionGriewank</span> = sub <span style="color: rgb(68, 68, 255);"><strong>{</strong></span><br /><span style="color: rgb(68, 68, 68);"># Cogemos el individuo a evaluar<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$chrom</span> = <span style="color: rgb(165, 42, 42);"><strong>shift</strong></span>;<br /><span style="color: rgb(68, 68, 68);"># Extraemos el vector<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">@x</span> = <span style="color: rgb(32, 64, 160);">@{$chrom->{_array}</span><span style="color: rgb(68, 68, 255);"><strong>}</strong></span>;<br /><br /><span style="color: rgb(68, 68, 68);"># Calculamos la función<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$suma</span> = 0;<br /><strong>my</strong> <span style="color: rgb(32, 64, 160);">$prod</span> = 1;<br /><strong>for</strong> <span style="color: rgb(68, 68, 255);"><strong>(</strong></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$i</span>=0;<span style="color: rgb(32, 64, 160);">$i</span><=<span style="color: rgb(32, 64, 160);">$#</span>x;<span style="color: rgb(32, 64, 160);">$i</span>++<span style="color: rgb(68, 68, 255);"><strong>)</strong></span><span style="color: rgb(68, 68, 255);"><strong>{</strong></span><br /><span style="color: rgb(32, 64, 160);">$suma</span> += <span style="color: rgb(32, 64, 160);">$x</span><span style="color: rgb(68, 68, 255);"><strong>[</strong></span><span style="color: rgb(32, 64, 160);">$i</span><span style="color: rgb(68, 68, 255);"><strong>]</strong></span>**2;<br /><span style="color: rgb(32, 64, 160);">$prod</span> *= <span style="color: rgb(165, 42, 42);"><strong>cos</strong></span><span style="color: rgb(68, 68, 255);"><strong>(</strong></span><span style="color: rgb(32, 64, 160);">$x</span><span style="color: rgb(68, 68, 255);"><strong>[</strong></span><span style="color: rgb(32, 64, 160);">$i</span><span style="color: rgb(68, 68, 255);"><strong>]</strong></span>/<span style="color: rgb(165, 42, 42);"><strong>sqrt</strong></span><span style="color: rgb(68, 68, 255);"><strong>(</strong></span><span style="color: rgb(32, 64, 160);">$i</span>+1<span style="color: rgb(68, 68, 255);"><strong>)</strong></span><span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><span style="color: rgb(68, 68, 255);"><strong>}</strong></span><br /><span style="color: rgb(32, 64, 160);">$suma</span> = <span style="color: rgb(32, 64, 160);">$suma</span>/4000;<br /><strong>my</strong> <span style="color: rgb(32, 64, 160);">$fitness</span> = <span style="color: rgb(32, 64, 160);">$suma</span>-<span style="color: rgb(32, 64, 160);">$prod</span>+1;<br /><br /><strong>return</strong> <span style="color: rgb(32, 64, 160);">$fitness</span>;<br /><span style="color: rgb(68, 68, 255);"><strong>}</strong></span>;<br /><br /><span style="color: rgb(68, 68, 68);"># Parámetros del algoritmo<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$popSize</span> = 100; <span style="color: rgb(68, 68, 68);"># Tamaño de la población<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$numGens</span> = 100; <span style="color: rgb(68, 68, 68);"># Número de generaciones<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$dimensiones</span> = 2; <span style="color: rgb(68, 68, 68);"># Número de dimensiones del problema<br /> # y, por lo tanto, número de cromosomas<br /><br /># Creación de la población inicial<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">@pop</span>;<br /><strong>for</strong> <span style="color: rgb(68, 68, 255);"><strong>(</strong></span> 0..<span style="color: rgb(32, 64, 160);">$popSize</span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span> <span style="color: rgb(68, 68, 255);"><strong>{</strong></span><br /><span style="color: rgb(68, 68, 68);"># Los genes tomarán valores entre -600 y 600<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$indi</span> = Algorithm::Evolutionary::Individual::Vector-><br /><strong>new</strong><span style="color: rgb(68, 68, 255);"><strong>(</strong></span> <span style="color: rgb(32, 64, 160);">$dimensiones</span>, -600, 600 <span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><span style="color: rgb(165, 42, 42);"><strong>push</strong></span><span style="color: rgb(68, 68, 255);"><strong>(</strong></span> <span style="color: rgb(32, 64, 160);">@pop</span>, <span style="color: rgb(32, 64, 160);">$indi</span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><span style="color: rgb(68, 68, 255);"><strong>}</strong></span><br /><br /><span style="color: rgb(68, 68, 68);"># Inicializamos el fitnes de la población inicial<br /></span><strong>for</strong> <span style="color: rgb(68, 68, 255);"><strong>(</strong></span> <span style="color: rgb(32, 64, 160);">@pop</span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span> <span style="color: rgb(68, 68, 255);"><strong>{</strong></span><br /><strong>if</strong> <span style="color: rgb(68, 68, 255);"><strong>(</strong></span> !<span style="color: rgb(165, 42, 42);"><strong>defined</strong></span> <span style="color: rgb(32, 64, 160);">$_</span>->Fitness<span style="color: rgb(68, 68, 255);"><strong>(</strong></span><span style="color: rgb(68, 68, 255);"><strong>)</strong></span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span> <span style="color: rgb(68, 68, 255);"><strong>{</strong></span><br /><strong>my</strong> <span style="color: rgb(32, 64, 160);">$fitness</span> = <span style="color: rgb(32, 64, 160);">$funcionGriewank</span>-><span style="color: rgb(68, 68, 255);"><strong>(</strong></span><span style="color: rgb(32, 64, 160);">$_</span><span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><span style="color: rgb(32, 64, 160);">$_</span>->Fitness<span style="color: rgb(68, 68, 255);"><strong>(</strong></span> <span style="color: rgb(32, 64, 160);">$fitness</span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><span style="color: rgb(68, 68, 255);"><strong>}</strong></span><br /><span style="color: rgb(68, 68, 255);"><strong>}</strong></span><br /><br /><span style="color: rgb(68, 68, 68);"># Definición de los operadores genéticos<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$mutacion</span> = Algorithm::Evolutionary::Op::GaussianMutation-><br /><strong>new</strong><span style="color: rgb(68, 68, 255);"><strong>(</strong></span> 0, 0.1 <span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><strong>my</strong> <span style="color: rgb(32, 64, 160);">$cruce</span> = Algorithm::Evolutionary::Op::VectorCrossover-><br /><strong>new</strong><span style="color: rgb(68, 68, 255);"><strong>(</strong></span>2<span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><br /><span style="color: rgb(68, 68, 68);"># Elección del algoritmo<br /></span><strong>my</strong> <span style="color: rgb(32, 64, 160);">$generation</span> = Algorithm::Evolutionary::Op::Easy-><br /><strong>new</strong><span style="color: rgb(68, 68, 255);"><strong>(</strong></span> <span style="color: rgb(32, 64, 160);">$funcionGriewank</span> , 0.2 , <span style="color: rgb(68, 68, 255);"><strong>[</strong></span><span style="color: rgb(32, 64, 160);">$mutacion</span>, <span style="color: rgb(32, 64, 160);">$cruce</span><span style="color: rgb(68, 68, 255);"><strong>]</strong></span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span> ;<br /><br /><span style="color: rgb(68, 68, 68);"># Bucle general del algoritmo<br /></span><strong>do</strong> <span style="color: rgb(68, 68, 255);"><strong>{</strong></span><br /><span style="color: rgb(32, 64, 160);">$generation</span>->apply<span style="color: rgb(68, 68, 255);"><strong>(</strong></span> \<span style="color: rgb(32, 64, 160);">@pop</span> <span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><span style="color: rgb(165, 42, 42);"><strong>print</strong></span> <span style="color: rgb(0, 128, 0);">"<span style="color: rgb(32, 64, 160);">$numGens</span> : "</span>, <span style="color: rgb(32, 64, 160);">$pop</span><span style="color: rgb(68, 68, 255);"><strong>[</strong></span>0<span style="color: rgb(68, 68, 255);"><strong>]</strong></span>->asString<span style="color: rgb(68, 68, 255);"><strong>(</strong></span><span style="color: rgb(68, 68, 255);"><strong>)</strong></span>, <span style="color: rgb(0, 128, 0);">"<span style="color: rgb(119, 221, 119);">\n</span>"</span> ;<br /><span style="color: rgb(32, 64, 160);">$numGens</span>--;<br /><span style="color: rgb(68, 68, 255);"><strong>}</strong></span> <strong>while</strong><span style="color: rgb(68, 68, 255);"><strong>(</strong></span> <span style="color: rgb(32, 64, 160);">$numGens</span> > 0 <span style="color: rgb(68, 68, 255);"><strong>)</strong></span>;<br /><br /><span style="color: rgb(68, 68, 68);"># Mejor individuo encontrado<br /></span><span style="color: rgb(165, 42, 42);"><strong>print</strong></span> <span style="color: rgb(0, 128, 0);">"<span style="color: rgb(119, 221, 119);">\n</span>La mejor solución encontrada es:<span style="color: rgb(119, 221, 119);">\n</span><span style="color: rgb(119, 221, 119);">\t</span> "</span>;<br /><span style="color: rgb(165, 42, 42);"><strong>print</strong></span> <span style="color: rgb(32, 64, 160);">$pop</span><span style="color: rgb(68, 68, 255);"><strong>[</strong></span>0<span style="color: rgb(68, 68, 255);"><strong>]</strong></span>->asString<span style="color: rgb(68, 68, 255);"><strong>(</strong></span><span style="color: rgb(68, 68, 255);"><strong>)</strong></span>,<span style="color: rgb(0, 128, 0);">"<span style="color: rgb(119, 221, 119);">\n</span>"</span>;<br /><br /></pre>Heliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-52660519197335966372008-05-26T03:14:00.000-07:002008-05-26T03:52:48.781-07:00Sexto EjercicioEn este ejercicio utilizaremos el paquete de perl Algorithm::Evolutionary para implementar un algoritmo genético para minimizar la función de Griewank. Usaremos codificación binaria para los cromosomas.<br /><pre><br /><strong>use</strong> Algorithm::Evolutionary::Individual::BitString;<br /><strong>use</strong> Algorithm::Evolutionary::Op::Easy;<br /><strong>use</strong> Algorithm::Evolutionary::Op::Mutation;<br /><strong>use</strong> Algorithm::Evolutionary::Op::Crossover;<br /><br /><span style="color:#444444;"># Definición de la función de Griewank:<br /># -------------------------------------<br /># f(x) = 1/4000*sum(xi^2) - prod(cos(xi)/sqrt(i)) + 1<br />#<br /># -600 <= x(i) <= 600<br /># i = 1..n (n = número de dimensiones del problema)<br />#<br /># Mínimo global: f(x) = 0 se alcanza con x = (0, ..., 0)<br />#<br /><br /># Parámetros del algoritmo<br /><br /># Tamaño de la población<br /></span><strong>my</strong> <span style="color:#2040a0;">$popSize</span>=100;<br /><br /><span style="color:#444444;"># Número de dimensiones del problema (en cada cromosoma<br /># se codificarán este número de reales)<br /></span><strong>my</strong> <span style="color:#2040a0;">$dimensiones</span> = 3;<br /><br /><span style="color:#444444;"># Número de bits con los que se codificará cada dimensión<br /># Cada cromosoma: ($dimensiones*$numBitsPorDimension)bits<br /></span><strong>my</strong> <span style="color:#2040a0;">$numBitsPorDimension</span>=10;<br /><br /><span style="color:#444444;"># Número de generaciones<br /></span><strong>my</strong> <span style="color:#2040a0;">$numGens</span> = 100;<br /><br /><span style="color:#444444;"># Función de Griewank:<br /></span><strong>my</strong> <span style="color:#2040a0;">$funcionGriewank</span> = sub <span style="color:#4444ff;"><strong>{</strong></span><br /><span style="color:#444444;">#Cogemos el individuo a evaluar<br /></span><strong>my</strong> <span style="color:#2040a0;">$chrom</span> = <span style="color:#a52a2a;"><strong>shift</strong></span>;<br /><strong>my</strong> <span style="color:#2040a0;">$str</span> = <span style="color:#2040a0;">$chrom</span>->Chrom<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>)</strong></span>;<br /><span style="color:#444444;">#Extraemos los números reales de la cadena binaria<br /></span><strong>my</strong> <span style="color:#2040a0;">@vector</span>;<br /><strong>my</strong> <span style="color:#2040a0;">$pos</span>=0;<br /><strong>while</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$pos</span><<span style="color:#a52a2a;"><strong>length</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$str</span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <strong>my</strong> <span style="color:#2040a0;">$x</span> = <strong>eval</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#008000;">"0b"</span>.<span style="color:#a52a2a;"><strong>substr</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$str</span>,<span style="color:#2040a0;">$pos</span>,<span style="color:#2040a0;">$numBitsPorDimension</span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>)</strong></span>;<br /> <span style="color:#2040a0;">@vector</span> = <span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">@vector</span>,<span style="color:#2040a0;">$x</span><span style="color:#4444ff;"><strong>)</strong></span>;<br /> <span style="color:#2040a0;">$pos</span> += <span style="color:#2040a0;">$numBitsPorDimension</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#444444;">#Los normalizamos y los pasamos al rango [-600,600]<br /></span><strong>my</strong> <span style="color:#2040a0;">$max</span>=<span style="color:#4444ff;"><strong>(</strong></span>2**<span style="color:#2040a0;">$numBitsPorDimension</span> <span style="color:#4444ff;"><strong>)</strong></span>-1;<br /><strong>for</strong><span style="color:#4444ff;"><strong>(</strong></span><strong>my</strong> <span style="color:#2040a0;">$i</span>=0;<span style="color:#2040a0;">$i</span><=<span style="color:#2040a0;">$#</span>vector;<span style="color:#2040a0;">$i</span>++<span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#2040a0;">$vector</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$i</span><span style="color:#4444ff;"><strong>]</strong></span>=<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$vector</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$i</span><span style="color:#4444ff;"><strong>]</strong></span>/<span style="color:#2040a0;">$max</span><span style="color:#4444ff;"><strong>)</strong></span>*1200<span style="color:#4444ff;"><strong>)</strong></span>-600;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#444444;"># Calculamos la función<br /></span><strong>my</strong> <span style="color:#2040a0;">$suma</span> = 0;<br /><strong>my</strong> <span style="color:#2040a0;">$prod</span> = 1;<br /><strong>for</strong> <span style="color:#4444ff;"><strong>(</strong></span><strong>my</strong> <span style="color:#2040a0;">$i</span>=0;<span style="color:#2040a0;">$i</span><=<span style="color:#2040a0;">$#</span>vector;<span style="color:#2040a0;">$i</span>++<span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#2040a0;">$suma</span> += <span style="color:#2040a0;">$vector</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$i</span><span style="color:#4444ff;"><strong>]</strong></span>**2;<br /> <span style="color:#2040a0;">$prod</span> *= <span style="color:#a52a2a;"><strong>cos</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$vector</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$i</span><span style="color:#4444ff;"><strong>]</strong></span>/<span style="color:#a52a2a;"><strong>sqrt</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$i</span>+1<span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>)</strong></span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#2040a0;">$suma</span> = <span style="color:#2040a0;">$suma</span>/4000;<br /><strong>my</strong> <span style="color:#2040a0;">$fitness</span> = <span style="color:#2040a0;">$suma</span>-<span style="color:#2040a0;">$prod</span>+1;<br /><br /><strong>return</strong> <span style="color:#2040a0;">$fitness</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span>;<br /><br /><span style="color:#444444;"># Muestra los números reales que componen un cromosoma<br /></span><strong>sub<span style="color:#ff0000;"> componentesSolucion</span>{</strong><br /><span style="color:#444444;">#Cogemos el individuo a evaluar<br /></span><strong>my</strong> <span style="color:#2040a0;">$chrom</span> = <span style="color:#a52a2a;"><strong>shift</strong></span>;<br /><strong>my</strong> <span style="color:#2040a0;">$str</span> = <span style="color:#2040a0;">$chrom</span>->Chrom<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>)</strong></span>;<br /><strong>my</strong> <span style="color:#2040a0;">$resultado</span> = <span style="color:#008000;">""</span>;<br /><span style="color:#444444;">#Extraemos los números reales de la cadena binaria<br /></span><strong>my</strong> <span style="color:#2040a0;">@vector</span>;<br /><strong>my</strong> <span style="color:#2040a0;">$pos</span>=0;<br /><strong>while</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$pos</span><<span style="color:#a52a2a;"><strong>length</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$str</span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <strong>my</strong> <span style="color:#2040a0;">$x</span> = <strong>eval</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#008000;">"0b"</span>.<span style="color:#a52a2a;"><strong>substr</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$str</span>,<span style="color:#2040a0;">$pos</span>,<span style="color:#2040a0;">$numBitsPorDimension</span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>)</strong></span>;<br /> <span style="color:#2040a0;">@vector</span> = <span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">@vector</span>,<span style="color:#2040a0;">$x</span><span style="color:#4444ff;"><strong>)</strong></span>;<br /> <span style="color:#2040a0;">$pos</span> += <span style="color:#2040a0;">$numBitsPorDimension</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#444444;">#Los normalizamos y los pasamos al rango [-600,600]<br /></span><strong>my</strong> <span style="color:#2040a0;">$max</span>=<span style="color:#4444ff;"><strong>(</strong></span>2**<span style="color:#2040a0;">$numBitsPorDimension</span> <span style="color:#4444ff;"><strong>)</strong></span>-1;<br /><strong>for</strong><span style="color:#4444ff;"><strong>(</strong></span><strong>my</strong> <span style="color:#2040a0;">$i</span>=0;<span style="color:#2040a0;">$i</span><=<span style="color:#2040a0;">$#</span>vector;<span style="color:#2040a0;">$i</span>++<span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#2040a0;">$vector</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$i</span><span style="color:#4444ff;"><strong>]</strong></span>=<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$vector</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$i</span><span style="color:#4444ff;"><strong>]</strong></span>/<span style="color:#2040a0;">$max</span><span style="color:#4444ff;"><strong>)</strong></span>*1200<span style="color:#4444ff;"><strong>)</strong></span>-600;<br /> <span style="color:#2040a0;">$resultado</span> = <span style="color:#008000;">"<span style="color:#2040a0;">$resultado</span><span style="color:#2040a0;">$vector</span>[<span style="color:#2040a0;">$i</span>], "</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><br /><span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#a52a2a;"><strong>substr</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$resultado</span>, 0, <span style="color:#a52a2a;"><strong>length</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$resultado</span><span style="color:#4444ff;"><strong>)</strong></span>-2<span style="color:#4444ff;"><strong>)</strong></span>;<br /><span style="color:#4444ff;"><strong>}</strong></span>;<br /><br /><span style="color:#444444;"># Creación de la población inicial<br /></span><strong>my</strong> <span style="color:#2040a0;">@pop</span>;<br /><strong>for</strong> <span style="color:#4444ff;"><strong>(</strong></span> 0..<span style="color:#2040a0;">$popSize</span> <span style="color:#4444ff;"><strong>)</strong></span> <span style="color:#4444ff;"><strong>{</strong></span><br /><strong>my</strong> <span style="color:#2040a0;">$indi</span> = Algorithm::Evolutionary::Individual::BitString-><br /> <strong>new</strong><span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">$dimensiones</span>*<span style="color:#2040a0;">$numBitsPorDimension</span> <span style="color:#4444ff;"><strong>)</strong></span> ;<br /><span style="color:#a52a2a;"><strong>push</strong></span><span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">@pop</span>, <span style="color:#2040a0;">$indi</span> <span style="color:#4444ff;"><strong>)</strong></span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><br /><span style="color:#444444;"># Inicializamos el fitnes de la población inicial<br /></span><strong>for</strong> <span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">@pop</span> <span style="color:#4444ff;"><strong>)</strong></span> <span style="color:#4444ff;"><strong>{</strong></span><br /><strong>if</strong> <span style="color:#4444ff;"><strong>(</strong></span> !<span style="color:#a52a2a;"><strong>defined</strong></span> <span style="color:#2040a0;">$_</span>->Fitness<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>)</strong></span> <span style="color:#4444ff;"><strong>)</strong></span> <span style="color:#4444ff;"><strong>{</strong></span><br /> <strong>my</strong> <span style="color:#2040a0;">$fitness</span> = <span style="color:#2040a0;">$funcionGriewank</span>-><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$_</span><span style="color:#4444ff;"><strong>)</strong></span>;<br /> <span style="color:#2040a0;">$_</span>->Fitness<span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">$fitness</span> <span style="color:#4444ff;"><strong>)</strong></span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#4444ff;"><strong>}</strong></span><br /><br /><span style="color:#444444;"># Definición de los operadores genéticos<br /></span><strong>my</strong> <span style="color:#2040a0;">$mutacion</span> = Algorithm::Evolutionary::Op::Mutation-><strong>new</strong><span style="color:#4444ff;"><strong>(</strong></span>0.1<span style="color:#4444ff;"><strong>)</strong></span>;<br /><strong>my</strong> <span style="color:#2040a0;">$cruce</span> = Algorithm::Evolutionary::Op::Crossover-><strong>new</strong><span style="color:#4444ff;"><strong>(</strong></span>2<span style="color:#4444ff;"><strong>)</strong></span>;<br /><br /><span style="color:#444444;"># Elección del algoritmo<br /></span><strong>my</strong> <span style="color:#2040a0;">$generation</span> = Algorithm::Evolutionary::Op::Easy-><br /><strong>new</strong><span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">$funcionGriewank</span> , 0.2 , <span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$mutacion</span>, <span style="color:#2040a0;">$cruce</span><span style="color:#4444ff;"><strong>]</strong></span> <span style="color:#4444ff;"><strong>)</strong></span> ;<br /><br /><span style="color:#444444;"># Bucle general del algoritmo<br /></span><strong>do</strong> <span style="color:#4444ff;"><strong>{</strong></span><br /><span style="color:#2040a0;">$generation</span>->apply<span style="color:#4444ff;"><strong>(</strong></span> \<span style="color:#2040a0;">@pop</span> <span style="color:#4444ff;"><strong>)</strong></span>;<br /><span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#008000;">"<span style="color:#2040a0;">$numGens</span> : "</span>, <span style="color:#2040a0;">$pop</span><span style="color:#4444ff;"><strong>[</strong></span>0<span style="color:#4444ff;"><strong>]</strong></span>->asString<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>)</strong></span>, <span style="color:#008000;">"<span style="color:#77dd77;">\n</span>"</span> ;<br /><span style="color:#2040a0;">$numGens</span> -- ;<br /><span style="color:#4444ff;"><strong>}</strong></span> <strong>while</strong><span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">$numGens</span> > 0 <span style="color:#4444ff;"><strong>)</strong></span>;<br /><br /><span style="color:#444444;"># Mejor individuo encontrado<br /></span><span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#008000;">"<span style="color:#77dd77;">\n</span>La mejor solución encontrada es:<span style="color:#77dd77;">\n</span><span style="color:#77dd77;">\t</span> "</span>;<br /><span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#2040a0;">$pop</span><span style="color:#4444ff;"><strong>[</strong></span>0<span style="color:#4444ff;"><strong>]</strong></span>->asString<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#4444ff;"><strong>)</strong></span> ;<br /><span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#008000;">"<span style="color:#77dd77;">\n</span>Componentes de la mejor solución: <span style="color:#77dd77;">\n</span><span style="color:#77dd77;">\t</span> "</span>;<br />componentesSolucion<span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$pop</span><span style="color:#4444ff;"><strong>[</strong></span>0<span style="color:#4444ff;"><strong>]</strong></span><span style="color:#4444ff;"><strong>)</strong></span>;<br /><br /></pre>Heliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-15822169839511244252008-04-30T07:49:00.000-07:002008-05-26T04:03:26.541-07:00Quinto EjercicioEn este ejercicio vamos a contar todas las veces que se repiten las palabras que aparecen en un fichero y vamos a imprimir las 50 palabras más repetidas.<br /><br />El código del programa es el siguiente:<br /><pre><br /><strong>use</strong> File::Slurp;<br /><br /><span style="color:#2040a0;">@ARGV</span> || <strong>die</strong> <span style="color:#008000;">"Uso: <span style="color:#2040a0;">$0</span> <fichero para contar palabras><span style="color:#77dd77;">\n</span>"</span>;<br /><strong>my</strong> <span style="color:#2040a0;">$text</span> = read_file<span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">$ARGV</span><span style="color:#4444ff;"><strong>[</strong></span>0<span style="color:#4444ff;"><strong>]</strong></span> <span style="color:#4444ff;"><strong>)</strong></span> ;<br /><strong>my</strong> <span style="color:#2040a0;">@palabras</span> = <span style="color:#a52a2a;"><strong>split</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#008000;">" "</span>,<span style="color:#2040a0;">$text</span><span style="color:#4444ff;"><strong>)</strong></span>;<br /><strong>my</strong> <span style="color:#2040a0;">%indice</span>;<br /><br /><strong>for</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">@palabras</span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <strong>if</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$_</span> =~<span style="color:#b000d0;"> /^([a-záéíóúñ])+$/</span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#2040a0;">$indice</span><span style="color:#4444ff;"><strong>{</strong></span><span style="color:#2040a0;">$_</span><span style="color:#4444ff;"><strong>}</strong></span>=<span style="color:#2040a0;">$indice</span><span style="color:#4444ff;"><strong>{</strong></span><span style="color:#2040a0;">$_</span><span style="color:#4444ff;"><strong>}</strong></span>+1;<br /> <span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#4444ff;"><strong>}</strong></span><br /><br /><span style="color:#2040a0;">@ordenadas</span> = <span style="color:#a52a2a;"><strong>sort</strong></span> <span style="color:#4444ff;"><strong>{</strong></span><span style="color:#2040a0;">$indice</span><span style="color:#4444ff;"><strong>{</strong></span><span style="color:#2040a0;">$b</span><span style="color:#4444ff;"><strong>}</strong></span> cmp <span style="color:#2040a0;">$indice</span><span style="color:#4444ff;"><strong>{</strong></span><span style="color:#2040a0;">$a</span><span style="color:#4444ff;"><strong>}</strong></span><span style="color:#4444ff;"><strong>}</strong></span> <span style="color:#a52a2a;"><strong>keys</strong></span> <span style="color:#2040a0;">%indice</span>;<br /><br /><strong>for</strong><span style="color:#4444ff;"><strong>(</strong></span>0..49<span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <strong>if</strong><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">$_</span><=<span style="color:#2040a0;">$#</span>ordenadas<span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#2040a0;">$_</span>+1,<span style="color:#008000;">": "</span>,<span style="color:#2040a0;">$ordenadas</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$_</span><span style="color:#4444ff;"><strong>]</strong></span>,<span style="color:#008000;">" ... "</span>,<span style="color:#2040a0;">$indice</span><span style="color:#4444ff;"><strong>{</strong></span><span style="color:#2040a0;">$ordenadas</span><span style="color:#4444ff;"><strong>[</strong></span><span style="color:#2040a0;">$_</span><span style="color:#4444ff;"><strong>]</strong></span><span style="color:#4444ff;"><strong>}</strong></span>,<span style="color:#008000;">" veces<span style="color:#77dd77;">\n</span>"</span>;<br /> <span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#4444ff;"><strong>}</strong></span><br /></pre><br />Primero dividimos el texto en palabras con la función split.<br />Luego recorremos el array con las palabras y si concuerdan con la expresión regular que define "una palabra en minúsculas" vamos incrementando el valor de un hash en el que tenemos como clave la palabra en sí y como valor el número de veces que se ha repetido.<br />A continuación ordenamos las palabras por repeticiones e imprimimos las 50 más frecuentes.Heliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-39795463851361702972008-04-30T06:34:00.000-07:002008-05-26T04:07:04.475-07:00Cuarto EjercicioVamos a escribir un programa que, dado un fichero de entrada, lo divida en párrafos y le añada las correspondientes etiquetas de párrafo en html (<p>Parrafo</p>).<br /><br />El código del programa es el siguiente:<br /><pre><br /><strong>use</strong> File::Slurp;<br /><br /><span style="color:#2040a0;">@ARGV</span> || <strong>die</strong> <span style="color:#008000;">"Uso: <span style="color:#2040a0;">$0</span> <fichero a dividir por párrafos><span style="color:#77dd77;">\n</span>"</span>;<br /><strong>my</strong> <span style="color:#2040a0;">$text</span> = read_file<span style="color:#4444ff;"><strong>(</strong></span> <span style="color:#2040a0;">$ARGV</span><span style="color:#4444ff;"><strong>[</strong></span>0<span style="color:#4444ff;"><strong>]</strong></span> <span style="color:#4444ff;"><strong>)</strong></span> ;<br /><strong>my</strong> <span style="color:#2040a0;">@parrafos</span>=<span style="color:#a52a2a;"><strong>split</strong></span><span style="color:#4444ff;"><strong>(</strong></span><span style="color:#008000;">"<span style="color:#77dd77;">\r</span><span style="color:#77dd77;">\n</span><span style="color:#77dd77;">\r</span><span style="color:#77dd77;">\n</span>"</span>, <span style="color:#2040a0;">$text</span><span style="color:#4444ff;"><strong>)</strong></span>;<br /><br /><strong>for</strong> <span style="color:#4444ff;"><strong>(</strong></span><span style="color:#2040a0;">@parrafos</span><span style="color:#4444ff;"><strong>[</strong></span>0..<span style="color:#2040a0;">$#</span>parrafos<span style="color:#4444ff;"><strong>]</strong></span><span style="color:#4444ff;"><strong>)</strong></span><span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#008000;">"<p><span style="color:#77dd77;">\n</span>"</span>,<span style="color:#2040a0;">$_</span>,<span style="color:#008000;">"<span style="color:#77dd77;">\n</span></p><span style="color:#77dd77;">\n</span>"</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><br /></pre>Primero dividimos el texto del fichero en párrafos usando la función split la cual, como indica su primer argumento, añadirá una parte cada vez que encuentre 2 saltos de línea. Seguidamente, recorremos el array que contiene las partes e imprimimos en pantalla cada parte entre las mencionadas etiquetas html.Heliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-52241301200974323022008-04-22T09:43:00.001-07:002008-05-26T04:08:15.649-07:00Tercer ejercicioVamos a escribir un programa que cuente el número de líneas que no estén en blanco en un fichero, y lo escriba en un fichero de salida cuyo nombre se cree a partir del nombre del fichero original, con la extensión lc.<br /><br />El código de nuestro programa es el siguiente:<br /><pre><br /><strong>my</strong> <span style="color:#2040a0;">$leyendo</span> = <span style="color:#008000;">"diablocojuelo.txt"</span>;<br /><strong>if</strong> <span style="color:#4444ff;"><strong>(</strong></span> ! -r <span style="color:#2040a0;">$leyendo</span> <span style="color:#4444ff;"><strong>)</strong></span> <span style="color:#4444ff;"><strong>{</strong></span><br /> <strong>die</strong> <span style="color:#008000;">"El fichero <span style="color:#2040a0;">$leyendo</span> no es legible<span style="color:#77dd77;">\n</span>"</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#a52a2a;"><strong>open</strong></span> <strong>my</strong> <span style="color:#2040a0;">$fh</span>, <span style="color:#008000;">"<"</span>, <span style="color:#2040a0;">$leyendo</span><br /> <strong>or</strong> <strong>die</strong> <span style="color:#008000;">"No puedo abrir el fichero <span style="color:#2040a0;">$leyendo</span> por <span style="color:#2040a0;">$!</span><span style="color:#77dd77;">\n</span>"</span>;<br /><span style="color:#a52a2a;"><strong>open</strong></span> <strong>my</strong> <span style="color:#2040a0;">$fh_out</span>, <span style="color:#008000;">">"</span>, <span style="color:#008000;">"<span style="color:#2040a0;">$leyendo</span>.lc"</span><br /> <strong>or</strong> <strong>die</strong> <span style="color:#008000;">"No puedo abrir el fichero <span style="color:#2040a0;">$leyendo</span>.lc por <span style="color:#2040a0;">$!</span><span style="color:#77dd77;">\n</span>"</span>;<br /><strong>my</strong> <span style="color:#2040a0;">$cont</span> = 0;<br /><strong>while</strong> <span style="color:#4444ff;"><strong>(</strong></span><<span style="color:#2040a0;">$fh</span>><span style="color:#4444ff;"><strong>)</strong></span> <span style="color:#4444ff;"><strong>{</strong></span><br /> <span style="color:#a52a2a;"><strong>chop</strong></span>; <span style="color:#a52a2a;"><strong>chop</strong></span>;<br /> <span style="color:#2040a0;">$cont</span>++ <strong>if</strong> <span style="color:#2040a0;">$_</span>;<br /><span style="color:#4444ff;"><strong>}</strong></span><br /><span style="color:#a52a2a;"><strong>print</strong></span> <span style="color:#2040a0;">$fh_out</span> <span style="color:#008000;">"<span style="color:#2040a0;">$cont</span><span style="color:#77dd77;">\n</span>"</span>;<br /><br /><span style="color:#a52a2a;"><strong>close</strong></span> <span style="color:#2040a0;">$fh</span>;<br /><span style="color:#a52a2a;"><strong>close</strong></span> <span style="color:#2040a0;">$fh_out</span>;<br /></pre><br />Hemos usado cierta funcionalidad de perl que habíamos aprendido en el tutorial:<br /><ul><li><span style="font-family:arial;"> $! es una variable que contiene el último mensaje de error del sistema.</span></li></ul><ul><li><span style="font-family:arial;"> <$fh> lee la siguiente línea (incluido el \n) del fichero al que apunta $fh</span></li></ul><ul><li><span style="font-family:arial;"> $_ es la variable por defecto de perl. Si en algún sitio debería haber una variable y no la hay, entonces se está usando $_</span></li></ul><ul><li><span style="font-family:arial;">chop elimina un caracter del final de la línea</span></li></ul>Heliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-18806923158746884442008-04-16T09:33:00.001-07:002008-04-16T09:34:46.664-07:00Segundo ejercicioDepurando un fichero .pl desde el intérprete de comandos:<br />> perl -d fichero.pl<br /><br />Algunos comandos del depurador:<br />c: continuar<br />n: siguiente<br />q: salir<br />h: ayuda<br />b [num_linea]: breakpoint en num_lineaHeliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-66552035199238317542008-04-16T09:00:00.000-07:002008-04-16T09:35:38.400-07:00Primer ejercicioEjecutando un fichero .pl desde la línea de comandos:<br />> perl fichero.plHeliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0tag:blogger.com,1999:blog-7660773857654128991.post-71470074722828533122008-04-16T08:59:00.000-07:002008-04-22T09:59:34.111-07:00Iniciándose en PerlVamos a realizar un curso rápido de perl.<br />Se podrá realizar un seguimiento del desarrollo de este curso a través de este blog.<br /><br />Lo primero que hemos hecho ha sido:<br /><ul><li>Descargar perl desde <a href="http://strawberryperl.com/">http://strawberryperl.com/</a></li><li>Descargar el editor Crimson desde <a href="http://www.crimsoneditor.com/">http://www.crimsoneditor.com/</a><span class="a"></span></li></ul>Heliohttp://www.blogger.com/profile/08826663337504755874noreply@blogger.com0