Skip to content

Instantly share code, notes, and snippets.

@ikarius6
Created June 24, 2016 20:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ikarius6/cb0476898019b49f91acfad3d43373d1 to your computer and use it in GitHub Desktop.
Save ikarius6/cb0476898019b49f91acfad3d43373d1 to your computer and use it in GitHub Desktop.
Algoritmo evolutivo sencillo en PHP - Mr.Jack
<!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