[proyecto] jsudoku beta 3 -actualizado- (visual basic)

Actualizacion:
al fin he terminado la beta 3 [sonrisa]


bueno, este es mi primer proyecto libre, si te gustan los sudokus puede que te guste este proyecto, es bastante sencillo, pues apenas estoy empezando en este cuento de la programación, pero la idea es hacerlo lo mejor posible, y ir aprendiendo, el nombre jsudoku es provisional.

esta es la pantalla de bienvenida

Imagen
incluye varios sudokus precargados, por categorías (3 de cada categoría), 3 sudokus especiales para principiantes y el editor de sudokus, donde es posible hacer un sudoku nuevo, útil para llenar sudokus de revistas o periódicos.


asi se ve cuando empiezas

Imagen
tiene un contador de jugadas y uno de tiempo, también tiene botón de pausa* y botón de limpiar(borrador), que limpia las casillas que hallas llenado, ahora tambien muestra el record, y botones para guardar, cargar y volver**

*el boton de pausa ha sido incluido en la version beta 2
** desde la version beta 3


te muestra los errores

Imagen
si cometes un error, te lo muestra inmediatamente, resaltando los numeros repetidos, el color lo puedes elegir.

asi es cuando ganas
Imagen
el fondo cambia de colores, y te dice cuantas jugadas haz hecho y cuanto tiempo te tomo resolverlo

este es el editor
Imagen
en este sudoku vacio, puedes hacer cualquier sudoku para después resolverlo en pantalla. si cometes algún error, te lo muestra para que lo corrijas

pausa
Imagen
asi es cuando pausas el sudoku, el contador para, y un reloj analogico oculta el sudoku.

Ingles
Imagen
para los amigos que no hablan español :P (desde la beta 3)

Eso es lo que lleva el proyecto hasta ahora. tiene la licencia gpl v3, esta escrito bajo visual basic, el proyecto ha sido aceptado por sourceforge.

COSAS A IMPLEMENTAR:
si alguien sabe algo de visual basic quiza me pueda echar una mano.

-encuentra y muestra los numeros repetidos -implementado
-editor (creador) manual de sudokus -implementado
-poder guardar los sudokus creados con el editor y poder cargarlos-implementado
-temporizador -implementado
-contador de jugadas -implementado
-pausar el contador y el juego -implementado
-modos de juego basados en tiempo o jugadas -proximamente
-poder guardar el progreso de un sudoku para continuarlo despues -implementado
-selector de idioma -implementado
-poder usar las flechas para desplazarse entre casillas- implementado
-generador de sudokus
-hacer que busque la solucion a los sudokus

BUGS:

por favor, descargarlo y comenten cualquier error para postearlo aquí

COLABORADORES:

.... nadie aun...

Cambios

beta1
-un nuevo codigo
-algunos errores arreglados
- un contador de movimentos
-un temporizador
-un nuevo tema visual
-diferentes sudokus para resolver
-agregada una funcion que detecta cuando el jugador gana y camia de colores el fondo del sudoku

beta1.1
-corregido un error en el color de los numeros que ocurria despues de ganar un juego

beta2
-el código ha sido limpiado
-cambios en la logica de los algoritmos, para mas eficiencia
-marca como error los ceros (0) o letras
-algunos bugs arreglados
-agregada la funcion de pausa
-agregados algunos botones personalizados
-agregado un reloj análogo, se ve cuando la funciona de pausa esta activada

beta3
-interfaz mas amigable [360º]
-varios fondos a elegir
-selector de idiomas (ingles o español)
-soporte para guardar los sudokus creados con el editor
-soporte para guardar y cargar la partida
-miniteclado en pantalla, ahora no es nesesario el uso del teclado
-desplazamiento entre casillas usando las flechas del teclado
-soporte para tiempo record, para cada sudoku muestra el mejor tiempo, asi como el nombre de quien lo hizo, y en cuantos movimientos


descarga -->http://sourceforge.net/project/showfiles.php?group_id=264707
http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/j/project/je/jeisonsudoku/
http://www.lupaworld.com/home/lupasf.php?do=showgroup&groupid=264707
bueno espero que les halla gustado el proyecto y que me ayuden a mejorarlo
Ya lo probaré ;)

2 consejos:

- Mejora la ortografía (Editar, Herramientas y Ayuda con mayúscula la inicial!)
- El nombre jsudoku puede ser confuso. Me lo iba a bajar con ilusión para ver el código pensando que era Java!
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 XD.

Son cosillas que creo yo que seria muy interesante implementar y te lo aconsejo que lo hagas ademas.
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!

Exacto, lo mismo me ha pasado a mi.
[+risas] mm bueno lo del nombre si dije que es provisional, podrían. sugerir uno!!! XD y lo de la ortografía ya me pongo a corregirlo.

edito: corregido lo de la ortografia, en la beta 2
gracias k. ichigo por el consejo :D

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 XD.

