• Viernes 8 de Noviembre de 2024, 23:12

Autor Tema:  Desarrollo De Un Ajedrez  (Leído 6552 veces)

manix

  • Miembro MUY activo
  • ***
  • Mensajes: 203
  • Nacionalidad: cr
    • Ver Perfil
    • http://apuntes.delibertad.com
Desarrollo De Un Ajedrez
« en: Viernes 29 de Febrero de 2008, 06:40 »
0
que tal amigs!!!! tengo una pequena duda.. resulta que estoy por terminar un ajedrez en java (que por cierto esta muy entretenido) y no quiero que esta aplicacion se limite ha juegos humano-humano, sino tambien que el usuario puedo jugar contra la aplicacion. Estuve averiguando al respecto y parece ser que es posible ponerle una mente artificial.  Es aqui donde tengo mi pregunta. Se puede poner mente arificial (es que me suena como de meter unos logaritmos y ya) al ajedrez? de ser asi como seria? porque me gustaria trabajar para lograrlo montar bien tan solo ocupo que me digan como funciona el asunto, si tengo que conseguir un programa o algo. Les agradezco toda la ayuda de antemano que yo se que siempre hay alguien que se las sabe todas!!! espero haberme explicado bien y gracias de nuevo!

Masiosare

  • Miembro MUY activo
  • ***
  • Mensajes: 118
    • Ver Perfil
Re: Desarrollo De Un Ajedrez
« Respuesta #1 en: Miércoles 5 de Marzo de 2008, 02:14 »
0
Para ese caso mas que una mente artificial (red neuronal o algo asi), lo adecuado para este caso seria un Sistema experto. He leido sobre sofware de ajedrez con mentes artificiales con la capacidad de aprender, los cuales fueron capaces de ganarles a campeones de carne y hueso, pero son proyectos demasiado complejos.

Los sistemas expertos no son una simulacion de una mente, no simulan relacion de ideas, aprendizaje, o lenguaje (a menos que su objetivo sea conversar). Los sistemas expertos son algoritmos complicados que tienen procedimientos completos y conocimientos detallados sobre como realizar determinada actividad, por ejemplo, jugar ajedrez. Suena complicado pero puede ser mas facil que programar una mente.

De poder ponerlo si se puede pero requiere de bastante tiempo, y de como no se exactamente como por que es tambien muy complicado, existen lenguajes orientados a la inteligencia artificial como por ejemplo prolog y miranda, pero casi cualquier lenguaje puede servir, sobre todo si se trata de un sistema experto.


http://es.wikipedia.org/wiki/Sistemas_Expertos
El experto es aquel que sabe cada vez más sobre cada vez menos, hasta que sabe competamente todo sobre absolutamente nada.
[size=109]Ley de Murphy[/size]

manix

  • Miembro MUY activo
  • ***
  • Mensajes: 203
  • Nacionalidad: cr
    • Ver Perfil
    • http://apuntes.delibertad.com
Re: Desarrollo De Un Ajedrez
« Respuesta #2 en: Miércoles 5 de Marzo de 2008, 04:45 »
0
gracias por el aporte... estare al tanto de estos sitemas expertos. Y a ver si termino el ajedrez... Gracias!!! ;)

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Desarrollo De Un Ajedrez
« Respuesta #3 en: Martes 22 de Abril de 2008, 23:11 »
0
Efectivamente dotar de inteligencia artificial a tu juego te va a ser complicado.

Sin enmbargo tu primera meta debe ser más que inteligente, que no sea tonto, te explico un poco por encima...

Después de cada movimiento del adversario debes comprobar que la reina-máquina y el rey-máquina estén protegidos, revisando si a uno, 2 o x movimientos secolocaría el adversario en jaque y no pudieras remediarlo... la x debe primeramente ser un número finito y corto o sería muy muy lento cada movimiento...

Antes de mover, procede ahora a la inversa, sería el mismo algoritmo, pero con 1 diferencia y un añadido. Cambian los adversarios y los atacantes. El añadido sería que después de esa comprobación habría que decidir que ficha mover...

De entrada experimenta con dejarle caer en una trampa y que mueva a la trampa (aprovechar el movimiento hacia la ficha más vulnerable) luego de practicar tu mismo con el juego podrás encontrar mejor como evitar caer en una trampa a base de analizar el movimiento hacia la ficha más vulnerable.

Qué ficha mover ???... No lo pongas aleatorio, sería tonto, no inteligente, tampoco eches una ficha adelante, atrás, adelante.. también sería tonto... al menos practica un algoritmo de confusión que no permita al adeversario cual es la táctica empleada...

