Created
June 24, 2016 20:56
-
-
Save ikarius6/cb0476898019b49f91acfad3d43373d1 to your computer and use it in GitHub Desktop.
Algoritmo evolutivo sencillo en PHP - Mr.Jack
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<meta charset="UTF-8"> | |
<h1>Algoritmo evolutivo sencillo en PHP - Mr.Jack</h1><hr/> | |
<?php | |
$objetivo = array(1,2,3,4,5); | |
$poblacion = array(); | |
function generar_poblacion( $individuo_base = null ){ | |
global $poblacion; | |
if(empty($individuo_base)){ | |
for($i=0; $i < 10; $i++){ | |
$individuo = array(); | |
for($j=0; $j < 5; $j++){ | |
array_push( $individuo, mt_rand(1,20) ); | |
} | |
array_push( $poblacion, $individuo ); | |
} | |
}else{ | |
reproduccion( $individuo_base ); | |
mezcla(); | |
mutacion(); | |
} | |
} | |
function mutacion(){ | |
global $poblacion; | |
foreach($poblacion as $i_ind => $individuo){ | |
foreach($individuo as $i_gen=>$gen){ | |
if( mt_rand(1,10) > 9 ){ //10% de mutación | |
$individuo[$i_gen] = mt_rand(1,20); | |
} | |
} | |
$poblacion[$i_ind] = $individuo; | |
} | |
} | |
function mezcla(){ | |
//mezclar los individuos de la poblacion | |
//TODO: flojera | |
} | |
function evaluacion(){ | |
global $poblacion, $objetivo; | |
$calificaciones = array(); | |
foreach($poblacion as $i=>$individuo){ | |
foreach( $objetivo as $key_gen_exitoso=>$gen_exitoso ){ | |
$key_gen_encontrado = array_search( $gen_exitoso, $individuo); | |
if( $key_gen_encontrado !== false ){ | |
if( !array_key_exists( $i, $calificaciones)){ | |
$calificaciones[$i] = 0; | |
} | |
$calificaciones[$i] = $calificaciones[$i] + 2; //tiene un gen exitoso +2 | |
if( $key_gen_exitoso === $key_gen_encontrado ){ | |
$calificaciones[$i] = $calificaciones[$i] + 5; //su gen exitoso esta en la posicion correcta +5 | |
} | |
} | |
} | |
} | |
return seleccion( $calificaciones ); | |
} | |
function seleccion( $calificaciones ){ | |
global $poblacion; | |
$max = 0; | |
$imax = null; | |
$calificacion = null; | |
foreach($calificaciones as $i_calificacion => $calificacion){ | |
if( $calificacion >= $max ){ | |
$max = $calificacion; | |
$imax = $i_calificacion; | |
} | |
} | |
if( isset($imax) && array_key_exists( $imax, $poblacion ) ){ | |
return $poblacion[$imax]; | |
}else{ | |
if( count( $poblacion ) ){ | |
return $poblacion[0]; | |
}else{ | |
return null; | |
} | |
} | |
} | |
function reproduccion( $individuo ){ | |
global $poblacion; | |
$poblacion = array(); | |
for($i=0; $i<10; $i++){ | |
$hijo = array(); | |
for( $j=0; $j<5; $j++ ){ | |
if( mt_rand(1,10) > 7 ){ //30% de heredar genes exactos | |
$hijo[$j] = $individuo[$j]; | |
}else{ | |
$gen_hijo = $individuo[ mt_rand(0, count($individuo) - 1)]; //hereda genes al azar | |
array_push( $hijo, $gen_hijo ); | |
} | |
} | |
array_push( $poblacion, $hijo ); | |
} | |
} | |
function evolucion( $generaciones ){ | |
global $poblacion, $objetivo; | |
echo "<h1>A $generaciones generaciones</h1>"; | |
echo "<h1>Objetivo:</h1><pre>"; | |
print_r( $objetivo ); | |
echo "</pre>"; | |
for( $generacion = 1; $generacion <= $generaciones; $generacion++){ | |
echo "<h1>Generacion #$generacion</h1>"; | |
$individuo = evaluacion(); | |
if( $individuo === $objetivo ){ | |
echo "<p>Individuo perfecto:<pre>"; | |
print_r( $individuo ); | |
echo "</pre></p>"; | |
echo "<p>Población:<pre>"; | |
print_r( $poblacion ); | |
echo "</pre></p>"; | |
break; | |
}else{ | |
echo "<p>Más Calificado:<pre>"; | |
print_r( $individuo ); | |
echo "</pre></p>"; | |
//para ver cada generación completa | |
//echo "<p>Población:<pre>"; | |
//print_r( $poblacion ); | |
//echo "</pre></p>"; | |
} | |
generar_poblacion( $individuo ); | |
} | |
} | |
evolucion(1000); //A 1000 generaciones |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment