Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



miércoles, 12 de diciembre de 2012

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)


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:
 (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)