1SepAlgoritmos genéticos – Creando a nuestros ciudadanos

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.

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.

Por último necesitaremos crear una función para calcular el fitness del ciudadano.

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.

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 “Manzana” y queremos conseguir “Manzanas” la distancia Levenshtein será 1.

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 “A” (número 65 en la tabla ASCII) y la letra “P” (número 80 en la tabla ASCII) nuestra función debería retornar el número 15. Por lo tanto si tenemos la cadena “Manzana” y la cadena “Manzano” nuestra función retornará 14.

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.

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.

Sin mas dilaciones aquí os dejo el código completo de nuestra clase Citizen.

<?php

class Citizen{

 private $data;
 private $fitness;

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

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

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

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

 public function setFitness($newFitness = NULL){
   try{
     if(!is_null($newFitness)){
     $this->fitness = $newFitness;
     }
   }catch(Exception $e){
     die($e->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<strlen($objective);$x++){
       $fitness += abs(ord($objective[$x]) - ord($this->data[$x]));
     }

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

 }

}

?>

One Response and Counting...

  • Bitacoras.com

    September 1st 2009

    Información Bitacoras.com…

    Valora en Bitacoras.com: 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ét…..