Programar un programa teoricamente inteligente.

Iniciado por andres_5, 23 Enero 2011, 23:51 PM

0 Miembros y 1 Visitante están viendo este tema.

andres_5

Hola, Llevo un tiempo programando mis pequeños programitas, pero nunca he hecho un programa inteligente, como por ejemplo cuando juegas a las cartas contra la maquina, sinceramente me parecia sorprendente esos tipos de programas, aunque se que atras de ese programa inteligente tiene un codigo, con esto no estoy pidiendo un codigo donde lo demuestre, sino el razonamiento que los programadores mas esperimentados usais para darle a la maquina oportunidad de elegir inteligentemente. Con un simple ejemplo, no codeado sino con palabras, me bastaria para resolver mi duda.
Saludos ;)
Algunos de mis proyectos sobre electronica -->
En Mi Canal de Youtube



ABDERRAMAH

#1
Yo no se mucho de esto, pero si se que hay muchos métodos diferentes... El otro día hablaba alguien en le foro sobre la inteligencia artificial en juegos de agedrez, comentó por encima algo de los sistemas neuronales de computación, parecía muy interesante porque según parece el peso de los algoritmos era realmente pequeño. Yo también estoy interesado en el tema, ya que últimamente me he propuesto programar bots (simulaciones robóticas 3d para metaversos), y por ahora tienen muy limitada la capacidad de decision. xD

edit: este es el comentario de sauruxum
CitarEn realidad en los juegos de ajedrez no se programan asi las cosas.
En el concurso de programacion Ehn-Dev que se tuvo en este foro yo presente una aplicacion acerca de las redes neuronales. Estas redes que pueden ser programadas bajo una arquitectura tipo Von Neuman, aunque si es menos eficaz que en su propia arquitectura, tienen la peculiaridad de "aprender" y "asociar" los datos de ingreso relativamente a una salida deseada.
Mi programa era muy simple y como ejemplos dentro de la carpeta deje uno que mediante aprendizaje logra representar la funcion logica XOR y el seno ( aunque con mala presicion ), tambien un ejemplo que identifica patrones visuales. Este uso es el que se le da al ajedrez. Si tienes una matriz de 8x8 ( tablero ) y piezas distribuidas en un cierto modo, mediante el debido aprendizaje el programa mismo es capaz de escojer la jugada que "con mayor probabilidad te llevara a la victoria".

Porque este en especifico requiere tanta memoria? porque debe tener muchos datos temporales a la mano para trabajar velozmente. Me explico un poco con numeros.
Las redes neuronales hacen basicamente multiplicaciones de matrices y una aplicacion bien hecha como la usada en blue deep tiene estas caracteristicas:

Elementos neuronales de entrada:        80
Capas ocultas de elementos:                  5
Elementos en media en la capa oculta: 200
Elementos de salida:                            80

La de tu ordenador:

Elementos neuronales de entrada:        80
Capas ocultas de elementos:                  2
Elementos en media en la capa oculta: 135
Elementos de salida:                            80

Entonces para hacer el calculo debe hacer un numero de multiplicaciones del tipo 80x200x200x200x200x200x80 sin contar lo que ya ocupa en calculo la decodificacion de esta.
Este tipo de aplicaciones funciona de maravilla en un procesador con mas nucleos, pero son muy lentas en un mononucleo.

Respecto a la base de datos de este tipo de aplicaciones: no llega a pesar mas de 100 Kb xD ya que solo contiene una especie de hash de aprendizaje y no cada uno de los movimientos posibles.

Saludos
« Última modificación: 21 Enero 2011, 06:54 por Sauruxum »

Sauruxum