Puedes en determinadas situaciones tener una pequeña base de datos de 'jugadas resueltas' especialmente cuando sólo hay pocas fichas en el tablero... esto te ayudará a rematar un juego que ha evolucionado bién. Estos pasos por tanto no serían inteligentes sino pasos fijos porque se conoce que la meta sigue justo ese camino establecido.

Por último examina y crea una base de datos de jugadas que no marcó buenas y salieron mal, para no repetirlas, igualmente con las que salieron bién para repetirlas.

Aparte te sería de gran ayuda para simplificar las reglas, dividir las fichas en 2 grupos, fichas de poder y fichas con escaso poder (peones), y cada uno de esos grupos divídelos aún en 2 están implicadas en la jugada actual y los que no están implicados en la jugada actual. Por ejemplo al inicio de la jugada la torre no tiene acceso a jugadas porque está bloqueado por el peón y el alfil, y mientras no se liberen tales piezas seguirá sin estar implicado en una jugada, siempre que la torre enemiga no tenga otra ficha suya delante, esa torre no entra en el juego... Esto te permitirá restringir el diseño de movimientos al no ser necesario analizar posibilidades con fichas que no entran en la jugada actual... naturalmente esto es relativo ya que si quieres analaizar posibilidades a x movimientos hacia adelante, las posiblidades se multiplican y todas las fichas entrarían en juego, sin embargo para empezar no te compliques por caminos que no sabrías a priori resolver.

Luego podrás ir mejorándolo poco a poco... los de IBM (big-blue) también lo van mejorando poco a poco ...

Saludos...
«Ma non troppo»
----> ModoVacaciones = False<----

manix

  • Miembro MUY activo
  • ***
  • Mensajes: 203
  • Nacionalidad: cr
    • Ver Perfil
    • http://apuntes.delibertad.com
Re: Desarrollo De Un Ajedrez
« Respuesta #4 en: Viernes 25 de Abril de 2008, 07:20 »
0
Ok... lo que tengo es lo siguiente:

Citar
Qué ficha mover ???... No lo pongas aleatorio, sería tonto, no inteligente, tampoco eches una ficha adelante, atrás, adelante.. también sería tonto...
Citar
Antes de mover, procede ahora a la inversa, sería el mismo algoritmo, pero con 1 diferencia y un añadido. Cambian los adversarios y los atacantes. El añadido sería que después de esa comprobación habría que decidir que ficha mover...
:exclamation: Estoy seleccionando las 20 mejores piezas y su jugada, luego de esas 20, vuelvo a hacer otro analisis para decidir las mejores (el 20%), para finalizar, selecciono una de esas al azar.

Citar
experimenta con dejarle caer en una trampa y que mueva a la trampa
:exclamation: Si se logra, pero lo que no puedo lograr es como saber cuando hay que hacer un cambio de piezas ("matar un caballo  aunque se te coman el alfil"). Ya que muchas veces cuando jugamos ajedrez es mejor tener un caballo que un alfil o viceversa.

Citar
Puedes en determinadas situaciones tener una pequeña base de datos de 'jugadas resueltas'
Citar
Por último examina y crea una base de datos de jugadas que no marcó buenas y salieron mal, para no repetirlas, igualmente con las que salieron bién para repetirlas.
:exclamation: No habia contado con eso, es una idea excelente, yo se que es muy dificil de implemenar, pero no es una programacion que no sepa hacer

Citar
Aparte te sería de gran ayuda para simplificar las reglas, dividir las fichas en 2 grupos, fichas de poder y fichas con escaso poder (peones), y cada uno de esos grupos divídelos aún en 2 están implicadas en la jugada actual y los que no están implicados en la jugada actual.
:exclamation: Eso estoy tomando en cuenta, de todas formas, cuando se hace la seleccion de las mejores jugadas todas se toman en cuenta ya que puede ser que en las proximas 2-x jugadas esten en una estancia mas fuerte

Citar
Luego podrás ir mejorándolo poco a poco... los de IBM (big-blue) también lo van mejorando poco a poco ...
:exclamation: bueno, primero lo primero, mi meta es terminarlo de la mejor manera, tampoco me quiero apresurar, todo a su tiempo. Voy a estarles informando como voy con el proyecto, mas bien gracias por el aporte, y por favor seria de gran ayuda que tambien pongan consideraciones a evaluar en el ajedrez que todavia no hemos tomado o una mejor sugerencia en los algoritmos.

 ^_^ Saludos!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Desarrollo De Un Ajedrez
« Respuesta #5 en: Lunes 28 de Abril de 2008, 05:16 »
0
iremos por partes para no liarnos..