Son cosillas que creo yo que seria muy interesante implementar y te lo aconsejo que lo hagas ademas.


también me parece muy interesante, pero no he encontrado un código fuente que genere y solucione para basarme en este :S, la verdad que no tengo idea de como hacer que lo genere...
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
Yo tengo por ahí un generador de sudokus, que aunque actúa poco menos que por fuerza bruta, intenta que solo haya una solución posible para cada juego. Está hecho en Java, lo buscaré por ahí y ya lo colgaré de algún lado.
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 está baneado por "clon de usuario baneado"
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
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


gracias, ya me leere algun tuto o algun ejemplo de los eventos keypress, me ha sido de ayuda.

y lo de dejar visual basic... si tienes razon XD!, ya me estoy dedicando a c++, pero solo queria dejar bien terminado el proyecto y dejar de lado VB... quiza despues lo pase a gambas ^^
Por si quieres codigo para resolver sudokus, yo hice uno en ada, y con backtracking y es bastante sencillo.
nu_kru escribió:Por si quieres codigo para resolver sudokus, yo hice uno en ada, y con backtracking y es bastante sencillo.


o.O gracias!!! :D me resultaria de gran ayuda
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.

Adjuntos

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.


muchas gracias!

aunque no conozco el ada, algo se debe entender XD
ya me pondre a analizarlo :D
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

En realidad utilizar backtracking únicamente no la mejor manera de resolver un sudoku. Es la manera más sencilla, pero no la correcta.

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.

Yo tuve una práctica de la facultad que lo resolvía como un problema de satisfacción de restricciones. Básicamente era backtracing más heurísticas para acelerar el proceso usando decisiones. En unos cuantos sudokus de prueba los llegaba a resolver sin utilizar backtracking. EN los más complicados ya recurría al mismo, bien porque las reglas no permitían inferir el siguiente número a colocar o bien porque simplemente era la única opción (sudokus diabólicos).
elenur está baneado por "clon de usuario baneado"
jeixon escribió:aunque no conozco el ada, algo se debe entender XD
ya me pondre a analizarlo :D


Aquí tienes una solución en Perl cortita y fácil de entender xDDD

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.


¿Por qué no es correcta? Devuelve las soluciones consumiendo un tiempo/memoria aceptables, por tanto, es 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.


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.

El añadir heurísticas puede mejorar (o no, depende de para qué) el algoritmo.
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.

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.

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.

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.
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.

Adjunto el documento teórico de la práctica. (la imagen en el doc está muy comprimida para poder subirlo, pero es lo de menos)


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. :)

Adjuntos

Sudoku CSP.pdf (44.6 KB)

Sudoku como Problema de Satisfacción de Restricciones
elenur está baneado por "clon de usuario baneado"
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.


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".

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.


Claro: Va ampliando soluciones, pero no prueba soluciones completas sin más.

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.


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".

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.


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".

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. :)


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.
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.

Vamos, que lo comprobé empíricamente con libros de sudokus, y obteniendo varias soluciones correctas (cumplian las reglas de sudoku) pero distinta de la válida y que obtenías siguiendo las reglas lógicas. Y consultado con mi profesora de IA (muy aficionada a los sudokus) me lo confirmó . ¿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.

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".

No. Haz la prueba coño. Es un segundo pillar un libro de sudokus.

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

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.

¿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.
A lo mejor se te pasó un detallito que especifiqué:
zheo escribió:En este caso te aseguro que compensa. Como pasar de cerca de minuto a dos segundos resolviendo. :)


Ahí tienes mi pdf con las heurísticas, prueba si quieres si mejoran o no el tiempo de ejecución con sudokus del tamaño que quieras.
elenur está baneado por "clon de usuario baneado"
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.


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". Y esto, según él (y yo cuando lo comprobé) sólo ocurre cuando sólo hay una solución.

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.

¿Te crees que me iban a permitir hacer una práctica de resolver sudokus en IA entregado un simple backtraking?


¿Y esto qué tiene que ver?

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.


Aquí tienes: "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."

Entendí que te referías a soluciones completas. A mí si me describen un algoritmo así, y me preguntan si se está hablando de fuerza bruta o de backtracking, obviamente digo que se trata de fuerza bruta.

En cualquier caso, no sé por qué estás tan exaltado, simplemente quería aclararlo.

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.


¿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.

¿Entiendes ahora la similitud a la que hacía referencia?

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 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.

¿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.


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.

Relájate que tienes los humos muy voluminosos : )
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".

Exacto, reglas lógicas. De nuevo, backtracking por si sólo no aplica ninguna de las reglas lógicas usadas para resolver un sudoku, por muy lógico que a ti te parezca el algoritmo.

elenur escribió: Y esto, según él (y yo cuando lo comprobé) sólo ocurre cuando sólo hay una solución.
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ó: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.

