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 2009Informació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…..