<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Segmentation Fault! &#187; PHP</title>
	<atom:link href="http://www.segmentationfault.es/category/programacion/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.es</link>
	<description>La formulación de un problema es más importante que su solución.</description>
	<lastBuildDate>Tue, 29 Jun 2010 19:45:33 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>From the Array to the Object</title>
		<link>http://www.segmentationfault.es/2010/02/from-the-array-to-the-object/</link>
		<comments>http://www.segmentationfault.es/2010/02/from-the-array-to-the-object/#comments</comments>
		<pubDate>Sun, 28 Feb 2010 12:04:20 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[object]]></category>
		<category><![CDATA[recursivity]]></category>
		<category><![CDATA[stdClass]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1411</guid>
		<description><![CDATA[The other day working late with my colleague Tudor we found that in one point of our application we had to use an object but we had an Array. At this point we found two possible solutions, the first rewrite our code to use the Array instead the object or the second and more sophisticated solution convert the Array to an Object.]]></description>
			<content:encoded><![CDATA[<p>The other day working late with my colleague Tudor, who also have a blog at <a href="http://blog.motane.lu" target="_blank">blog.motane.lu</a>, we found that in one point of our application we had to use an object but we had an Array. At this point we found two possible solutions, the first rewrite our code to use the Array instead the object or the second and more sophisticated solution convert the Array to an Object.</p>
<p>The tricky point was that the Array could contain more Arrays so we had to write a recursive function to accomplish our objective.</p>
<p>Tudor, at the end, gave the following method to be able to do the conversion.</p>
<pre class="brush: php;">
/**
 * Recursively converts an array to a stdClass object
 *
 * @param array $array
 * @return stdClass
 */
 protected function _convertToStdObject(array $array){
   $obj = new stdClass();
   foreach($array as $key =&gt; $value) {
     if(!is_array($value)) {
       $obj-&gt;{$key} = $value;
     }else{
       $obj-&gt;{$key} = $this-&gt;_convertToStdObject($value);
     }
   }

   return $obj;
 }
</pre>
<p>Maybe, in the next interviews we will do to our PHP Developers candidates, we will ask about this and see how they solve the problem <img src='http://www.segmentationfault.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/02/from-the-array-to-the-object/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Debugging PHP en MacOS X</title>
		<link>http://www.segmentationfault.es/2010/01/debugging-php-macos/</link>
		<comments>http://www.segmentationfault.es/2010/01/debugging-php-macos/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 12:21:21 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[MacGDBp]]></category>
		<category><![CDATA[MAMP]]></category>
		<category><![CDATA[XDebug]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1334</guid>
		<description><![CDATA[En este breve post os explico los pasos que he seguido para configurar XDebug para PHP 5.2 usando MAMP Pro bajo MacOS X Snow Leopard. Espero que os resulte útil a todos los que utilizáis el lenguaje de programación PHP. ¡Se acabaron los quebraderos de cabeza por no poder debuggar vuestro código PHP! ]]></description>
			<content:encoded><![CDATA[<p>Hace unos días me decidí a poner a punto de nuevo mi MacBook y una de las cosas que he tenido que hacer es volver a configurar el debugger para PHP, concretamente XDebug. Me ha llevado mi tiempo y algunas búsquedas en Google así que he decidido compartir los pasos con todos vosotros. ¡Dispongámonos a ello!</p>
<p>Antes de nada debo decir que estos son los pasos que he seguido para instalar XDebug para PHP 5.2 usando MAMP Pro 1.8.4 bajo MacOS X Snow Leopard. Es posible que, si tenéis una configuración distinta, los pasos puedan variar un poco.</p>
<p>En primer lugar debemos descargarnos los binarios de XDebug en esta URL: <a href="http://aspn.activestate.com/ASPN/Downloads/Komodo/RemoteDebugging" target="_blank">http://aspn.activestate.com/ASPN/Downloads/Komodo/RemoteDebugging</a>.</p>
<p>Descomprimimos el archivo .tgz que nos acabamos de descargar y veremos que hay una estructura de directorios que representa las diferentes versiones de PHP. Yo actualmente estoy utilizando PHP 5.2 (la que en estos momentos incluye por defecto MAMP y MAMP Pro) así que copiaré el fichero <strong>xdebug.so</strong> que hay dentro de esta carpeta.</p>
<p>Este archivo<strong> xdebug.so</strong> deberemos copiarlo en el directorio de extensiones de PHP, en MAMP es <em>/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/</em>.</p>
<p>Ahora deberemos añadir algunas líneas a nuestro <em>php.ini</em> para activar y configurar la extensión. La localización habitual del fichero <em>php.ini </em>en MAMP es<em> /Applications/MAMP/conf/php5/php.ini</em> pero (<strong>¡OJO!</strong>) si utilizáis MAMP Pro las modificaciones en este fichero serán en vano. Esto es debido a que MAMP Pro carga su propia copia del php.ini que se localiza en <em>/Applications/MAMP PRO x.x.x/MAMP PRO.app/Contents/Resources/php5.ini</em> (accediendo haciendo clic con botón derecho sobre la app de MAMP Pro y &#8220;<em>Mostrar contenido del paquete</em>&#8220;).</p>
<p>Una vez localizado el php.ini adecuado, debemos añadir la siguiente línea:</p>
<pre class="brush: bash; toolbar: true;">
[xdebug]
zend_extension=&quot;/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so&quot;
</pre>
<p>Si utilizáis el editor TextMate para programar, añadid también esta línea a continuación para que el debugger muestre los errores como enlaces a TextMate en la línea correcta:</p>
<pre class="brush: bash; toolbar: true;">
xdebug.file_link_format = &quot;txmt://open?url=file://%f&amp;line=%l&quot;
</pre>
<p>Si además váis a utilizar <a href="http://www.bluestatic.org/software/macgdbp/" target="_blank">MacGDBp</a> para <em>debuggar</em> y queréis que se ejecute el <em>debugger</em> por defecto (si lo tenéis abierto) podéis añadir también (sino deberéis añadir <code>?XDEBUG_SESSION_START=macgdbp</code> a vuestra URL cada vez para iniciar el <em>debugger</em>):</p>
<pre class="brush: bash; toolbar: true;">
xdebug.remote_enable = On
xdebug.remote_autostart = 1
</pre>
<p>Para que funcione todo correctamente posiblemente deberemos desactivar el <em>Zend Optimizer</em>, que viene activado por defecto en MAMP.  Para ello, comentamos las siguientes líneas:</p>
<pre class="brush: bash; toolbar: true;">
;zend_optimizer.optimization_level=15
;zend_extension_manager.optimizer=/Applications/MAMP/bin/php5/zend/lib/Optimizer-3.3.3
;zend_optimizer.version=3.3.3
</pre>
<p>Ahora debéis reiniciar el servidor Apache y ya podréis comenzar a <em>debuggar</em> vuestras aplicaciones en PHP. Si ha funcionado ya os daréis cuenta de que los errores se muestran en una tabla muy colorida y hay una mejora muy sustancial a la hora de mostrar los resultados de var_dump.</p>
<p>Espero que os sea de utilidad y si tenéis problemas acudid a los comentarios para intentar resolverlos entre todos. ¡Salu2!</p>
<p><span style="text-decoration: underline;"><strong>Fuentes</strong></span></p>
<p>debuggable.com &#8211; <a href="http://debuggable.com/posts/setting-up-xdebug-on-mac-os-x-or-win32-linux:480f4dd6-0240-4a90-8fa1-4e41cbdd56cb" target="_blank">http://debuggable.com/posts/setting-up-xdebug-on-mac-os-x-or-win32-linux:480f4dd6-0240-4a90-8fa1-4e41cbdd56cb</a></p>
<p>Techno Sophos &#8211; <a href="http://technosophos.com/content/debugging-your-php-code-xdebug-mamp-textmate-and-macgdbp-support" target="_blank">http://technosophos.com/content/debugging-your-php-code-xdebug-mamp-textmate-and-macgdbp-support</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/01/debugging-php-macos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Parsear ficheros CSV en PHP</title>
		<link>http://www.segmentationfault.es/2010/01/parsear-csv-en-php/</link>
		<comments>http://www.segmentationfault.es/2010/01/parsear-csv-en-php/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 00:20:37 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[CSV]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1340</guid>
		<description><![CDATA[¿Cómo parsearías un fichero CSV? la respuesta mas común a esta pregunta suele ser con expresiones regulares pero en este post voy a tratar de explicar la manera más sencilla y a la vez potente de parsear este tipo de ficheros.]]></description>
			<content:encoded><![CDATA[<p>Desde que en Agosto cambié de empresa me he encontrado muchas veces con la necesidad de parsear ficheros CSV. Hace un tiempo que empecé a evaluar a nuevos candidatos y a todos les hacía la misma pregunta: ¿Cómo parsearías un fichero CSV? La respuesta más común a esta pregunta suele ser &#8220;con expresiones regulares&#8221; pero en este post voy a tratar de explicar la manera más sencilla, y a la vez potente, de parsear este tipo de ficheros.</p>
<p>Desde la versión 4 de PHP existen dos funciones muy útiles para estos menesteres, <strong>fgetcsv </strong>y  <strong>fputcsv</strong>.</p>
<p>Según la documentación PHP la firma de esta función es la siguiente:</p>
<pre class="brush: php;">
array fgetcsv (resource $handle [,int $length [,string $delimiter = ',' [,string $enclosure = '&quot;' [,string $escape = '\\']]]])
</pre>
<p>Como podemos ver, el primer parámetro a proporcionar es el puntero al fichero que queremos leer y después toda una serie de parámetros opcionales como la dimensión de la cadena a leer, el delimitador de campos, el carácter de envoltorio de campos y el carácter para escapar símbolos poco comunes. Esta función, al ser llamada con los parámetros correctos, devolverá la línea que ha leído en formato de array, donde cada campo será una nueva entrada en el array.</p>
<p>Bien, en este punto y antes de mostrar un trozo de código tengo que hacer mención a un detalle, esta función puede ocasionar algunos problemas dependiendo del sistema operativo en el que estemos corriendo PHP. En mi caso, utilizando Mac OS X Snow Leopard, me he encontrado que la función no detecta bien el final de la línea con lo cuál, y para ahorrarnos problemas, vamos a utilizar también la siguiente instrucción:</p>
<pre class="brush: php;">
ini_set('auto_detect_line_endings', TRUE);
</pre>
<p>Esta línea lo que hace es forzar a detectar el final de línea, lo que resuelve el problema en dichas plataformas.</p>
<p>Dicho todo esto, voy a mostrar un trozo de código que lo que hace es recorrer el fichero y generar una array de arrays con todo el fichero parseado.</p>
<pre class="brush: php;">
&lt;?php

//Prepare the auto detect line endings for some OS's
ini_set('auto_detect_line_endings', TRUE);

//Save the path to the file we want to open
$file = dirname(__FILE__) . 'test.csv';

//Create a file pointer to de file in read mode
$fp = fopen($file, 'r');

//Setup the result var
$parsedCSV = array();

/* Get the headers of the csv and store it in a special key in the array. Setting the max length to 0 strip the length constrain */
$parsedCSV['headers'] = fgetcsv($fp, 0, ',');

/* Loop to read the entire file, take a look at the comparison and remember that if fgetcsv arrives at the end of the file a FALSE will be returned. We use this to detect the EOF */
while(($line = fgetcsv($fp, 0, ',')) !== FALSE){
    $parsedCSV[] = $line;
}

//Print out the array
die(var_dump($parsedCSV));
</pre>
<p>Para detectar el final de fichero en este script estamos usando la comparación <em>($line = fgetcsv($fp, 0, &#8216;,&#8217;)) !== FALSE</em> ya que fgetcsv devuelve FALSE en caso de error o EOF (End Of File).</p>
<p>Espero que este post os sea de ayuda y recordad que podéis preguntarnos mediante el sistema de comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2010/01/parsear-csv-en-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Enviar mails desde PHP</title>
		<link>http://www.segmentationfault.es/2009/09/enviar-mails-desde-php/</link>
		<comments>http://www.segmentationfault.es/2009/09/enviar-mails-desde-php/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 20:20:01 +0000</pubDate>
		<dc:creator>Gabi García</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1147</guid>
		<description><![CDATA[¿Alguna vez habéis necesitado automatizar el envío de mails? ¿Tenéis que crear algún tipo de boletín electrónico? ¿Queréis saber cómo enviar mails desde PHP? ¡Éste es vuestro tutorial! En él os explico el uso de la función mail() de forma breve y concisa. ¡Ánimos, es muy simple! ]]></description>
			<content:encoded><![CDATA[<p>Alguna vez os habréis topado con la necesidad de enviar un correo electrónico de forma automatizada, por ejemplo en la implementación de <a href="http://es.wikipedia.org/wiki/Bolet%C3%ADn_informativo" target="_blank"><em>Newsletters</em></a> en alguna aplicación web. A continuación, voy a mostraros cómo hacerlo en el famoso lenguaje, pero no por ello menos potente, PHP.</p>
<p>PHP posee en su librería estándar una función llamada <em>mail()</em> que nos va a permitir realizar esta tarea de una forma sencillísima. Como todas las funciones de este lenguaje, está perfectamente documentada en <a href="http://es.php.net/manual/en/function.mail.php" target="_blank">la web</a>. Sin entreteneros más, os pongo el código:</p>
<pre class="brush: php; toolbar: true;">
&lt;?php
$to = &quot;test@segmentationfault.es&quot;;
$subject = &quot;Segmentation Fault Mail From PHP&quot;;
$body = &quot;This is a mail sent from PHP&quot;;
$headers = &quot;From: gabi@segmentationfault.es&quot; . &quot;\r\n&quot;;

if (mail($to,$subject,$body,$headers)){
  echo &quot;Mail successfully sent&quot;;
} else {
  echo &quot;Error: mail could not be sent&quot;;
}

?&gt;
</pre>
<p>A la función <em>mail()</em> le pasamos los parámetros: <em> </em></p>
<ul>
<li>$to : dirección de correo a quien queremos enviar el mail.</li>
<li>$subject : asunto del mail.</li>
<li>$body : aquí incluiremos el cuerpo del mensaje.</li>
<li>$headers (opcional): Aquí podemos incluir cabeceras específicas en el mail. En este caso hemos especificado la dirección del remitente, pero se pueden incluir más opciones.</li>
</ul>
<p>Como la función <em>mail()</em> de PHP retorna un bool (<em>true/false</em>) podemos utilizarlo para identificar si el mail se ha enviado de forma satisfactoria o no y comunicárselo al usuario.</p>
<p>Ahora ya sabemos cómo enviar mail de texto simple mediante PHP. Pero no nos vamos a quedar sólo aquí, ahora vamos a aprender cómo enviar mails con contenido HTML (la base de cualquier boletín).</p>
<pre class="brush: php; toolbar: true;">
&lt;?php

$to = &quot;test@segmentationfault.es&quot;;
$subject = &quot;Segmentation Fault Mail From PHP with HTML content&quot;;

$body = &quot;&lt;html&gt;&lt;head&gt;&quot;;
$body .= &quot;&lt;title&gt;Segmentation Fault Mail From PHP with HTML content&lt;/title&gt;&quot;;
$body .= &quot;&lt;/head&gt;&lt;body&gt;&quot;;
$body .= &quot;&lt;h1&gt;Segmentation Fault&lt;/h1&gt;&quot;;
$body .= &quot;&lt;p&gt;This is a &lt;b&gt;simple HTML mail&lt;/b&gt; sent from PHP. You can know how to do it in &lt;a href=\&quot;http://segmentationfault.es\&quot;&gt;SegmentationFault Blog&lt;/a&gt;.&lt;/p&gt;&quot;;
$body .= &quot;&lt;/body&gt;&lt;/html&gt;&quot;;

/* Headers necesarios para enviar contenido HTML */
$headers = &quot;MIME-Version: 1.0&quot; . &quot;\r\n&quot;;
$headers .= &quot;Content-type:text/html;charset=iso-8859-1&quot; . &quot;\r\n&quot;;

$headers .= &quot;From: gabi@segmentationfault.es&quot; . &quot;\r\n&quot;;
$headers .= 'CC: noemi@segmentationfault.es' . &quot;\r\n&quot;;

if (mail($to,$subject,$body,$headers)){
  echo &quot;Mail successfully sent&quot;;
} else {
  echo &quot;Error: mail could not be sent&quot;;
}

?&gt;
</pre>
<p>En este segundo ejemplo, el cuerpo del mensaje es contenido HTML y para poder enviarlo necesitamos incluir <em>headers</em> adicionales. Además, hemos añadido un CC para mostrar cómo incluir diversos destinatarios de un mismo mail.</p>
<p>¡Enhorabuena! Ya sabéis enviar mails desde PHP de una forma rápida y simple. Si surgen dudas, haced uso de los comentarios. Salu2!</p>
<p><span style="text-decoration: underline;"><strong>Fuentes</strong></span></p>
<p><a href="http://es.php.net/manual/en/function.mail.php" target="_blank">Documentación PHP &#8211; http://es.php.net/manual/en/function.mail.php</a></p>
<p><a href="http://www.w3schools.com/php/func_mail_mail.asp" target="_blank">W3Schools &#8211; http://www.w3schools.com/php/func_mail_mail.asp</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/09/enviar-mails-desde-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Algoritmos genéticos – Creando a nuestros ciudadanos</title>
		<link>http://www.segmentationfault.es/2009/09/algoritmos-geneticos-ciudadanos/</link>
		<comments>http://www.segmentationfault.es/2009/09/algoritmos-geneticos-ciudadanos/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 21:00:36 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[algoritmos genéticos]]></category>
		<category><![CDATA[hello world]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1138</guid>
		<description><![CDATA[En esta segunda parte vamos a crear la clase que va a representar a nuestros ciudadanos, recordad que por cuestiones prácticas vamos a utilizar php y por si no habéis leído el post anterior sobre la teoría de algoritmos genéticos aquí os dejo el enlace. Una vez dicho esto pasemos a la acción. ]]></description>
			<content:encoded><![CDATA[<p>En esta segunda parte vamos a crear la clase que va a representar a nuestros ciudadanos, recordad que por cuestiones prácticas vamos a utilizar php y por si no habéis leído el post anterior sobre la teoría de algoritmos genéticos <a href="http://www.segmentationfault.es/2009/08/algoritmos-geneticos-teoria/" target="_blank">aquí os dejo el enlace</a>. Una vez dicho esto pasemos a la acción.</p>
<p>En primer lugar nuestra clase ciudadano va a necesitar guardar dos valores referentes al ciudadano al que representa, el primer dato será el material genético a guardar y el segundo caso el fitness actual del ciudadano, para ello emplearemos dos variables privadas ya que queremos controlar exactamente que se almacena en estas variables. Por lo tanto para poder manipular y ver estos datos vamos a necesitar los respectivos setters/getters.</p>
<p>Por último necesitaremos crear una función para calcular el fitness del ciudadano.</p>
<p>El fitness va muy ligado al problema a resolver, en nuestro caso como estamos desarrollando un Hello World el algoritmo va a tratar de llegar a una string objetivo a partir de una string aleatoria, con lo cuál una buena función de fitness debe atorgar una puntuación mas alta o baja dependiendo de lo cerca que estemos del objetivo. En mi caso voy a calcular la distancia entre las letras de la cadena objetivo y la cadena del ciudadano actual.</p>
<p>Atención, no me estoy refiriendo a la distancia Levenshtein. La distancia Levenshtein es el número mínimo de operaciones requeridas para transformar la cadena A en la cadena B, por ejemplo si tenemos la cadena &#8220;Manzana&#8221; y queremos conseguir &#8220;Manzanas&#8221; la distancia Levenshtein será 1.</p>
<p>Nuestra función de fitness para calcular lo bueno que es nuestro ciudadanos  va a sumar la diferencia carácter a carácter entre la string objetivo y la string actual a partir del número correspondiente ASCII de los caracteres. Es decir, entre la letra &#8220;A&#8221; (número 65 en la tabla ASCII) y la letra &#8220;P&#8221; (número 80 en la tabla ASCII) nuestra función debería retornar el número 15. Por lo tanto si tenemos la cadena &#8220;Manzana&#8221; y la cadena &#8220;Manzano&#8221; nuestra función retornará 14.</p>
<p>Cabe destacar que para que el algoritmo funcione correctamente hay que establecer unas cuantas limitaciones, de momento debemos establecer que las strings siempre van a ser del mismo tamaño, es decir en el momento de comparar las strings en nuestra función de fitness vamos a suponer que las strings miden lo mismo.</p>
<p>Por otra parte también quiero hacer notar que en el constructor de la clase inicializamos los datos de las variables, el fitness a -1 y el string a vacío.</p>
<p>Sin mas dilaciones aquí os dejo el código completo de nuestra clase Citizen.</p>
<pre class="brush: php;">
&lt;?php

class Citizen{

 private $data;
 private $fitness;

 public function __construct(){
   $this-&gt;data = '';
   $this-&gt;fitness = -1;
 }

 public function getData(){
   return $this-&gt;data;
 }

 public function setData($newData = NULL){
   try{
     if(!is_null($newData)){
     $this-&gt;data = $newData;
     }
   }catch(Exception $e){
     die($e-&gt;getMessage());
   }
 }

 public function getFitness(){
   return $this-&gt;fitness;
 }

 public function setFitness($newFitness = NULL){
   try{
     if(!is_null($newFitness)){
     $this-&gt;fitness = $newFitness;
     }
   }catch(Exception $e){
     die($e-&gt;getMessage());
   }

 }

 public function calculateFitness($objective = NULL){
   try{
     if(is_null($objective)){
       throw new Exception('Error, no se ha especificado objetivo');
     }

     $fitness = 0;
     for($x=0;$x&lt;strlen($objective);$x++){
       $fitness += abs(ord($objective[$x]) - ord($this-&gt;data[$x]));
     }

     $this-&gt;setFitness($fitness);
   }catch(Exception $e){
     die($e-&gt;getMessage());
   }

 }

}

?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/09/algoritmos-geneticos-ciudadanos/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Algoritmos genéticos &#8211; Teoría</title>
		<link>http://www.segmentationfault.es/2009/08/algoritmos-geneticos-teoria/</link>
		<comments>http://www.segmentationfault.es/2009/08/algoritmos-geneticos-teoria/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 13:52:54 +0000</pubDate>
		<dc:creator>Christopher Vallés</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[algoritmos genéticos]]></category>
		<category><![CDATA[crossover]]></category>
		<category><![CDATA[hello world]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.es/?p=1074</guid>
		<description><![CDATA[Esta primera parte de una serie de artículos sobre algoritmos genéticos (GA por sus siglas en inglés). Principalmente voy a tratar de explicar en este post el fundamento teorico (de manera muy básica) del funcionamiento de este tipo de algoritmos.]]></description>
			<content:encoded><![CDATA[<p>Después de unos días me he decidido a postear esta primera parte de una serie de artículos sobre algoritmos genéticos (GA por sus siglas en inglés). Principalmente voy a tratar de explicar en este post el fundamento teórico (de manera muy básica) del funcionamiento de este tipo de algoritmos. Después en los siguientes posts crearemos un ejemplo de GA utilizando como siempre nuestro amado Hello World!</p>
<p>Los algoritmos genéticos o GA se utilizan básicamente para realizar búsquedas en un espacio de soluciones amplias y con muchos máximos y mínimos locales, generalmente en funciones no derivables o de derivación muy compleja. Cabe destacar que el hecho de utilizar un GA no implica hallar la solución óptima puesto que la búsqueda puede converger prematuramente en un mínimo o máximo local y no poder encontrar el máximo/mínimo general.</p>
<p>Algunos ejemplos de uso de este tipo de algoritmos son:</p>
<ul>
<li>Diseño automatizado de sistemas de comercio en el sector financiero.</li>
<li>Optimización de carga de contenedores.</li>
<li>Diseño de topologías de circuitos impresos.</li>
<li>Aprendizaje de comportamiento de robots.</li>
<li>Infraestructura de redes de comunicaciones móviles.</li>
<li>Predicción.</li>
<li>Aplicaciones en planificación de procesos industriales.</li>
<li>Construcción de horarios en grandes universidades, evitando conflictos de clases.</li>
<li>Optimización de producción y distribución de energía eléctrica.</li>
</ul>
<p>Los GA se inspiran en la evolución biológica para realizar la búsqueda creando una analogía entre el conjunto de soluciones de un problema, llamado fenotipo, y el conjunto de individuos de una población natural, codificando la solución del problema en forma binaria, u otro tipo de codificación, en una cadena llamada cromosoma. Cada símbolo que conforma el cromosoma es un gen.</p>
<p>La búsqueda de la solución óptima del problema se realiza mediante iteraciones llamadas generaciones, en cada generación se realiza una serie de operaciones sobre los cromosomas o ciudadanos de la población.</p>
<p>Ahora vamos a ver el proceso que sigue un algoritmo genético para buscar una solución:</p>
<ol>
<li>Generamos aleatoriamente los ciudadanos (cromosomas) que van a conformar nuestra <strong>población inicial</strong>.</li>
<li>Realizamos una <strong>evaluación</strong> (fitness) de los ciudadanos para saber que tan &#8220;buena&#8221; es la solución.</li>
<li>Verificamos si debemos acabar la ejecución del algoritmo ya sea mediante el número máximo de generaciones o habiendo encontrado la solución óptima ya sea con tolerancia o no.</li>
<li>Una vez conocemos la calidad de nuestros ciudadanos <strong>seleccionamos</strong> a los mejores para reproducirlos.</li>
<li>Aplicamos <strong>operadores genéticos </strong>ya sea el de cruzamiento u otros para reproducir a los mejores ciudadanos y obtener descendencia de estos.</li>
<li>Aplicamos <strong>operadores de mutación</strong> para ampliar la zona de búsqueda no cubierta por los ciudadanos actuales.</li>
<li><strong>Reemplazamos</strong> la generación actual con la descendencia recién obtenida de los mejores ciudadanos.</li>
</ol>
<p>El proceso se repite ejecutando los pasos del 2 al 7 hasta encontrar la solución o llegar al máximo de generaciones. A modo de apunte cabe destacar que hay diferentes métodos de selección tales como el elitismo, la ruleta de selección, etc. Por otra parte también existen diferentes métodos de reproducción tales como crossover sexual, asexual, etc.</p>
<p>Más adelante y para no hacer más denso este post,  explicaré detalladamente cada punto de los vistos aquí.</p>
<p>Una vez visto esto y con una pequeña idea del funcionamiento de los GA construiremos nuestro GA Hello World, para ello utilizaremos PHP (la explicación es extensible a otros lenguajes tales como C) ya que al ser interpretado nos permitirá cambiar valores sin necesidad de recompilar el GA cada dos por tres. La programación de este GA esta realizada mediante POO con lo cuál el próximo post se basará en crear la primera clase necesaria que representará al cromosoma o ciudadano.</p>
<p>Evidentemente cuando un GA se va a utilizar en alguna aplicación se desarrolla en un lenguaje que se pueda compilar para ganar velocidad y minimizar los recursos ya sea C, C++, Java, etc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.es/2009/08/algoritmos-geneticos-teoria/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->