Lo primero esos sudokus existen: Sudokus diabólicos.
Lo segundo, y suponiendo sudokus no diabólicos, efectivamente la única solución LOGICA de un sudoku BIEN FORMADO es ir infiriendo números a partir de los iniciales. Ahora dime: dados unos números iniciales, que tienen solución lógica, es decir, partimos de un sudoku bien formado, ¿es IMPOSIBLE que exista otro conjunto de números que son solución (cumplen las restricciones del problema) pero que es una solución NO es inferible a traves de reglas lógicas? La respuesta es SI.


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.

Reducción al absurdo es suponer cierta una hipótesis A basada en ciertas premisas, y encontrar una demostración lógica con dichas premisas que haga cierto ¬A, demuestra una contradicción, y por tanto que la hipótesis A es falsa.

Si entiendo lo que dices backtracking podría plantearse como una reducción al absurdo: partiendo de una solución parcial, buscamos una serie de valores que nos den una solución no válida. Sin embargo me mantengo: no es una reducción al absurdo, ya que no operas con premisas que te permitan negar la solución parcial sino que das valores y esperas encontrar la solución correcta, luego no hay ningún tipo de decisión lógica que acompañe al algoritmo de backtracking a no ser que metas heurísticas.



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.

Por supuesto que el problema del sudoku debe resolverse con una serie de reglas lógicas. No veré a la gente haciendo backtracking a papel y lápiz. Y si quieres resolver un sudoku paso a paso como lo haría una persona (que es este caso), más te vale seguir la lógica de resolución del problema, no la que a ti te de la gana.

Tú me estás dando la definición matemática de puzzle y todo lo que tu quieras. Yo te digo que hay sudokus bien formados con varias soluciones matemáticas posibles al problema. Y te hablo del mundo real, de los que soluciona la gente de forma sencilla sin sudar.

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.

Hay formas de descartar un número para una casilla que requieren mucha más vista de la aplica un algoritmo de backtracking, por ejemplo mirando filas adyacentes a la casilla en cuestión, los valores en otras cajas... Eso es una decisión lógica, heurísticas para reducir el dominio de cada casilla y así poder saber cuál es o bien la casilla correcta a escoger, o bien la que más probabilidades tiene de conseguir que provoque una poda.
La definición clásica de backtracking simplemente no tiene estas cosas en cuenta.

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.
[/quote]
Si claro, como detalle informativo. Pues tenías un deje muy inquisitivo para informar de algo que no venía ni a cuento, pidiéndome justificaciones para problemas que no estamos tratando. A mi me ha sonado a intento fallido de demostrar algo, pero a lo mejor es que estoy "encendido" ;)

En fin, yo ya he perdido demasiado tiempo en esto. La pena es que el libro con problemas y el libro de técnicas de resolución de sudokus los tengo en casa de mis padres, que si no te ponía exactamente los sudokus de ejemplo para que lo vieras por ti mismo. De todas maneras tampoco tengo necesidad ni tiempo de demostrarte nada. Allá cada cual.

PD: Lo de no tengo tiempo no lo digo de malas, de verdad que estoy liado y como me meta en discusiones (amigables) en foros, me conozco y no paro :P
apenas llevo un semestre en la ingenieria, y bueno aun me parece algo complicado pero la ayuda que me han dado ya estoy pensando como hacer que resuelva las sudoku. y lo otro que me gustaria saber es como generarlos (creo que es mas complicado).do

gracias a todos los que me han ayudado :D

y bueno una duda algo mas facil, y bueno la verdad lamento el hecho de que este en visual basic, pero quiero saber si es posible poder guardar variables en un archivo de texto y cargarlas, para asi guardar sudokus y continuarlos despues
bueno continuo con el pequeño proyecto, he estado pensando varias maneras de resolver los sudokus y probando varias cosas, por lo pronto intentare mejorar algo la interfaz para hacerla algo mas amigable, poner soporte para idiomas, (ingles y español por ahora), y hacer que guarde los sudokus... bueno supongo que esto es lo principal que tendra la beta 3
Al fin he terminado la beta 3!!! mi tiempo ha sido muy poco, y bien sigo siendo algo novato, pero he aprendido bastante con este pequeño proyecto, y ya casi he implementado todo lo que queria. ya el programa se ve bastante mejor que antes, y carga los sudokus como archivos, bueno, he escrito los cambios en el hilo. espero que alguien lo pruebe [+risas]
Oops, quizás ahora ya no te sirva de nada, pero sí, hay una forma muy sencilla de guardar un Sudoku (o cualquier cosa) en un fichero de texto, como xml concretamente, mediante XML Serializers, (o SOAP serializer): http://support.microsoft.com/kb/316730

El concepto es crear un serializador, pasarle un stream de escritura para que genere la salida, pasarle el objeto que tiene que serializar, y au.
pronto corregida la beta 3 y la beta 4 [beer]
25 respuestas