Blog del curso de Inteligencia Computacional del semestre Enero-Mayo del 2010 en el Tecnológico de Monterrey, Campus Estado de México.
Por medio de este blog irán documentando y compartiendo su trabajo en el curso.
En una playa, están naciendo varias tortugas, y para sobrevivir, deben de llegar al mar lo más rápido posible, sin embargo, puede que haya depredadores cerca queriendo alimentarse de ellas, lo que las hace más vulnerables. Las tortugas nacen a cierta distancia del mar, además de nacer con cierta velocidad propia y cierta resistencia a los ataques de los depredadores.
Descripción de la actividad que aprenderá el agente
Dadas las características de cada tortuga (su distancia al mar, si hay o no depredador cerca, su velocidad y su resistencia), el agente debe de decidir si una tortuga se salva sin ayuda de nadie, si es necesaria la intervención humana para salvarla o si es imposible salvarla.
Se tiene la incertidumbre de en qué circunstancias la tortuga debe de ser salvada, ya que estando lejos tiene menos probabilidades de sobrevivir que estando cerca, o si hay muchos depredadores, y en muchas ocasiones, algunas personas pueden pensar diferente con diferentes cantidades de estos datos.
Descripción de los conjuntos difusos
Basándonos en encuestas realizadas a nuestros compañeros de grupo donde creían que cada partición empezaba y terminaba, y de información sobre las tortugas obtenida en la red, llegamos a los siguientes conjuntos difusos:
Resistencia: Baja: 0% à 50% Media: 30% à 90% Alta: 70% à 100% Distancia: Cerca: 0m à 5m Media: 3m à 15m Lejos: 10m à 30m Velocidad: Lento: 0 cm/s à 7 cm/s Normal: 3 cm/s à 15 cm/s Rápido: 13 cm/s à 20 cm/s Depredador: Pocos: 0 à 3 Algunos: 2 à 10 Muchos: 8 à 20 Se decidió utilizar el método de Mandani como método de inferencia, y se crearon 8 reglas difusas sobre las cuales trabajar:
Muchos Depredadores & Distancia corta à Sálvalo Distancia Corta & (Ningún ó algunos Depredadores) à Se salva sólo Distancia media & Ningún depredador à Se salva sólo Distancia media & (Pocos ó muchos depredadores) à Sálvalo Distancia lejana & Ningún depredador àSe salva sólo Velocidad corta & Resistencia baja à Se muere Velocidad media & Resistencia baja à Se muere Velocidad alta & (Distancia corta & baja) à Se salva sólo
Como proceso de defusión, se usó el centro de masa de la región difusa del resultado. Para utilizar el programa, sólo mueva las barras de Distancia, depredadores, resistencia y velocidad.
Conclusiones
Creemos que los sistemas de lógica difusa son muy útiles para dar soluciones a problemas en los que no se tiene una certeza absoluta de los límites en los que se encuentran las variables de entrada, o cuando estas no pueden ser perfectamente divididas en grupos. También creemos que para implementar este tipo de programas, es de mucha ayuda utilizar sistemas orientados a matemáticas, como son Mathematica o Mathlab.
Breve descripción del medio ambiente. El ambiente en el que nos encontramos es Biokterii, que se desarrolla en el interior de un ser vivo, en esta ocasión el virus debe atacar a todas las células que vayan apareciendo, sin embargo, en esta ocasión las células cuentan con un escudo y puntos de vida dificultando así la tarea del virus.
Descripción detallada del problema difuso a resolver. El objetivo del virus es derrotar y absorber a todas las células posibles, pero las células cuentan con un escudo de determinada fuerza y se encuentran a diferentes distancias del virus. El objetivo es que el virus elimine el escudo de la célula y la atraiga para poder comérsela, sin embargo, si el ataque es muy débil la célula conservará su escudo y atacará al virus, si el ataque es muy fuerte la célula morirá. Algo similar sucede con la atracción, si es muy débil, el virus quedará muy lejos y absorberá muy poca energía, si la atracción es muy fuerte, la célula se pasará y el virus no podrá absorberla. Descripción detallada y justificada de: i. Particiones difusas. Las particiones difusas que estamos utilizando son la distancia y la fuerza del escudo, esto se debe a que el virus deber realizar un ataque muy preciso, para esto debe calcular su fuerza en base a que tan lejos y que tan fuerte es el escudo de la célula que está atacando. Dichas variables no son binarias, sino se ajustan mucho mejor a un sistema difuso, para poder determinar la distancia y la fuerza del escudo de la célula enemiga.
ii. Conjuntos difusos Decidimos dividir los conjuntos difusos en 5 partes. El de distancia lo dividimos en too_close (muy cerca), close (cerca), medium (media distancia), far (lejos), too_far (muy lejos). La definición formal de este conjunto utilizando FCL es la siguiente:
FUZZIFY distance TERM too_close := (0,0) (50,1) (100,0); TERM close := (50,0) (150,1) (250,0); TERM medium := (200,0) (300,1) (400,0); TERM far := (350,0) (450, 1) (550,0); TERM too_far := (500,0) (600,1); END_FUZZIFY
El conjunto de escudo se dividió en fragile (frágil), soft (suave), medium (medio), hard (duro), very_hard (muy duro). La definición formal de este conjunto es el siguiente:
FUZZIFY shield TERM fragile := (0,0) (25,1) (40,0); TERM soft := (30,0) (50,1) (65,0); TERM medium := (55,0) (75,1) (90,0); TERM hard := (80,0) (100, 1) (115,0); TERM very_hard := (105,0) (125,1); END_FUZZIFY
iii. Método de inferencia utilizado. Para este proyecto decidimos utilizar las reglas de if-else de Mamdani, de esta forma utilizamos las reglas y las consecuencias de forma lingüística, lo que implica que necesite un método de defusificación. A continuación se presentan las reglas utilizadas para el evento de atracción:
RULE 1: IF distance IS too_close THEN power IS close; RULE 2: IF distance IS close THEN power IS near; RULE 3: IF distance IS medium THEN power IS middle; RULE 4: IF distance IS far THEN power IS far; RULE 5: IF distance IS too_far THEN power IS very_far;
Para el ataque se usan las siguientes reglas:
RULE 1: IF distance IS too_close AND shield IS fragile THEN power IS puny; RULE 2: IF distance IS too_close AND shield IS soft THEN power IS puny; RULE 3: IF distance IS too_close AND shield IS medium THEN power IS puny; RULE 4: IF distance IS too_close AND shield IS hard THEN power IS puny; RULE 5: IF distance IS too_close AND shield IS very_hard THEN power IS weak; RULE 6: IF distance IS close AND shield IS fragile THEN power IS puny; RULE 7: IF distance IS close AND shield IS soft THEN power IS puny; RULE 8: IF distance IS close AND shield IS medium THEN power IS puny; RULE 9: IF distance IS close AND shield IS hard THEN power IS weak; RULE 10: IF distance IS close AND shield IS very_hard THEN power IS weak; RULE 11: IF distance IS medium AND shield IS fragile THEN power IS puny; RULE 12: IF distance IS medium AND shield IS soft THEN power IS weak; RULE 13: IF distance IS medium AND shield IS medium THEN power IS weak; RULE 14: IF distance IS medium AND shield IS hard THEN power IS weak; RULE 15: IF distance IS medium AND shield IS very_hard THEN power IS normal; RULE 16: IF distance IS far AND shield IS fragile THEN power IS puny; RULE 17: IF distance IS far AND shield IS soft THEN power IS weak; RULE 18: IF distance IS far AND shield IS medium THEN power IS normal; RULE 19: IF distance IS far AND shield IS hard THEN power IS normal; RULE 20: IF distance IS far AND shield IS very_hard THEN power IS strong; RULE 21: IF distance IS too_far AND shield IS fragile THEN power IS puny; RULE 22: IF distance IS too_far AND shield IS soft THEN power IS weak; RULE 23: IF distance IS too_far AND shield IS medium THEN power IS normal; RULE 24: IF distance IS too_far AND shield IS hard THEN power IS strong; RULE 25: IF distance IS too_far AND shield IS very_hard THEN power IS very_strong;
Ejemplos Ejemplo 1
Podemos ver al Virus Fuzzy que se encuentra con una célula a una distancia de 329 y con un shield de 51, a través de la lógica difusa podemos saber que una distancia de 329 es medium (media distancia) y que un shield de 51 es soft (suave). Dentro de la declaración del FCL y dentro del conjunto de reglas podemos observar que: RULE 12: IF distance IS medium AND shield IS soft THEN power IS weak; A lo que el virus responde con un ataque de tipo Weak. Para la defusión de este argumento se utiliza la siguiente instrucción: TERM weak := 1;
Con esto el virus ahora sabe que debe realizar un ataque de tipo 1. En esta ocasión dicho ataque funcionó muy bien pues dejo a la célula con 3 puntos de shield,y aunque su objetivo era dejarlo con 0, la fuerza de su ataque fue muy preciso.
Ejemplo 2
Para esta ocasión el virus Fuzzy encuentra una célula que se encuentra a 346 puntos de distancia y cuenta con un shield de 120, gracias a la lógica difusa sabemos que el 346 es una distancia medium (media distancia) y 120 es un shield de tipo very_hard (muy duro) por lo tanto siguiendo la regla: RULE 15: IF distance IS medium AND shield IS very_hard THEN power IS normal; Por lo tanto el ataque debe ser de tipo normal TERM normal := 2; Con esto el virus debe hacer un ataque de tipo 2, que otra vez es muy efectivo pues dejó a la célula con 0 de shield y con 98 de vida, osea que se le pasó la mano solo por dos puntos, una decisión bastante buena.
Instructivo para poder hacer preguntas en línea a su programa. Realmente es un poco difícil dar instrucciones en línea tal cual al programa, pues uno de los valores, el shield, se crea al azar al momento de que la célula es creada, sin embargo, la otra variable, la distancia, sí es posible de modificar, sólo basta con arrastrar la célula a la posición deseada. Con esto se esta modificando la distancia a la que el virus y la célula se encuentran y el virus debe adaptarse, calcular esa nueva distancia y decidir en base a la lejanía con la que se encuentra.
Conclusiones después de la programación. La lógica difusa no se podía aplicar bien al proyecto original de Biokterii por lo que se tuvieron que hacer algunas modificaciones para poder modelar el problema utilizando este método. Una vez que se adaptó bien el problema, pudimos decidir los dos factores que se medirían, el ataque y la atracción. Tomando en cuenta la distancia y el escudo de la célula se puede determinar un tipo de ataque muy preciso, que aunque pocas veces falla, casi siempre es muy preciso y hace muy bien su trabajo. De igual forma la atracción es muy precisa, dejando a la célula muy cerca del virus. Algo que nos sirvió mucho es el virus de control, que realiza acciones random y al compararlo con el virus Fuzzy nos damos cuenta que este último le toma una gran ventaja. Como prueba de control lo dejamos correr 10 minutos, el virus Fuzzy logró una puntuación de poco más de 2000 puntos, mientras que el virus random solo logró 200 puntos. Realmente es muy interesante este tema de la lógica difusa pues se adapta mejor a la forma en que son las cosas en la realidad, ni blancas ni negras, sino de un variante gris; ahora tenemos una perspectiva diferente para resolver cierto tipos de problemas que requieren este tipo de razonamiento.
Equipo 2 José Iván Ferrer Ruiz A00468659 Daniel Salas Fukutake A00468938 José A. Ugalde Del R. A01161507
a. Breve descripción del medio ambiente.
Para este proyecto usamos RoboCup Soccer Server, RoboCup Soccer Monitor y las bibliotecas de Fuzzy Logic (pyfuzzy) para escribir un programa que maneje un agente de RoboCup que tome decisiones usando Lógica Difusa.
b. Descripción detallada del problema difuso a resolver.
Los agentes de RoboCup son capaces de avanzar (dash) para ir por el balón, y ya que están junto a él lo pueden patear (kick). Esas dos acciones usan un parámetro de poder entre 0 y 100. Por ejemplo, si un agente realiza la acción dash(100), avanzará hacia adelante una cantidad de centímetros y con dash(0) no avanzará. Al usar kick(100) pateará el balón lo más lejos posible mientras que con kick(0) no lo moverá. Cuando un agente usa dash, entre más grande sea el número de poder más stamina gasta, y cuando se queda sin stamina no se puede mover hasta que se recupere lo suficiente. Los problemas que encontramos son haceer que el agente decida:
qué valor de poder usar al avanzar cuando está cerca del balón para no pasarse y perderlo.
qué valor de poder usar al avanzar para no cansarse tan rápido.
qué valor de poder usar al patear para meter gol o avanzar con el balón.
Ejemplos: Si el balón está lejos del agente, el agente debe ir lo más rápido posible, pero si tiene poca stamina, debería bajar su velocidad para no cansarse. Si el agente tiene el balón y se encuentra lejos de la portería, debería patearla con poca fuerza para llevarla más cerca de la portería sin perderla.
c. Particiones difusas, Conjuntos difusos y Método de inferencia utilizado.
Las particiones que utilizamos para avanzar no fueron las mismas que usamos para las decisiones de patear. Para avanzar usamos una partición de la distancia entre el agente y el balón con 3 conjuntos: cerca, medio y lejos. Para el valor de poder de dash usamos otra partición con los conjuntos débil, normal y fuerte. Para patear el balón hacia la portería usamos una partición de la distancia entre el agente y la portería con 3 conjuntos: cerca, medio y lejos. Para el valor de poder de kick usamos otra partición con los conjuntos débil, normal y fuerte, similar al de dash pero con otros tamaños de conjuntos.
El método de inferencia que usamos fue el de centro de gravedad (COG) con las siguientes reglas para acercarse al balón: RULE 1 : IF distance IS close THEN power IS weak; RULE 2 : IF distance IS mid AND stamina IS low THEN power IS null; RULE 3 : IF distance IS mid AND stamina IS half THEN power IS weak; RULE 4 : IF distance IS mid AND stamina IS full THEN power IS normal; RULE 5 : IF distance IS far AND stamina IS low THEN power IS null; RULE 6 : IF distance IS far AND stamina IS half THEN power IS weak; RULE 7 : IF distance IS far AND stamina IS full THEN power IS strong;
y las siguientes reglas para patear el balón: RULE 1 : IF distance IS close THEN power IS strong; RULE 2 : IF distance IS mid THEN power IS normal; RULE 3 : IF distance IS far THEN power IS weak;
d. Al menos dos ejemplos de la manera en que su sistema resuelve una pregunta (realiza una inferencia difusa).
Cuando un agente ve el balón y se dirige hacia él: usa su distancia hacia la pelota y su stamina como inputs para calcular el poder que debe usar con dash self.input['distance'] = self.fm[onto.BALL_DIST] self.input['stamina'] = self.bm[onto.SENSE_BODY]['stamina'][0] self.approach_system.calculate(self.input, self.output) una vez calculado el poder, lo recorta por si se pasa de 100 y lo usa como parámetro en dash power = self.output['power'] self.dash(100 if power > 100 else power)
Cuando un agente tiene el balón y lo va a patear hacia la portería: calcula la distancia entre él y la portería contraria , utilizándolos como inputs para calcular el poder que usará en kick x, y = self.fm[onto.PLAYER_POSITION] ogx, ogy = self.fm[onto.GOAL_OPP] ang = get_abs_ang(x, y, ogx, ogy) ang = trim_ang(ang - self.fm[onto.BODY_ANGLE]) self.input['distance'] = pythagoras(ogx, ogy, x, y) self.kick_system.calculate(self.input, self.output) una vez calculado power, lo usa como parámetro power = self.output['power'] self.kick(power = power, angle = ang)
e. Instructivo para poder hacer preguntas en línea a su programa.
Para hacer preguntas al programa, se pueden usar 2 métodos:
1.Abrir el simulador y el monitor de Robocup y desde una terminal correr el script de python llamado “reactiveplayer.py”. Para iniciar un partido se usa Ctrl+K o click derecho -> Play On. Durante el partido los agentes imprimen en la terminal los valores de distancia y stamina, aparte del valor de power que calculan usando lógica difusa.
2.Sin abrir RoboCup, se puede abrir editar el archivo de python llamado “fcltest.py”. En la línea 10 (i = {'distance' : 1.5, 'stamina' : 0.0}) se pueden editar los valores de distancia y stamina que tendría un agente a la hora de tomar la decisión, y al correr el mismo archivo en consola, se imprime el valor calculado.
f. Conclusiones después de la programación.
Como conclusión podemos asegurar que la lógica difusa funciona bien en el contexto de agentes reactivos de robocup, permitiendo a los agentes tomar decisiones para jugar de una manera más eficiente, tardándose más en cansarse y conservando el balón a la hora de dirigirse a meter gol a la portería contraria. Se podría aplicar en la toma de más decisiones como el ángulo que debe voltear para contrarrestar la inercia, y sólo se tendrían que hacer modificaciones pequeñas en el programa.
Cada partida de StarCraft se realiza en un mapa que el usuario escoge. Dicho mapa varía a otros en dimensiones, recursos disponibles, ubicación de los recursos y topología. Al comienzo de cada partida, el jugador no tiene información sobre el mapa. El jugador tiene un rango de visión el cual determina que tanto puede ver del mapa respecto a cierta posición. Una vez que el jugador ha pasado por un punto en el mapa, todo lo descubra permanecerá visible hasta el fin del partida.
El objetivo de Starcraft es derrotar a tu enemigo a través de la destrucción de todas sus unidades. Esto requiere que uno tenga una estrategia adecuada al atacar al contrincante. Esta estrategia dependerá básicamente de la fuerza del oponente (salud de cada unidad) y también la fuerza propia. Así es como estas variables cambian en cada batalla y determinarán que estrategia es buena en cada situación. Un ejemplo sería que si el enemigo se encuentra débil, lo más conveniente sería ser muy agresivo en nuestro ataque, mientras que si se encuentra fuerte, disminuir la agresividad en la estrategia.
Para este proyecto utilizamos una unidad llamada Ghost, la cual es capaz de utilizar una habilidad que se llama “Cloak” y consiste en hacer invisible a la unidad, por lo que los enemigos no pueden hacerle ningún daño, sin embargo el Ghost es capaz de moverse o incluso atacar a otras unidades.
Lógica Difusa
El objetivo del algoritmo es encontrar el nivel adecuado de agresividad en la estrategia de ataque de nuestro Ghost para cualquier escenario de batalla.
Variables
Las variables que recibe el algoritmo son la salud de nuestra unidad y la del oponente. Estas variables son números enteros con un rango de 0 a 100.
Conjuntos Difusos
Se definen al dividir la salud de una unidad en 3 rangos:
·Casi muerto - 0 a 50
·Buena – 14 a 83
·Excelente – 50 a 100
Particiones Difusas
Las particiones difusas se crean usando las variables del problema. Debido a que la salud propia y la del oponente se cuantifican de la misma manera, sólo necesitamos definir las particiones difusas una vez:
Salud
La salida del algoritmo nos dirá la agresividad que deberemos tomar dependiendo de las variables de entrada. Las particiones de la variable de salida se encuentran de la siguiente manera:
Método de Inferencia
Para la implementación de nuestro algoritmo se utilizó el método de inferencia de Mamdani, los operadores lógicos de Zadeh y Mean of Maximum (MoM) para defuzzification.
Se definió el siguiente conjunto de reglas (IF salud propia AND salud del oponente THEN acción ):
·IF Buena AND Buena THEN Cloack
·IF Buena AND Excelente THEN Cloak
·IF Buena AND Casi muerto THEN Atacar
·IF Excelente AND Buena THEN Atacar
·IF Excelente AND Excelente THEN Atacar
·IF Excelente AND Casi muerto THEN Atacar
·IF Casi muerto AND Excelente THEN Huir
·IF Casi muerto AND Buena THEN Huir
·IF Casi muerto AND Casi muerto THEN Cloak
Ejemplos
Ejemplo 1:
·Salud de la unidad propia: 13.
·Salud de la unidad enemiga: 60.
·Proceso
oFuzzification:
§Salud de unidad propia = 13 à salud de unidad propia = casi muerto.
§Salud de unidad enemiga = 60 à salud de unidad enemiga = Excelente o buena.
oRegla 1 que aplica:
§IF Casi muerto AND Excelente THEN Huir
oRegla 2 que aplica:
§IF Casi muerto AND Buena THEN Huir
oDefuzzification:
§MoM = 1/1 = 1
·Resultado:
oLa unidad huye de la batalla.
Proceso
Ejemplo 2
Salud de la unidad propia: 40 Salud de la unidad enemiga: 90
oFuzzification:
§Salud de unidad propia=40 àsalud de unidad propia = casi muerto/buena
§Salud de unidad enemiga= 90 àsalud de unidad enemiga = excelente.
oRegla 1 que aplica:
§IF Casi muerto AND Excelente THEN Huir à Fuerza: .3 (approx)
oRegla 2 que aplica:
§IF Buena AND Excelente THEN Cloak à Fuerza .8 (approx)
oDefuzzification:
§Sumatoria de máximos = (2/1) =2
§La sumatoria indica que la unidad utilizará Cloak.
·Resultado:
oEn este caso, la unidad propia se hará invisible, pues la regla “IF Buena AND Excelente THEN Cloak” resultó tener mayor fuerza que la primera regla “IF Casi muerto AND Excelente THEN Huir”.
Debido a que nosotros usamos BWAPI para modelar nuestros algoritmos en StarCraft, no es posible realizar preguntas a nuestro programa. Lo que se puede hacer es cambiar las variables de Health de nuestro Ghost y del enemigo para poder probar diferentes escenarios.
Conclusiones
Lógica difusa es una herramienta sumamente poderosa y relativamente fácil de implementar. El algoritmo es sumamente intuitivo, debido a que nosotros como seres humanos también ponderamos con que fuerza tomamos una decisión. En este caso nos permitió modelar la misma estrategia que utilizaríamos si nosotros jugáramos con el Ghost.
Un triangulo formado por números aleatorios. Cada nivel tiene uno más que el anterior. Iniciando de la punta de la pirámide y eligiendo un camino hacia abajo pasando por cualquiera de los dos números inmediatos inferiores hasta llegar al último nivel (la base del triangulo).
2) b. Descripción detallada del problema de optimización – da al menos un ejemplo en donde se vea por qué es un problema de optimización.
El problema de optimización consiste en obtener las suma máxima al recorrer el triangulo hacia abajo.
Ej.1)
59
73 41
52 40 09
26 53 06 34
10 51 87 86 81
61 95 66 57 25 68
369
1)c. Solución planteada al problema utilizando la técnica de Algoritmos Genéticos. Describe con detalle cada elemento del planteamiento:
·Codificación del cromosoma. De un ejemplo de un patrón al decodificarlo.
oLas direcciones tomadas al recorrer el triangulo en un arreglo que indica en cada nivel si se fue a la derecha o a la izquierda.
[IDIDD]
·Función a minimizar o maximizar. ¿Cómo se calcula?
oLa suma de todos los números en el camino es la función a maximizar.
·Forma de hacer la reproducción – ejemplo utilizando tu codificación.
oLa reproducción la hacemos utilizando el “Residuo de muestreo estocástico sin reemplazo”. Es decir que la parte entera indica el numero de muestras de esos individuos y la parte fraccional son probabilidades para elegir a los individuos restantes.
Antes
Expected Value
[IDDDI]
1.203
[DIDDI]
1.760
[IIDDI]
0.890
[DDDDD]
0.256
Después
[IDDDI]
[DIDDI]
[IIDDI]
[DIDDI]
·Forma de hacer el crossover – ejemplo utilizando tu codificación.
oSe elige una pareja al azar y luego se elige un lugar de cruzamiento para ambos. Luego se intercambian los cromosomas a partir de ese lugar hasta el final.
[IDD|DD]
[DDDIDI]
[IDDDI]
[DDDDD]
·Forma de hacer la mutación – ejemplo utilizando tu codificación.
oLa mutación es simplemente la posibilidad de que al ocurrir el cruzamiento cambien 0 o más valores de todo el cromosoma. La probabilidad de la mutación es de 5/1000.
Antes del cruzamiento: [IDDDD]
Después del cruzamiento: [IDDII]
1)vi. Ejemplo de una generación de 4 elementos en la población.
El Triangulo inicial
59
73 41
52 40 09
26 53 06 34
10 51 87 86 81
61 95 66 57 25 68
a.Población inicial.
Fitness
Probability
Expected
[IIDDI]
390
0.3
1.2
[DDIDD]
226
0.174
0.696
[IIIID]
315
0.242
0.968
[IDIDD]
369
0.284
1.136
Total
1300
1
4
b.Población seleccionada para la reproducción.
[IIDDI]
[IDIDD]
[IIIID]
[IIIID]
c.Población después del cruzamiento.
[IIDID]
[IDIID]
[IIIDD]
[IIIDI]
d.Población después de la mutación.
Fitness
Probability
Expected
[DIDID]
290
0.233
0.932
[IDIID]
342
0.275
1.100
[DIDDD]
257
0.206
0.824
[IIIDI]
356
0.286
1.164
Total
1245
1
4
d.Estadísticas del promedio de la población, elemento mayor (cantidad y fitness), elemento menor (cantidad y fitness), número de veces que se realizó una mutación y un cruzamiento.
Elemento mayor: [IIIDI] 356
Elemento menor: [DIDDD] 257
Numero de mutaciones: 3
Numero de cruzamientos: 5
e. Video
1)f. Conclusiones
La programación del algoritmo genético fue en esencia sencilla y los resultados muy buenos. Se pudo observar que este tipo de algoritmos para la resolución de problemas son bastante rápidos. Pero para su buen uso se tienen que seleccionar problemas adecuados.