Tuesday, May 11, 2010

Biokterii Fuzzy Logic

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.

Video

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.