Citar
Estoy seleccionando las 20 mejores piezas y su jugada, luego de esas 20, vuelvo a hacer otro analisis para decidir las mejores (el 20%), para finalizar, selecciono una de esas al azar
. no selecciones al azar, sólo encaso de que realmente nose te ocurra nada inteligente, siempre hay una acción más inteligente que otra, si no sabemos de entrada cual es más inteligente, entonces aplíqemos una por estadísticas, porqué porque si nos sale mál podremos deducir que la estadística aplicada a tal idea es buena o es mala pero si lo hicimos al azar, nunca podremos saber si será bueno o no en el futuro... luego volvemos a eso de las estadíisticas...

Citar
Si se logra, pero lo que no puedo lograr es como saber cuando hay que hacer un cambio de piezas ("matar un caballo aunque se te coman el alfil"). Ya que muchas veces cuando jugamos ajedrez es mejor tener un caballo que un alfil o viceversa.
'a falta de pan buenas son tortas' . Si no sabes cual pueda ser, usa estadísticas, del tipo cuantas veces se ha movido tal ficha, cuantas veces se moovió hacia atrás, esto no es resolutivo pero tras un rato de partida con varios movimientos, o mejor tras varias partidas, sen pautas del jugador...'prefiere usar los caballos' descubres, entonces piensas... si le como sus caballos es probable que se quede 'cojo'.... por eso valorar que piezas mueve más el adeversario (y tú) te ayuda a sospechar que piezas sabe mover mejor, y cuáles no les gusta arriesgar o bién que no sabe jugar muy bien con ellas. Una decisión basada en estas estadísticas será siempre más positivo para enseñarle que dejarlo al azar. Tambien cosas como tengo 2 alfiles y sólo un caballo yo voy a comerle la reina pero el me comerá la pieza que mate su reina, la duda está en matarla con mi caballo o con mi alfil... en ese caso valora si conviene más tener al menos una peza de cada o 2 del mismo y ninguna del otro...eso siempre podrás echarlo a suerte, pero anotando que se usó... todo a una estadística más general... al finalizar la partida podrás añadir la impresión perdí porque el cabalo que usé para comer la reina dejó un hueco a su alfil y posicionando su otrre me dejó sin salida... entonces puede sacarse enconclusión, no mover el caballo ssin analizar si su alfil y cabalo quedan dispuestos en 2 jugadas ante el rey, en dicho caso usar el alfil en vez del caballo... si guardaste las posiciones de esa jugada crítica, regresa las fichas a dicha posición e intenta ahora con el alfil en vez de con el caballo...



Citar
No habia contado con eso, es una idea excelente, yo se que es muy dificil de implemenar, pero no es una programacion que no sepa hacer
Para hacerlo inteligente hay que ser capaz de recordar cosas, el modo de recordarlas es tenerlas grabadas y calcular cuando sea preciso, ya fuera de juego o no..sin memoria, sin recuerdos, no se puede mejorar... imagina que tratas de llegar a un pueblo te indican un camino y al llegar acierto punto hay varios cruces de caminos complicados, descubres que las indicaciones que te dieron no fueron muy buenas,  y decides que volver atrás a pedir nuevamente indicaciones es bastante más largo, entonces decidas explorar las posibilidades... avanzas por cada uno hasta que veas que está cortado o que es otro pueblo, entonces vuelves y recorres otro camino, pero ...oh... si no tienes memoria de los caminos ya recorridos, podrías repetir hasta 500 veces un camino, pero si recuerdas ya haberlo andado y ver que no tenía salida, sólo debes fijarte en las que te falta por recorrer.

Citar
Voy a estarles informando como voy con el proyecto, mas bien gracias por el aporte, y por favor seria de gran ayuda que tambien pongan consideraciones a evaluar en el ajedrez que todavia no hemos tomado o una mejor sugerencia en los algoritmos.
puésestará bien que informes mucha gente después de resolver alguna duda ya nunca vuelve por el foro.

Sería bueno que señales que consideraciones te parecen oportunas y se puede hablar de ello. Los algoritmos son muy específicos, los de IBM, los tienen al punto de ser algoritmos para jugadas únicas y más o menos famosas, ese nivel de detalle en realidad no es inteligente, ya que no 'crea' una jugada en base a decisiones sino en base a una tabla de 'preguntas-respuestas', eso si el nivel de detalle es muy elevado.

