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:



Mostrando entradas con la etiqueta inteligencia artificial. Mostrar todas las entradas
Mostrando entradas con la etiqueta inteligencia artificial. Mostrar todas las entradas

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)






lunes, 3 de diciembre de 2012

Máquina De Estados Finitos, aplicadas a juegos

Máquina De Estados Finitos, aplicadas a juegos:

Hormigas



Leyendo el libro de  AI for Game Developers, encontré un ejemplo sencillo de máquina de estados finitos ( finite state machine ) en C, y lo he adaptado, ampliado y añadido el modo gráfico con gambas3.

Según el siguiente esquema, cada hormiga trata de recoger granos llevarlo a su hormiguero, naciendo otra hormiga,  va beber agua y luego continua en la búsqueda de grano.




Este "comportamiento" se almacena en la clase "IA_Entity".

Aquí podéis ver una captura del programa en funcionamiento:




Código fuente de descarga: enlace

Támbien os dejo un pequeño video




Fuentes:
AI for Game Developers By David M Bourg, Glenn Seemann

Máquinas de estado infinito: http://www.etnassoft.com/biblioteca/maquinas-de-estados-finitos/

sábado, 1 de diciembre de 2012

Control de Personajes I.A. en juegos tipo Tycoon

  I.A. en juegos tipo Tycoon

Control de Personajes


Por ahora, solo es una prueba, de ver como funcionan las clases y se relacionan entre ellas, y desarrollar la "inteligencia artificial".   Me ha basado en el documento del juego Tycoon Universidad (Enlace)

Actualmente solo se puede cambiar el precio de las clases, y contratar a mas profesores, y podemos ver el saldo que nos queda.

La parte gráfica, solo muestra datos de los profesores y los alumnos.

Siguendo la explicación de Diseño de IA en juego tipo Tycoon, he realizado el código fuento, aqui podeis ver una captura de pantalla:



Y este es el código fuente: ControlPersonajes.0.0.1.tar.gz




I.A.: Sistemas Basados en Reglas

Inteligencia Artificial

Sistemas Basados en Reglas


Leyendo estos apuntes de Césari Matilde (enlace para descargalos), he visto un ejemplo sobre un nudo ferroviario (pag 25), con sus vías y semáforos, donde se aplica un sistema basado en reglas para el encendido (verde) y apagado (rojo) de semáforos según el estado de las vias (ocupadas ó libres).

He hecho un programa, para resolverlo, siguiendo el ejemplo.
Las reglas  ha aplicar y el código en gambas lo podeis ver en esta captura de pantalla:
Reglas del problema y la conversión en código usando clases

La aplicación funcionando:

Estado de semáforos, con las vías s1,s2 y s5 ocupadas.

Código fuente: descarga

Lo interesante del código es el uso de las clases reglas, para almacenar la información que tenemos del nudo ferroviario, y lo sencillo que resulta aplicar las reclas y "actualizar" el sistema de señales, ya que al usar objetos, todo esta referenciado. El programa está orientado a objetos (vias, señales superiores e inferiores y reglas)




Evaluar Expresiones: Notacion Polaca Inversa (RPN), aplicación para gambas

JAN LUKASIEWICZ 

Evaluar Expresiones:

Notación Polaca Inversa

RPN





 Gracias a un compañero del foro de gambas-es.org, Shell, he conocido esta web: http://latecladeescape.com/algoritmos , donde explican una serie de algoritmos, entre ellos el de la notacion polaca inversa, creada por JAN LUKASIEWICZ



El ejemplo que pone la web esta escrito en C#, y lo he pasado a gambas, creando esta aplicación:



Lo que más me ha gustado, además de darle un uso práctico a una pila, ver como se gestionan los distintos tipos de errores que pueden contener la expresión que le pasemos a evaluar.

Codigo fuente: descarga

Nota:
Para evaluar expresiones, gambas tiene la clase gb.eval, que la podemos usar para evaluar expresiones normales.


Public Sub Main()
Dim Context As New Collection
Context["X"] = "23"
Context["a"] = "2"
Print Eval("a*X+(34-2)", Context)
End

Fuente: http://latecladeescape.com/algoritmos/1125-evaluacion-de-expresiones-aritmeticas-en-notacion-polaca-inversa