#2
Bueno, tengo unos mesecitos metido en el asunto de la creacion de una AI y espero poder ayudarte.
Lo que yo uso mas frecuentemente para entrenar aplicaciones que tomen una decision "inteligente" son las "redes neuronales multicapa" ( puedes buscarlas en internet por el nombre de multilayer perceptron o MLP, tambien tengo un blog en el que he puesto mi trabajo y algunas traducciones de papers en http://sauruxum.blogspot.com ).
Estas redes no es que sean inteligentes, sino que "aprenden" en base a la "experiencia" ( si, basicamente es asi ). Esto es en caso de una aplicacion como la que presente en el concurso ehn-Dev, crear un archivo con algunos patrones tomados de experiencias pasadas que contienen las entradas ( como en los centros biologicos, muestras de tegido cancerigeno y no-cancerigeno por ejemplo ) y las salidas ( la respuesta: "es o no es cancerigeno" ) y asi estas redes, una vez entrenadas reconocen efectivamente el tipo de tejido que es.
No solo eso, asi como aprenden de la experiencia son capaces de hacer predicciones basados en las condiciones actuales y la experiencia ( son tambien usadas para las predicciones meteorologicas ).

Como ejemplo propio puedo poner algo curioso que me pregunto uno hace poco: como puede tu programa reconocer si es un ave o no? ( no podia ser mas facil el desafio... )
Entonces como es basado en mi programa pues me pongo el problema:

Entrada 1: vuela? ( 1=si, 0=no )
Entrada 2: pone huevos? ( 1=si, 0=no )
Entrada 3: tiene alas? ( 1=si, 0=no )

creo que bastan esos.

Entonces basado en experiencias pasadas ( mas bien logicas a este punto de nuestra existencia xD ) hacemos el archivo de patrones asi:

                  Entradas              Salidas
aguila:           1 1 1                      1
avestruz:        0 1 1                     1
murcielago:    1 0 1                     0
caballo:          0 0 0                     0
pez:               0 1 0                     0

Quedando el archivo de patrones asi:

5
1 1 1
1
0 1 1
1
1 0 1
0
0 0 0
0
0 1 0
0

Lo guardamos y entrenamos la red...   es posible reconocer correctamente muchas variedades de animales ( incluye el pinguino y el pez volador xD )

En el caso de un juego de cartas primero que todo poner las reglas del juego, y jugar contra una red no entrenada, y hacer el modo que aprenda tus movimientos a medida que juega ( de ahi hay que saber que juego para saber las caracteristicas de la red a usar ). En caso que el jugador sea bueno, la red aprendera bien y sera potente y viceversa. Puedes al paso entrenar una segunda red y decirle: perder esta mal, ganar esta bien ( me suena a un tio xD ) asi no solo jugara bien, sino que intentara ganar. Y puedes entrenar una tercera red que tome desiciones segun las cartas que ya han salido.

Mi programa puede ser infinitamente mejorado, espero poder dedicarle mas tiempo, pero bueno... funciona bastante bien xD

Saludos

andres_5

Muchas Gracias, me ha parecido muy interesante la informacion ;)
Saludos
Algunos de mis proyectos sobre electronica -->
En Mi Canal de Youtube



.:Snifer:.

Bueno mira para eso necesitas un agente inteligente que puede ser tu primera opcion, o la segunda con una red Neuronal que aprende de sus errores.. Y lo mas importante que no se debe de descartar algoritmos geneticos,Encadenamiento de reglas..  o si te gustaria mas en estos dias te puedo pasar informacion.. tengo algunos proyectos que realize en redes neuroanles e inteligencia artificial.

Saludos :P

Ragnarok

Empieza por mirar esto y luego si quieres te recomiendo algo más (también está en español, a la izquierda lo escoges):

http://en.wikipedia.org/wiki/Minimax

Es muy simple para jugar a juegos como las damas o el tic-tac-toe, el ajedrez es más complicado, y aun así esto viene siendo lo que hace deep blue.
No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

dazoverride

andres_5 yo también hice mis programitas y se me planteo los mismo, fue haciendo un programa de hundir la flota en C, que digo y si hago que la "maquina" tire? pues bueno como es un juego simple decidí que eligiera coordenadas aleatorias y no repetitivas, fácil no? XD para mi es como un hola mundo de la inteligencia artificial XD.

El problema esque si quieres hacer un ajedrez este metodo no sirve... pero bueno por algo se empieza! suerte!!
Si reproduces un CD de Microsoft al revés puedes escuchar un mensaje satánico...
Eso no es lo peor... Al derecho te instala windows...

flacc

de hacer un programa para empezar, algo fácil como jugar al gato, lo primero que se me ocurre es dependiendo de las acciones del contrincante calcular en probabilidad la acción mas viable y lógica a ejecutar, luego cuando sea el turno de empezar para la máquina, lo haría siguiendo estrategias predefinidas, aunque la opción de aprender de las jugadas del contrincante no se me ocurre como hacerla... claro que serían miles e líneas de código para programar solo, así que de hacerlo buscaría por lo menos 2 personas mas, para compartir ideas y tener diferentes puntos de vista...saludos