Hace años diseñe un juego con reglas diferentes al ajedrez pero que al caso también movía fichas y acabé dejándolo por aburrimiento porque aunque se comportaba bien yo siempre le ganaba, cuando tu lo has creado parece natural ganarlo porque conoces los algoritmos, tu los has diseñado, pero esto no es verdad, si es inteligente, lo cierto es que lo diseñes tú o no, una máquina puede hacer más cálculos en menos tiempo que tu de este tipo y por tanto se supone que debe originar al menos un centnarde posibles soluciones antes de mover una ficha, tu mentalmente  puedes elaborar 7 ú 8 jugadas diferentes ó bien 2 ó 3 movimentos con 4 ó 5 jugadas hacia adelante, osea unas 15-20 movimientos, más allá hay que estar muy entrenado en un juego, e incluso con dudas tu encuentras mejores soluciones que el programa.

Yo por ejemplo usaba un algoritmo que llamaba de sombra... el tablero cada casilla del tablero tenía una valoración que iba cambiando a cada jugada, donde estaban las fichas enemigas sólo por ello tenían un valor positivo , donde estaban mis fichas tenían un valor negativo, casilla sin ocupar tenían también su valor,  el modo en que valoraba las casillas era complejo pues sufrió muchas modificaciones pero te cuento lo recuerdo.... la distancia tenía un valor tenía una fórmula para asignar un valor posicional sólo por distanca, tenía otra fórmula para dar valor sólo por casillas vacías entre fichas, tenía otra fórmula para valorar casillas basado en el valor de cada ficha... (en el ajedrez yo les daría valores en base 10... peones 10, alfiles y caballos 100 torres y rey 1000,  reina 10000.) , tenía otra fórmula que valoraba casillas en función del las 8 casillas que le rodeaban (esto es la media de las 8 figuras que rodeaban la ficha), todos estos valores eran sumados y conservaba los valores delos últimos 4 movimientos de ambos jugadores, aparte de esos tenía otro que registraba la diferencia entre los valores de las casillas anteriores a un movimiento y el siguiente, estos valores de las casillas los usaba luego para otmar las decisiones de que ficha mover y hacia donde, debía compensarlo con el valor de las mías... ya que enviar a una ficha 'valientemente' hacia el enemigo sin protección tampoco tiene mucho sentido.

Valorar justamente el sacrificio de las fichas es de lo más difícil, cuando un 'error' da al traste con una estrategia que se venía elaborando, el plan entero se rompe, por eso de último estaba probando sistemas que no reuquieran un plan muy elaborado ni muy largo porque tras ese trabajo si te coemn una ficha clave la jugada es ya imposible, sino jugadas oportunistas y puntuales, hasta que el juego estuviera más avanzado cuando un plan más elaborado pudiera dar sus frutos, cuando hay muchas fichas en 3 movimientos puede cambiar mucho el juego.

bueno corto.....
«Ma non troppo»
----> ModoVacaciones = False<----

hdsk

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Desarrollo De Un Ajedrez
« Respuesta #6 en: Martes 13 de Enero de 2009, 13:56 »
0
Hola,

Creo que vos no deberias analizar las cosas sino que deberias tratar de construir un programa capaz de hacer los analisis por si mismo.

En lo que es la

Hdsk

hdsk

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Desarrollo De Un Ajedrez
« Respuesta #7 en: Martes 13 de Enero de 2009, 14:05 »
0
Hola,

Creo que vos no deberias analizar las cosas sino que deberias tratar de construir un programa capaz de hacer los analisis por si mismo.

En lo que es IA lo que tratamos de hacer siempre es encontrar una función de evaluación para los tableros. Esto seria una función que toma un tablero y te devuelve un valor (entero o real).

Digamos que si tuvieras una funcion de evaluación perfecta para tu problema, tu le darias un tablero y esta te devolveria un valor que indicaria que tan bueno o malo seria el tablero. De esta forma dado un tablero el problema seria encontrar todos los tableros siguientes posibles, evaluarlos con dicha función y quedarte con el que te dio el valor mas grande (o mas chico).

El problema es que no hay forma de saber cual es esa función (la optima) y lo que tenemos son formas de tratar de aproximarnos a ella. Para esto existen varios metodos, personalmente para un juego de tablero me gusta mas que nada QLearning si bien tiene un requerimiento de espacio brutal se puede hacer QLearning utilizando una red neural con lo que no hay requerimientos de espcio y además de eso la función aprende a generalizar mas para otros tableros.

Luego de tener programados los algoritmos o utilizar un paquete que los tenga basta con dejar a la maquina jugar contra si misma un par de dias sin parar y tendras un jugador aceptable. A todo esto te recomiendo un poco de cuidado y aque muchas vees es complejo modelar el problema con una red neuronal y los algoritmos para aplicarla con QLearning son un poco mas complejos a mi gusto.

Hdsk