miércoles, 7 de marzo de 2012

Algoritmo genético



Introducción

Explicas sobre el problema
El algoritmo genético sirve cuando hay combinaciones, y tu quieres maximizar o minimizar algo y hay ciertos límites entonces se van generando combinaciones posibles  y luego las combinaciones se intercambian con valores de otras combinaciones, y asi se da la cruza después de varias cruzas, se supone que quedan combinaciones casi optimas



Objetivos

Que el objetivo es de encontrar el máximo o el mínimo sin sobrepasarse  de las restricciones



Justificación

Se  podría usar para mejorar las condiciones de vida  mejorando los  genes, tratando de eliminar las enfermedades genéticas, en la rama de la ciencia de la biogenética y en la medicina.





Algoritmo





El programa de algoritmo genético era originalmente hacer un mejor combinación de los genes y así si mejorar la raza y saber en cuanto tiempo nos llevaría hacer esto, y saber en momento los genes mutarían.

Pero como la idea no estaba bien ideada para la programación fue cambiada por un programa que juntara  armas para obtener una mejor arma usando el algoritmo genetico.

  • En el primer día fue la planeacion para realizar el código, en la que tuve que investigar que armas debería usar, cuantas armas, también tuve que ver otro programas que hacian lo que yo deseaba hacer con mi programa, y hice un diagrama de flujo para tener mas claras mis ideas.
  • En el segundo y tercer día fue la realización de codigo usanndo como base el diagrama que habia hecho con anterioridad  y crear las funciones del programa
  • en el cuarto, quinto, sexto y  septimo fue la corrección del programa uno de los errores fue por el uso de los punteros, y estar mal definido la forma de juntar las armas, t errores de sintaxis. 
link del programa:
http://www.youtube.com/watch?v=sPk7n5BwCgM&feature=youtube_gdata

Código :
//algoritmo genetico
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define prand (rand()%11)
#define d_rand ((rand()%4)+1)
#define a_rand(i) ((rand()%(i-10))+10)

enum {PISTOLA,ESCOPETA,METRALLETA,ESPECIAL};
char tipo_nom[4][11] = {"PISTOLA","ESCOPETA","METRALLETA","ESPECIAL"};
int fuerza_max[4]={90,120,70,140};
short int rango_max[4]={20,16,8,40};
short int municion_max[4]={20,100,12,500};
typedef struct arma_s{
       short int tipo;//las variedad de las armas
       int fuerza;
       short int rango;//metros
       //short int recarga;//manual, semiautomatica ,etc..
       short int municion;//la capacidad de la arma para cargar balas
} arma_t;

int new_arma(arma_t *arma,short int _tipo,int _fuerza, short int _rango,short int _municion);
int print_arma(arma_t *arma1, arma_t *arma2, arma_t *fuz);
int unir_arma(arma_t *arma1, arma_t *arma2, arma_t *fuz){
    srand(time(NULL));
    fuz->tipo=prand>5?arma1->tipo:arma2->tipo;
    if(fuz->tipo == arma1->tipo)
      new_arma(fuz, arma1->tipo, arma1->fuerza, arma1->rango, arma1->municion);
    else
      new_arma(fuz, arma2->tipo, arma2->fuerza, arma2->rango, arma2->municion);
    
    int aumento = prand;
    if(aumento > 4)
      fuz->fuerza +=a_rand(fuz->fuerza);
    else
      fuz->fuerza -=fuz->fuerza*d_rand/10;
      
    aumento = prand;
    if(aumento > 4)
      fuz->municion +=a_rand(fuz->municion);
    else
      fuz->municion -=fuz->municion*d_rand/10;
      
    aumento = prand;
    if(aumento > 4)
      fuz->rango +=a_rand(fuz->rango);
    else
      fuz->rango -=fuz->rango*d_rand/10;
    
    if(fuz->fuerza>fuerza_max[fuz->tipo]||fuz->rango>rango_max[fuz->tipo]||fuz->municion >municion_max[fuz->tipo])
      fuz->tipo = ESPECIAL;
      
        printf("Arma 1\t\t\t\t|Arma2\nTipo: %s\t\t\t|Tipo: %s\n",tipo_nom[arma1->tipo], tipo_nom[arma2->tipo]);
    printf("Fuerza: %d\t\t\t|Fuerza: %d\nRango: %d m.\t\t\t|Rango: %d m.\n", arma1->fuerza, arma2->fuerza, arma1->rango, arma2->rango);
    printf("Municion: %d balas\t\t|Municion: %d balas\t\t\t\n", arma1->municion, arma2->municion);
    printf("\n\nArma Fucionada\nTipo: %s\nFuerza: %d\nRango:%d metros\nMunicion: %d balas", tipo_nom[fuz->tipo], fuz->fuerza, fuz->rango, fuz->municion);
    
    return 0;
}
int main(){
    arma_t a1,a2, mix;
    a1.fuerza=90;
    a1.municion=20;
    a1.rango=20;
    a1.tipo=PISTOLA;
    
    a2.fuerza=100;
    a2.municion=6;
    a2.rango=2;
    a2.tipo=ESCOPETA;
    while(1)
    {
           unir_arma(&a1,&a2,&mix);
           //imprimir
           printf("\n\n");
           getwchar();
    }
    printf("aaa");
    getwchar();
    return 0;
}


int new_arma(arma_t *arma,short int _tipo,int _fuerza, short int _rango,short int _municion){
    arma->tipo=_tipo;
    arma->fuerza=_fuerza;
    arma->rango=_rango;
    arma->municion=_municion;
    if(_fuerza>fuerza_max[_tipo]||_rango>rango_max[_tipo]||_municion >municion_max[_tipo])
      return 1;
    return 0;
    }
int print_arma(arma_t *arma1, arma_t *arma2, arma_t *fuz)
{
    printf("Arma 1\t\t\t|Arma2\nTipo: %s\t\t\t|Tipo: %s\n",tipo_nom[arma1->tipo], tipo_nom[arma2->tipo]);
    printf("Fuerza: %d\t\t\t|Fuerza: %d\nRango: %d m.\t\t\t|Rango: %d m.\n", arma1->fuerza, arma2->fuerza, arma1->rango, arma2->rango);
    printf("Municion: %d balas\t\t\t|Municion: %d balas\t\t\t|\n", arma1->municion, arma2->municion);
    printf("\n\nArma Fucionada\nTipo: %s\nFuerza: %d\nRango:%d metros\nMunicion. %d balas", tipo_nom[fuz->tipo], fuz->fuerza, fuz->rango, fuz->municion);
}