Logica Difusa: Usándola en la IA de juegos
LOGICA DIFUSA
USÁNDOLA EN LA IA DE JUEGOS:
VALORACIÓN DE AMENAZAS
En el libro de AI for Game Developers
, hay un capitulo dedicado al uso de la lógica difusa en la inteligencia artificial de juegos.
He creado un módulo de funciones con los distintas funciones de permanencia (Grade, ReverseGrade, Triangular y Trapezoidal) y funciones lógicas (Or, And, Not) para poder reutilizarlas en cualquier programa. (ver al final del articulo enlace de descarga del ejemplo)
He creado un módulo de funciones con los distintas funciones de permanencia (Grade, ReverseGrade, Triangular y Trapezoidal) y funciones lógicas (Or, And, Not) para poder reutilizarlas en cualquier programa. (ver al final del articulo enlace de descarga del ejemplo)
Además he pasado el siguiente ejemplo a Gambas3:
El ejemplo trata de valorar una fuerza enemiga, sabiendo su número (muy pequeño/pequeño/moderado/grande). Este es el conjunto difuso que tenemos predefinido:
Así podremos conocer su nivel de amenaza, viendo la siguiente tabla predefinida, dándole una clasificación de Baja/Media/Alta:
Y sabiendo los valores de Bajo/Medio/Alta de la fuerza, haremos una media aritmética para calcular la fuerza de respuesta:
-->
(nota 1)
y su distancia (cerca, media, lejos) a nosotros, siendo este el conjunto difuso predefinido:
(nota 2)
Así podremos conocer su nivel de amenaza, viendo la siguiente tabla predefinida, dándole una clasificación de Baja/Media/Alta:
(nota 3)
Para dar una respuesta con un número de fuerzas necesarias para nuestra defensa (ndeploy), tenemos esta tabla de el nivel de amenaza y un valor de salida:Y sabiendo los valores de Bajo/Medio/Alta de la fuerza, haremos una media aritmética para calcular la fuerza de respuesta:
ndeploy = (mLowR * mlowData + mMediumR * mMediumData + mHighR *mHighData) / (mLowR + mMediumR + mHighR)
La variable ndeploy, nos define el numero de fuerzas necesarias.
Aquí tenéis una captura del ejemplo:
¿como sería el código?
Para nota 1 y 2 (conjunto difuso predefinidos): -->
'distancia
mclose = MFunDi.FuzzyTriangle(valueboxHexes.value, -30.0, 0.0, 30.0)
mMedium = MFunDi.FuzzyTrapezoid(valueboxHexes.value, 10.0, 30.0, 50.0, 70.0)
mFar = MFunDi.FuzzyGrade(valueboxHexes.value, 50.0, 70.0)
'tamaño
mTiny = MFunDi.FuzzyTriangle(ValueBoxUnits.value, -10.0, 0.0, 10.0)
mSmall = MFunDi.FuzzyTrapezoid(ValueBoxUnits.value, 2.5, 10.0, 15.0, 20.0)
mModerate = MFunDi.FuzzyTrapezoid(ValueBoxUnits.value, 15.0, 20.0, 25.0,30.0)
mLarge = MFunDi.FuzzyGrade(ValueBoxUnits.value, 25.0, 30.0)
Para nota 3 (tabla de nivel de amenaza) :
mLowR =MFunDi.FuzzyOr(MFunDi.FuzzyOr(MFunDi.FuzzyOr(MFunDi.FuzzyAND(mMedium, mTiny), MFunDi.FuzzyAND(mMedium, mSmall)), MFunDi.FuzzyOr(MFunDi.FuzzyAND(mfar, mTiny), MFunDi.FuzzyAND(mfar, mSmall))), MFunDi.FuzzyAND(mfar, mModerate))
mMediumR = MFunDi.FuzzyOr(MFunDi.FuzzyOr(MFunDi.FuzzyAND(mClose, mTiny), MFunDi.FuzzyAND(mModerate, mMedium)), MFunDi.FuzzyAND(mlarge, mFar))
mHighR =MFunDi.FuzzyOr(MFunDi.FuzzyOr(MFunDi.FuzzyOr(MFunDi.FuzzyAND(mClose, mSmall), MFunDi.FuzzyAND(mClose, mModerate)), MFunDi.FuzzyAND(mClose, mLarge)), MFunDi.FuzzyAND(mLarge, mMedium))
Os dejo aqui el enlace de descarga del ejemplo que lleva incluido el modulo de funciones de lógica difusa "MFundi": Enlace de descarga
Nota:
Gráficas realizada con PlotDrop (frontend de gnuplot)
Fuente: http://jsbsan.blogspot.com.es/2012/12/logica-difusa-usandola-en-la-ia-de.html
No hay comentarios:
Publicar un comentario