Ver Mensaje Individual
  #45 (permalink)  
Antiguo 06/10/2008, 14:49
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 10 meses
Puntos: 260
Sonrisa Respuesta: Segunda competencia para programadores

Cita:
Iniciado por blackwind Ver Mensaje
Hola hackmanC, felicidades por tu proyecto.
Gracias !

Cita:
Iniciado por blackwind Ver Mensaje
Mi unica gran queja, es que tu algoritmo para resolverlo es bastante pobre (es una critica constructiva), el de 3x3 lo probe un par de veces, y y no siempre se tardaba lo mismo, y a veces solo tenia que mover las 2 piezas de abajo hacia la izquierda y movia otras que no tenia caso, lo cual me hace suponer que es a prueba y error.
No hay problema. .

Realmente el algoritmo no es a prueba y error; cada movimiento lo calcula en base a muchos factores; (mira la clase Cerebro().Resolver(), especialmente la función encontrarMejorPosicion() y encontrarMejorMovimiento()); pero sí tienes mucha razón que es un algoritmo deficiente en algunos aspectos.

Es deficiente, por que no revisa si la pieza ya está en su lugar antes de comenzar a intentar resolverlo. Por ejemplo si la pieza número 8 ya está puesta en su lugar, ya no debería intentar resolverla; pero él prueba ir a la posición más cercana del 8 y para eso ya realizó muchos movimientos innecesarios. Y otros casos parecidos (en algunos casos si lo hace otras veces no, dependiendo de algunos factores).

Creo que le hace falta optimización.
Se gana exactitud, pero se pierde legibilidad del código (se vuelve demasiado complejo).

Cita:
Iniciado por blackwind Ver Mensaje
El de 10x10 se llevo casi 9 minutos en resolverlo, 9!!!
Lo resolviste con la opción 'animar' activada. Para resolver el de 10x10 utiliza aproximadamente 3,400 movimientos, y hace una pausa de 125 milisegundos entre cada uno.

3400 * 125 = 425000 milisegundos / 1000 = 425 segundos / 60 = 7 minutos. + overhead.

Más el overhead de hacer el paint(), etc. Sin la opción 'animar' activada lo resuelve mucho más rápido, en un procesador de mediana velocidad, en un Intel Dual Core 2.8 Ghz., lo resuelve en 1.2 segundos (sin animación).

La opción 'animar' la puedes desactivar en cualquier momento, inclusive cuando lo está resolviendo o desordenando.

Cita:
Iniciado por blackwind Ver Mensaje
El buen funcionamiento en los videojuegos es basico, y ahi tuviste una gran falla. En mi muy particular punto de vista, si alguien viene con un algoritmo que resuelva el nxn de una manera claramente superior, aun cuando su programa fuera en modo texto, y sin esa documentacion, el deberia ganar.
Creo que tiene un funcionamiento bueno, por que no falla. (O por lo menos aceptable, puesto que no tira ninguna excepción). Mi objetivo no era que lo resolviera con la menor cantidad de movimientos posible, ni que fuera el más rápido. (No estaba dentro de las reglas del juego iniciales). De otra forma lo hubiera realizado en C o Assembler.

También de esta forma provee un margen de error, que permite al jugador ganarle a la PC algunas veces. Creo que cualquiera de los participantes u otros programadores de foros del web, pueden mejorar ese código; creo que mi objetivo no era ganar; lo disfrute mucho.

Cita:
Iniciado por blackwind Ver Mensaje
No lo tomes a mal, mi intencion fue dar una opinion lo mas objetiva posible.
No hay problema, realmente es intersante leer la mayor cantidad de comentarios. Y creo que lo podría haber realizado mucho mejor, pero ... eso es otra historia. Mi objetivo no era ganar, sino competir ... y como siempre, tratar de impresionarme a mi mismo.



Cita:
Iniciado por Shiryu_Libra Ver Mensaje
bueno HackMan muy interesante... asi hasta ganas de jugar dan para resolver el jueguito
Gracias, (y eso que las imágenes de prueba no fueron publicadas)