› Foros › PC › Software libre
Actualizacion:
al fin he terminado la beta 3
K. Ichigo escribió:Ya lo probaré
- El nombre jsudoku puede ser confuso. Me lo iba a bajar con ilusión para ver el código pensando que era Java!
blackgem escribió:Yo hace tiempo vi algun programa de Sudoku... y vi tambien alguno el codigo por la web ^^.
Y lo mas interesante de ellos era que podian crear un sudoku aleatoriamente, podias meter los datos que tu quisieras para crear un sudoku y ademas te los resolvia automaticamente ^^. Perfecto para solucionar esos sudokus que te vienen sin solucion .
Son cosillas que creo yo que seria muy interesante implementar y te lo aconsejo que lo hagas ademas.
jeixon escribió:depronto aalguien me pueda ayudar con algo, deseo poder hacer que el sudoku sea jugable usando las flechas del teclado para ir cambiando de casillas, pero no se como, depronto alguien me pueda dar alguna pista de como programar instrucciones al ejecutar una tecla. no se si esto pueda ser util pero todas las casillas del sudoku son una matriz de controles.
elenur escribió:jeixon escribió:depronto aalguien me pueda ayudar con algo, deseo poder hacer que el sudoku sea jugable usando las flechas del teclado para ir cambiando de casillas, pero no se como, depronto alguien me pueda dar alguna pista de como programar instrucciones al ejecutar una tecla. no se si esto pueda ser util pero todas las casillas del sudoku son una matriz de controles.
En Visual Basic 6 deberías buscar los eventos relacionados con KeyPress y demás, si no recuerdo mal. Después, del argumento que te proporciona el evento obtienes la tecla y demás información.
Si eso no es suficiente, siempre puedes llamar al sistema y hacer otras pifias que hay por ahí en Visual Basic.
En cualquier caso, te hago llegar mi recomendación número 1: Deja Visual Basic xD
nu_kru escribió:Por si quieres codigo para resolver sudokus, yo hice uno en ada, y con backtracking y es bastante sencillo.
nu_kru escribió:Te lo adjunto en el mensaje, juas tiene 4 años las practicas... que rapido pasa el tiempo y que "bonito" es ada comparado con otros lenguajes... xdd
Saludos.
BRoLy_KReT escribió:Yo hace años hice un sudoku en Haskell utilizando wxhaskell para la parte gráfica y generaba y resolvía sudokus de forma automática. Para ello utilicé la estrategia de backtracking a la hora de resolverlo y funcionaba perfecto, yo creo que es la mejor elección para este problema.
Salu2
jeixon escribió:aunque no conozco el ada, algo se debe entender
ya me pondre a analizarlo
use integer;@A=split//,<>;sub R{for$i(0..80){next if$A[$i];my%t=map{$_/9
==$i/9||$_%9==$i%9||$_/27==$i/27&&$_%9/3==$i%9/3?$A[$_]:0=>1}0..80;R($A[
$i]=$_)for grep{!$t{$_}}1..9;return$A[$i]=0}die@A}R
zheo escribió:En realidad utilizar backtracking únicamente no la mejor manera de resolver un sudoku. Es la manera más sencilla, pero no la correcta.
zheo escribió:Ten en cuenta que backtracking te encontrará una solución de varias potenciales, pero hay que considerar que un sudoku bien construido debería ser resoluble de forma lógica, no probando soluciones a ver si una encaja.
elenur escribió:¿Por qué no es correcta? Devuelve las soluciones consumiendo un tiempo/memoria aceptables, por tanto, es correcta.
elenur escribió:El Backtracking resuelve problemas de una forma perfectamente lógica, y además encuentra todas las soluciones, no sólo una. Además, no va probando soluciones "a ver si una encaja", sino que amplía soluciones parciales aceptables hasta llegar a una solución completa. No es lo mismo que la fuerza bruta a palo seco.
elenur escribió:El añadir heurísticas puede mejorar (o no, depende de para qué) el algoritmo.
zheo escribió:elenur escribió:¿Por qué no es correcta? Devuelve las soluciones consumiendo un tiempo/memoria aceptables, por tanto, es correcta.
No porque las soluciones pueden ser correctas o no. Un sudoku bien planteado tiene una única solución, que sería la que una persona podría resolver aplicando reglas lógicas. Pero usando backtracking puedes encontrar VARIAS soluciones que cumplan las restricciones del problema del sudoku. Si sólo una es la correcta y encuentras varias, es que algo no es del todo correcto.
zheo escribió:Backtracking va aplicando valores al dominio del problema hasta que se encuentra con una situación donde las condiciones no se cumplen. En ese momento se produce la poda -que es donde está la mejora sobre fuerza bruta- por lo que esa rama no se examina y se vuelve a un punto anterior. Es decir, que va "probando valores" a ver cual encaja, como bien dije.
zheo escribió:Pero ¿decisiones lógicas? No. Backtracking per se no tiene decisiones lógicas, simplemente desecha las soluciones no válidas en cuanto se las encuentra.
zheo escribió:Cuando me refería a que encuentra una solución me refería a que en este caso concreto sueles parar cuando encuentras una solución válida. En cualquier caso, aunque calcules todas las soluciones sigues en las mismas, ya que si tienes 2+ no sabes cual es la solución real del sudoku.
zheo escribió:elenur escribió:El añadir heurísticas puede mejorar (o no, depende de para qué) el algoritmo.
En este caso te aseguro que compensa. Como pasar de cerca de minuto a dos segundos resolviendo.
elenur escribió:Falso. Un sudoku "bien planteado" debería tener sólo una solución precisamente para que se pueda resolver a mano sin emplear prueba y error con las "reglas lógicas" que comentas. Sin embargo, para cualquier sudoku que tenga una sóla solución, el backtracking sólo encontraría esa solución, no "varias".
elenur escribió:Claro: Va ampliando soluciones, pero no prueba soluciones completas sin más.
elenur escribió:Eso es una decisión lógica. La prueba y error es un método perfectamente lógico. Véase "demostración por reducción al absurdo".
La solución real del Sudoku es la misma que la del backtracking, porque sólo hay una. De hecho, te digo que si el sudoku tuviera más de una solución, entonces es cuando a mano no se puede resolver sin prueba y error y es a lo que llamamos un sudoku "mal preparado".
elenur escribió:El Sudoku 9*9 con un par de heurísticas se puede resolver el orden de segundos (o décimas), es verdad, pero, ¿lo has intentado con otros tamaños?
Hay heurísticas "obvias" que parecen ser expléndidas y empleándolas en un 16*16 no mejoran el tiempo de ejecución.
zheo escribió:En este caso te aseguro que compensa. Como pasar de cerca de minuto a dos segundos resolviendo.
zheo escribió:elenur escribió:Falso. Un sudoku "bien planteado" debería tener sólo una solución precisamente para que se pueda resolver a mano sin emplear prueba y error con las "reglas lógicas" que comentas. Sin embargo, para cualquier sudoku que tenga una sóla solución, el backtracking sólo encontraría esa solución, no "varias".
Estas totalmente equivocado. Y creo que es culpa mía por no precisar qué es "solución única".
"Solución única" significa que dados los valores de partida, sólo hay una única combinación de valores que cumplen las restricciones del problema del sudoku. En ese caso si, backtracking te devuelve la única solución posible.
Pero un sudoku bien formado NO REQUIERE DE SOLUCIÓN única. Un sudoku bien formado implica que siguiendo las reglas de resolución de un sudoku, es posible encontrar una solución válida. Es lo que yo denominé "solución única con reglas lógicas". Por tanto para un sudoku con solución única siguiendo la reglas lógicas resuelto usando backtracking obtendrás varias soluciones correctas entre las cuales estará la válida.
¿Te crees que me iban a permitir hacer una práctica de resolver sudokus en IA entregado un simple backtraking?
elenur escribió:Claro: Va ampliando soluciones, pero no prueba soluciones completas sin más.
¿Dije yo algún momento que backtracking aplicara soluciones completas sin mas? Citame en ese caso.
elenur escribió:Eso es una decisión lógica. La prueba y error es un método perfectamente lógico. Véase "demostración por reducción al absurdo".
¿Qué tiene que ver la demostración por reducción al absurdo con esto? ¿Ahora en una demostración por reducción al absurdo aplicas prueba y error para encontrar una contradicción? O me quieres decir que para resolver por reducción al absurdo simplemente hay que aplicar valores al dominio hasta encontrar una contradicción.
Venga por favor.
Un sudoku es un problema lógico. Backtracking por si solo no aplica ninguna regla lógica ni de decisión a la hora de aplicar los valores a cada casilla (ahí entrarían las heurísticas), así que podrías llegar a una solución que cumple las restricciones del problema del sudoku con los valores de partida, pero no a la solución que obtendría una persona, como ya expliqué arriba
¿Y tú has probado? Porque te das mucha prisa en tirar balones fuera. ¿A qué viene ahora pruebas en un sudoku 16X16? Creía que tratábamos de sudokus clásicos.
elenur escribió:Es tu opinión. Cuando me tocó hacerlo a mí, consulté con un experto en sudokus y según él, consideraba un sudoku correcto cuando se podía resolver utilizando exclusivamente las "reglas lógicas".
Sin embargo tú y él estáis equivocados por una razón sencilla pero poderosa: yo he encontrado una contradicción. Ahora mismo no lo tengo a mano, pero en un libro de sudokus, el primero que aparece lo resolví a mano (muy sencillo) sin ningún problema. Y resuelto con backtracking simple sin ningún típo de heurística: tachán! Una solución completamente distinta a la obtenida a mano. Por cierto el libro traía las soluciones, no vaya a ser que ahora se insinúe que no se resolver sudokus.elenur escribió: Y esto, según él (y yo cuando lo comprobé) sólo ocurre cuando sólo hay una solución.
elenur escribió:Lo cual es lo lógico y esperable, porque si existe más de una solución nunca podrás inferir ningún número más (sin descartar otros), puesto que habría al menos dos posibilidades válidas en alguna casilla.
elenur escribió:¿Por qué te enciendes? No me refería a nada de eso. Simplemente, la reducción al absurdo supone cierta la negación de la conclusión y avanza a partir de ahí hasta intentar encontrar una contradicción. De la misma forma, puedes entender que la fuerza bruta tiene varias ramas posibles y supone que la que toma es la válida y avanza a partir de ahí hasta que comprueba si una solución completa es tal.
Ambos métodos son perfectamente lógicos, obviamente.
Y dale, que no. Tienes un error de base: Un puzzle tiene las mismas soluciones lo resuelvas como lo resuelvas. Una solución del problema del Sudoku está perfectamente especificada: Cumple X restricciones, y si encuentras unos datos que satisfacen dichas restricciones, entonces ES solución.
El método que emplees para obtener una solución no importa una mierda para decidir si algo es solución o no.
Nadie dice que el "problema del Sudoku" deba resolverse sólo con una serie de reglas lógicas y si no no es solución. De hecho, cada persona aplica las reglas lógicas que le da la gana para resolverlo, según su experiencia y habilidad.
Y sí, el algoritmo del Sudoku no aplica reglas "inteligentes", pero es completamente lógico a pesar de ello: Si tú vas ampliando una solución parcial con opciones válidas, entonces encuentras sólo soluciones y además, todas ellas.
[/quote]Sí, probé unas cuantas aparentemente "buenas" y "obvias" precisamente para ver que las heurísticas pueden ser beneficiosas o no según el tamaño del problema (en la práctica con implementaciones reales).
En cualquier caso, no sé qué mosca te ha picado, simplemente lo decía como detalle informativo, no para desprestigiar tus heurísticas (que ni sé cuáles son porque no he leído el fichero) y que no he puesto en duda que sean de lo mejorcito.