Inteligencia Artifical: Prever el movimiento del contrario


Inteligencia Artificial:
Prever el movimiento del contrario
Juego de Karate


Este es un ejemplo que encontré en el libro IA FOR GAMEDEVOLOPERS, (en la página 301), 


que lo podeis encontrar aqui.


Trata del siguiente problema:
En un juego de lucha, tenemos varios movimientos o golpes (por ejemplo: puñetazo, patada baja, patada alta, etc..) y queremos hacer un algoritmo que "prevea" el movimiento del jugador humano, así nuestra inteligencia artificial, podrá tomar las medidas oportunas, por ejemplo movimientos de defensa (paso atrás) o de contraataque.


La primera forma de hacerlo que se me ocurre,  sería usar probabilidades. Si tuviésemos 3 opciones, las probabilidades que salgan sería de 1/3 (33%)


Pero se puede aplicar un método para que mientras se juegue, el programa aprenda que tipos de "patrones" de movimiento usa el jugador humano y así poder tomar las decisiones oportunas para rechazar el ataque.


El ejemplo se centra en el estudio de las jugadas y predecir cual será el próximo movimiento del jugador humano.


¿como lo hace?

Usando reglas del tipo: If  A y B then C

Se crea una tabla de reglas con las combinaciones de dos movimientos (antecedentes A y B) y el tercero como resultado (consecuente C).

El jugador humano va realizando movimientos, el programa compara lo realizado con las reglas que tiene almacenada, y las que se cumple, las pondera (peso) de manera positiva. De esta manera "aprende" de los patrones de movimientos que hace el jugador humano y cuales son los que usa, según la ponderación o peso de la regla, puede prever el próximo movimiento del jugador humano.


Aqui podeis ver una captura del programa:



Descarga del código fuente en gambas: descarga tar.gz















viernes, 26 de octubre de 2012

Mi primer juego de IA en Gambas3: Damas Inglesas Checkers

 Mi primer juego de Inteligencia Artificial en Gambas3

Damas Inglesas o Checkers

Aplicando el algoritmo MiniMax


Os traigo aqui mi último programa, se trata de un juego de damas inglesas, cuidado porque hay muchos juegos derivados de las damas, y las reglas son muy distintas.

El programa que he realizado se basa en un programa escrito en SmallBasic por Ken Goldberg ( codigo fuente original ). Aunque en principio me parecio fácil, he tardado varias semanas ya hay diferencias entre como se tratan las listas en SmallBasic y en  Gambas3, teniendo que usara clases, para poder "traducir a Gambas" el programa.

En el programa original (y en la versión de gambas) se podia jugar entre jugadores humanos o diversos niveles de I.A.

Le he añadido varias mejoras:
- Se pueden editar las piezas del tablero, para crear diversas situaciones a analizar
- Guardar la partida y recuperarla.
- Ver como se ha desarrollado la partida con los tipicos botones de adelante y atras.
- Configuraciones: colores del tablero y distintos tipos de piezas.

Para que veas la diferencia de como queda, os dejo un pantallazo de como es la version en SmallBasic y en Gambas3




He hecho un pequeño video de como funciona:



Para más información:

http://damasinglesas.blogspot.com.es/




lunes, 13 de agosto de 2012

Ejemplo de uso de Arbol Binario: El juego de Preguntas y Respuestas


Árbol Binario:
Preguntas y Respuestas


Os traigo en esta ocasión un ejemplo de uso de árbol binario, en gambas 3.2.

Se trata del conocido juego Preguntas/Respuestas.  Donde el programa intenta adivinar la cosa o animal que piensas haciéndote preguntas, y dándote la posible respuesta.  Y sino, "aprenderá" para que la próxima vez sea capaz de responderte correctamente.




También es capaz de mostrarte, los datos, en forma de gráfico, para que veas como se están "estructurando" las preguntas y respuestas

Enlace de descarga:

Nota:
Para representar los gráfico, debes de tener instalado el programa  graphviz 
vease la entrada de http://jsbsan.blogspot.com.es/2012/07/dotgambas-diagramas-de-tus-programas.html

Aqui os dejo un video para que veais como se usa:


Fuentes:
http://www.graphviz.org/Home.php
http://www.gulic.org/almacen/httlaclwp/chap20.htm