1

Je voudrais juste savoir si quelques personnes auraient déjà réfléchi sur un algorithme de génération de sudoku. J'ai déjà trouvé pas mal d'algo de résolution et finalement la façon la plus simple est (à mon avis^^) de manière récursive. Seulement je vois pas trop pour la génération.

En fait je suis entrain de programmer un sudoku pour PC en C++ avec Qt4 et pour la génération de grille j'ai adopté un algo "barbare" qui peut parfois devenir très long et gourmand. La génération peut par moment mettre une petite minute (sur mon 3500+) pour une grille de niveau difficile (enfin pas trop^^).

Déjà pour remplir la grille complètement de nombres je mets des nombres au hasard jusqu'à que la grille soit remplie (en recommençant si ca bloque) :

void GrilleSudoku::genererSudoku()
{
	int liste[9];
	int nb;
	int i,j;
	bool echec=true;

	srand(time(NULL));
	while (echec)
	{
		for(i=0;i<9;i++) for(j=0;j<9;j++) m[i][j]=0;

		echec=false;
		for(i=0;i<9 && !echec;i++)
		{
			for(j=0;j<9 && !echec;j++)
			{
				nombresPossibles(liste,i,j,&nb);
				if(nb!=0)
				{
					//tirage aléatoire d'un nombre possible
					m[i][j]=liste[rand()%nb];
				}
				else echec=true; //si tous les nombres sont utilisés : échec
			}
		}
	}
}


Et ensuite je les enlève un par un aléatoirement en testant chaque fois qu'il n'y a toujours qu'une seule solution grâce à un algorithme récursif :

/*
int nbSolutions(int nb_a_resoudre, int nb_resolu)
Retourne le nombre de solutions de la grille
	int nb_a_resoudre	: nombre de cases à résoudre. 	Au début : nombre de cases vide -> nbCasesVides()
	int nb_resolu		: nombre de cases résolu.		Au début : 0
*/
int GrilleSudoku::nbSolutions(int nb_a_resoudre, int nb_resolu)
{
	int i=0,j=0,k,nb=0,n;
	int liste[9];
	bool solution=true;

	if (nb_a_resoudre>nb_resolu)
	{
		for (i=0;i<9 && solution;i++)
		{
			for (j=0;j<9 && solution;j++)
			{
				if (nombresPossibles(liste, i, j, &n)) //si m[i][j]==0
				{
					solution=false;
					for (k=0;k<n;k++)
					{
						m[i][j]=liste[k];
						nb += nbSolutions(nb_a_resoudre,nb_resolu+1);
						m[i][j]=0;
					}
				}
			}
		}
	}
	else nb++;
	return nb;
}


Donc voilà, cet algorithme marche mais c'est un peu bourrin à mon goût, alors j'aimerais savoir si vous avez d'autres idées pour la génération smile

Vous pouvez télécharger mon programme actuel ici et les dll qt 4.1.4 ici

Si certaine personnes veulent les sources, je peux les envoyer, même si c'est pas très propre pour l'instant grin
Et aussi si vous pouviez me dire comment se comporte la génération sur des PCs moins puissant, et si vous avez des idées d'optimisations sur les algo actuels, je suis preneur smile

Merci d'avoir lu jusqu'ici^^
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

2

j'ai pas tout lu mais je crois avoir compris que pour generer la grille du départ tu fais ca aléatoirement, ca doit etre super long

je viens de retrouver ca sur tigen :

on part de cette solution

123456789
456789123
789123456
234567891
567891234
891234567
345678912
678912345
912345678

et on swap 2 à 2 lignes et colonnes en considerant seulement des blocs de 3 lignes ou colonnes (par exemple la 1ere ligne ne pourra jamais swapper avec une autre ligne que la 2nde ou la 3eme)

ca devrait deja aller plus vite smile
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/

3

Est-ce que en swapant 2 à 2 des lignes/colonnes on arrive à générer toute les grilles de sudoku possible?

4

Non...
avatar

5

Tu dois aussi pouvoir remplir toutes les cases avec une liste de chiffres de 1 à 9, puis pour chaque case sélectionner un chiffre dans la liste (enlevant tous les autres) et enlever ce même chiffre dans toutes les cases où il ne peut de fait plus se trouver. Normallement à la fin il n'y a plus qu'un chiffre par case, cependant je ne sais pas si on abouttit toujours à des grilles valides (comme ça là je ne vois pas trop ce qui l'empêcherait en fait, mais c'est pas comme si j'y avais beaucoup réfléchi (hmmm à la réflexion il doit y avoir des cas à contrôler quand même (je me demande s'il ne suffit pas de fixer 9 chiffres dans 9 cases sur des lignes et colonnes et cadrants différents aussi))).
Après je ne suis pas sûr de connaître toutes les subtilités de l'affaire, nottament le nombre de chiffres qui doivent rester à la fin sur la grille pour qu'elle soit solvable.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

6

La méthode à laquelle j'avais pensé pour générer une grille, perso c'était par résolution (En gros au départ c'est la même idée que Ximoon, mais juste au départ ^^)
Donc il te faut un algorithme de résolution valide.
Je sais pas comment les autres font pour la résolution, mais perso je prends 9 bits par case, un bit pour chaque chiffre, si c'est 1 le chiffre *peut* se trouver dans la case, si c'est 0 il ne peut pas, et quand il n'y a qu'un seul bit, la case est déterminée.

En gros tu prends deux grilles vierges A et B. La grille A une grille de résolution (tant qu'a faire) et la grille B un tableau d'entiers ^^

A chaque étape tu sélectionne une case *vide*, au sens ou le chiffre dedans n'est pas encore déterminé, dans la grille A (la méthode de sélection peut être a discuter, mais complètement aléatoire devrait être suffisant)
Dans cette case tu mets un des chiffres possibles pour cette case (d'où l'utilité d'un masque de bits), et tu mets le bit de ce chiffre à 0 dans toutes les autres cases de la ligne, de la colonne, et du carré, bref truc traditionnel.
Tu mets aussi ce chiffre dans la case correspondante de la grille B, puis tu lance les autres algo de résolution sur la grille A (puisque une grille ne peut pas se résoudre avec le simple algo du masquage de bits... Du coup le truc de Ximoon doit donner des grilles non valables je pense ^^)
Si la grille A est incomplète, tu lances une autre étape, sinon c'est fini.

Au final tu as dans la grille résolue dans A et la grille non résolue, plus ou moins minimaliste selon la méthode de séection des cases, dans B.

J'ai jamais testé cet algorithme dans la pratique (les algo de résolution oui tongue) mais je ne vois a priori pas de raison que cet algorithme ne fonctionne pas...

Quand au choix des cases, j'explique un peu le truc... Prendre une case au hasard ça n'a rien de mauvais, mais la difficulté des grilles sera elle aussi aléatoire...
En gros quand on choisit une case, il y a entre 2 et 9 possibilités de chiffres pour cette case... Plus il y a de possibilités, plus la détermination de la case apportera d'informations, et moins il y aura de cases dans la grille non résolue. En revanche s'il y a peu de possibilités, cela veut dire que les cases déjà déterminées apportent la majorité des informations, et la détermination de la case, apportera en conséquence peu d'informations supplémentaires, et inévitablement on se retrouvera avec plus de cases dans la grille non résolue.

Je sais pas si c'est compréhensible, mais je réexpliquerai plus clairement au besoin.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

7

Juste pour info il existe les algorithmes génétiques pour résoudre des grilles de sudoku.
Ou encore par méthode proche de l'IA (chaînes de Markov...)
http://membres.lycos.fr/rsirdey/sudoku/sudoku_sa.pdf
http://www.norvig.com/sudoku.html

[edit avant le dodo] Lien vers un sudoku utilisant un algorithme génétique, c'est un solveur mais bon je pense qu'on peut tout à faire à partir du code source créer de nouveau sudoku avec niveau de difficulté paramétrable:
http://www.ozoneasylum.com/28035&latestPost=true

Sinon il existe toujours la méthode brute force mais bon ça risque d'être lent même sur PC.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

8

Si je ne me trompe pas un sudoku bien fait ne possède bien qu'une seule solution ?

=> Tout algorithme déstiné a opérer sur plusieurs solutions potentielles est totalement inadapté à un problème qui ne possède qu'une et une seule solution bien définie et identifiable. (et ça inclut implicitement le brute force)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

9

geogeo :
Juste pour info il existe les algorithmes génétiques pour résoudre des grilles de sudoku.
Ou encore par méthode proche de l'IA (chaînes de Markov...)
http://membres.lycos.fr/rsirdey/sudoku/sudoku_sa.pdf
http://www.norvig.com/sudoku.html

[edit avant le dodo] Lien vers un sudoku utilisant un algorithme génétique, c'est un solveur mais bon je pense qu'on peut tout à faire à partir du code source créer de nouveau sudoku avec niveau de difficulté paramétrable:
http://www.ozoneasylum.com/28035&latestPost=true

Sinon il existe toujours la méthode brute force mais bon ça risque d'être lent même sur PC.

Pourquoi se faire chier a utiliser un algo genetique alors qu'une methode de branch-and-bound peut tres bien suffir.
Sinon, en utilisant une approche des n-cycles peut-etre... un pote a commence et jamais fini smile

10

GoldenCrystal :
=> Tout algorithme déstiné a opérer sur plusieurs solutions potentielles est totalement inadapté à un problème qui ne possède qu'une et une seule solution bien définie et identifiable. (et ça inclut implicitement le brute force)

Tu penses a quel genre d'algo alors... Une solution constructive ? Je pense pas que ce soit possible dans ce genre de problemes...

11

la résolution du sudoku c'est un exemple trivial de programmation en prolog, voici un truc que j'avais fait vite fait (il faut un prolog avec solveur de contraintes sur les domaines finis, comme gnu prolog). Le code est optimisé pour énumérer le moins de variables possible parce que c'était le but de l'exercice, mais si on ne veut pas ces optimisations, c'est encore plus trivial.

En gros il suffit de dire à prolog : « voila une grille dont tels cases sont connues et telles autres inconnues. chaque ligne, colonne et bloc doit contenir les chiffres entre 1 et 9 une seule fois. Résouds la grille. »

Bon mais en fait c'est encore mieux, parce que ce n'est pas qu'un simple solveur : si il y a plusieurs solutions, on peut lui faire énumérer. Donc si on lui fait résoudre la grille vide, il énumère toutes les grilles de sudoku possibles. Comme le finite domain checking c'est super fort, trouver une solution, même à partir de la grille vide, est instantané.

Le code fait 200 lignes mais si on vire ce qui sert à rien il doit rester 15 lignes intéressantes (plus la définition de Rows, Cols et Blocks).

Ensuite effectivement pour générer une grille il suffit de choisir trois quatre nombres au pif (pour avoir du hasard), de demander a prolog une solution, puis de supprimer des nombres tant que la solution est unique.

/*************************************************************************/
/* Constraint Programming Project                                        */
/*                                                                       */
/* Name  : sudoku.pl                                                     */
/* Title : Sudoku Solver                                                 */
/* Date  : 02/10/2006                                                    */
/*                                                                       */
/* Enumerates all possible solutions for a given Sudoku grid.            */
/*************************************************************************/

/*************************************************************************/
/* CONSTRAINTS                                                           */
/*************************************************************************/

/*
 * sudoku_constraints/1
 *
 * Given a list of lists, applies some constraints to these lists. They
 * must contain integers which are all differents and are in [|1,9|].
 */
sudoku_constraints([]).
sudoku_constraints([Head|Tail]) :-
  fd_domain(Head,1,9),
  fd_all_different(Head),
  sudoku_constraints(Tail).

/*
 * sudoku_redundant_constraints/1
 *
 * Given a list of lists, applies some more constraints to these lists.
 * They must contain exactly one 1, one 2, ..., one 9.
 */
sudoku_redundant_constraints([]).
sudoku_redundant_constraints([Head|Tail]) :-
  fd_exactly(1,Head,1),
  fd_exactly(1,Head,2),
  fd_exactly(1,Head,3),
  fd_exactly(1,Head,4),
  fd_exactly(1,Head,5),
  fd_exactly(1,Head,6),
  fd_exactly(1,Head,7),
  fd_exactly(1,Head,8),
  fd_exactly(1,Head,9),
  sudoku_redundant_constraints(Tail).

/*************************************************************************/
/* LABELING                                                              */
/*************************************************************************/

/*
 * get_greatest/3
 *
 * Given a list of finite domain variables, and an integer N, returns the
 * maximum between N and the greatest domain size in the list.
 */
get_greatest([],N,N).
get_greatest([Head|Tail],N,M) :-
  fd_size(Head,P),
  (P > N -> get_greatest(Tail,P,M) ; get_greatest(Tail,N,M)).

/*
 * get_var/3
 *
 * Given a list of finite domain variables, and a domain size N, returns
 * the first variable of the list whose domain size is N.
 */
get_var([Head|Tail],N,A) :-
  (fd_size(Head,N) -> A = Head ; get_var(Tail,N,A)).


/*
 * sudoku_labeling/2
 *
 * Given a sudoku grid filled with finite domain variables, tries to label
 * them while minimizing the number of enumerated variables. N is the
 * number of enumerated variables.
 */
sudoku_labeling(Grid,N) :-
  get_greatest(Grid,1,S),
  (S =\= 1 -> /* If the greatest domain size is 1, then the grid is */
              /* solved.                                            */
    get_var(Grid,S,A), /* We find the variable with the greatest domain, */
    fd_labeling(A),    /* hoping that its labeling will propagate enough */
                       /* to allow us to enumerate less variables        */
    sudoku_labeling(Grid,M),
    N is M+1
  ; N is 0).

/*************************************************************************/
/* OUTPUT                                                                */
/*************************************************************************/

/*
 * write_row/1
 *
 * write_row/1 is used by write_grid/1 to output a Sudoku grid.
 */
write_row([]) :- 
  write('|').
write_row([A1,A2,A3|Tail]) :-
  write('|'), write(A1), write(A2), write(A3),
  write_row(Tail).

/*
 * write_grid/1
 *
 * Given a Sudoku grid by its list of rows, outputs it.
 */
write_grid([]) :-
  write('+---+---+---+'), nl.
write_grid([Row1,Row2,Row3|Tail]) :-
  write('+---+---+---+'), nl,
  write_row(Row1), nl,
  write_row(Row2), nl,
  write_row(Row3), nl,
  write_grid(Tail).

/*************************************************************************/
/* MAIN PREDICATE                                                        */
/*************************************************************************/

/*
 * sudoku/1
 *
 * Given an unsolved Sudoku grid, applies necessary and redundant
 * contraints to it, then tries to solve it while minimizing the number of
 * enumerated variables. Finally prints the number of enumerated variables
 * and the solution.
 */
sudoku(Grid) :-
  Grid = [A11,A12,A13,A14,A15,A16,A17,A18,A19,
          A21,A22,A23,A24,A25,A26,A27,A28,A29,
          A31,A32,A33,A34,A35,A36,A37,A38,A39,
          A41,A42,A43,A44,A45,A46,A47,A48,A49,
          A51,A52,A53,A54,A55,A56,A57,A58,A59,
          A61,A62,A63,A64,A65,A66,A67,A68,A69,
          A71,A72,A73,A74,A75,A76,A77,A78,A79,
          A81,A82,A83,A84,A85,A86,A87,A88,A89,
          A91,A92,A93,A94,A95,A96,A97,A98,A99],

  Row1 = [A11,A12,A13,A14,A15,A16,A17,A18,A19],
  Row2 = [A21,A22,A23,A24,A25,A26,A27,A28,A29],
  Row3 = [A31,A32,A33,A34,A35,A36,A37,A38,A39],
  Row4 = [A41,A42,A43,A44,A45,A46,A47,A48,A49],
  Row5 = [A51,A52,A53,A54,A55,A56,A57,A58,A59],
  Row6 = [A61,A62,A63,A64,A65,A66,A67,A68,A69],
  Row7 = [A71,A72,A73,A74,A75,A76,A77,A78,A79],
  Row8 = [A81,A82,A83,A84,A85,A86,A87,A88,A89],
  Row9 = [A91,A92,A93,A94,A95,A96,A97,A98,A99],
  Rows = [Row1,Row2,Row3,Row4,Row5,Row6,Row7,Row8,Row9],

  Col1 = [A11,A21,A31,A41,A51,A61,A71,A81,A91],
  Col2 = [A12,A22,A32,A42,A52,A62,A72,A82,A92],
  Col3 = [A13,A23,A33,A43,A53,A63,A73,A83,A93],
  Col4 = [A14,A24,A34,A44,A54,A64,A74,A84,A94],
  Col5 = [A15,A25,A35,A45,A55,A65,A75,A85,A95],
  Col6 = [A16,A26,A36,A46,A56,A66,A76,A86,A96],
  Col7 = [A17,A27,A37,A47,A57,A67,A77,A87,A97],
  Col8 = [A18,A28,A38,A48,A58,A68,A78,A88,A98],
  Col9 = [A19,A29,A39,A49,A59,A69,A79,A89,A99],
  Cols = [Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9],

  Block1 = [A11,A12,A13,A21,A22,A23,A31,A32,A33],
  Block2 = [A14,A15,A16,A24,A25,A26,A34,A35,A36],
  Block3 = [A17,A18,A19,A27,A28,A29,A37,A38,A39],
  Block4 = [A41,A42,A43,A51,A52,A53,A61,A62,A63],
  Block5 = [A44,A45,A46,A54,A55,A56,A64,A65,A66],
  Block6 = [A47,A48,A49,A57,A58,A59,A67,A68,A69],
  Block7 = [A71,A72,A73,A81,A82,A83,A91,A92,A93],
  Block8 = [A74,A75,A76,A84,A85,A86,A94,A95,A96],
  Block9 = [A77,A78,A79,A87,A88,A89,A97,A98,A99],
  Blocks = [Block1,Block2,Block3,Block4,Block5,Block6,Block7,Block8,Block9],

  sudoku_constraints(Rows),   /* These constraints mean that each row,   */
  sudoku_constraints(Cols),   /* each column and each block, contain     */
  sudoku_constraints(Blocks), /* integers all different between 1 and 9. */

  sudoku_redundant_constraints(Rows),   /* These constraints mean that */
  sudoku_redundant_constraints(Cols),   /* each row, column and block, */
  sudoku_redundant_constraints(Blocks), /* contain exactly 1 of each   */
                                        /* integer between 1 and 9     */

  sudoku_labeling(Grid,N), /* This solves the grid. */

  nl,                                                     /* Then we     */
  write('Number of enumerated variables: '),write(N), nl, /* print the   */
  write('------------------------------------'), nl,      /* solved grid */
  write('Solution:'), nl,
  write_grid(Rows).
avatar
I'm on a boat motherfucker, don't you ever forget

12

cependant il faut savoir que les meilleures grilles de sudoku sont celles construites par des humains smile
avatar
I'm on a boat motherfucker, don't you ever forget

13

défini "meilleures", histoire de savoir que faire pour en générer des meilleures.

14

ben par exemple une grille générée au hasard peut avoir une étape de sa solution ou on est obligés de mettre un chiffre au hasard pour continuer. c'est pas intéressant.

bon ce problème en particulier peut être évité si on code son générateur correctement, mais c'est nettement plus compliqué que ça et il y a pas mal de gens qui considèrent que rien ne vaut une (bonne) grille faite à la main.
avatar
I'm on a boat motherfucker, don't you ever forget

15

Ok je comprends smile
Sont chiant ces humains

16

Moumou
: la résolution du sudoku c'est un exemple trivial de programmation en prolog

Tiens, on avait eut ca aussi en prog par contraintes smile
(Prolog & Chip powered ?)

17

(c'est quoi ? ^^)
avatar
I'm on a boat motherfucker, don't you ever forget

18

(un ensemble de trucs pour faire de la ppc sous prolog, c'est vachement puissant et rapide smile, j'ai ete vraiment sur le cul compare a des temps de resolution avec des bonnes metaheuristiques...)

19

(alors non, gnu prolog avec un simple finite domain solver, mais c'est déjà largement assez puissant smile)
avatar
I'm on a boat motherfucker, don't you ever forget

20

Moumou :
ben par exemple une grille générée au hasard peut avoir une étape de sa solution ou on est obligés de mettre un chiffre au hasard pour continuer. c'est pas intéressant.

Oui enfin si tu définis une grille intéressante par "je peux résoudre la grille en appliquant ces transformations mécaniques n fois où n est le nb de cases vides", je trouve pas ça très marrant happy

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

21

Ximoon :
pour qu'elle soit solvable.
soluble ^^ (solvable ça veut dire qu'elle a de quoi payer grin)
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

22

Erf, merci grin
(trop de chimie dans ma jeunesse, ça m'a créé des blocages, toussa #mac#)
GoldenCrystal :
Du coup le truc de Ximoon doit donner des grilles non valables je pense


Ouais reste à savoir pourquoi, et dans quels cas happy
Du reste ça doit pas être bien long à faire, je verrai à l'occase hehe

Et quant au nombre de chiffre que l'on doit laisser sur la grille au final ?
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

23

Pollux
:
Moumou :
ben par exemple une grille générée au hasard peut avoir une étape de sa solution ou on est obligés de mettre un chiffre au hasard pour continuer. c'est pas intéressant.

Oui enfin si tu définis une grille intéressante par "je peux résoudre la grille en appliquant ces transformations mécaniques n fois où n est le nb de cases vides", je trouve pas ça très marrant happy

bon ben dans ce cas tu trouves pas le sudoku très marrant tongue

ximoon > minimum 17 (très probablement), maximum ça dépend.
avatar
I'm on a boat motherfucker, don't you ever forget

24

chais pas, j'y joue pas assez souvent pour connaître la liste des Transformations Mécaniques Agréées par la Fédération de Sudoku donc ça me dérange pas, mais si j'y jouais souvent et que c'était aussi mécanique que tu le dis ça me ferait sûrement chier, oui ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

25

mais ne pas dépendre du hasard =/= utiliser uniquement des transformations agréees. Juste dans les grilles ou, par exemple, un solveur de contraintes est obligé de backtracker, on peut raisonnablement penser qu'un humain se retrouvera coincé à un moment sauf à mettre un chiffre au hasard.
avatar
I'm on a boat motherfucker, don't you ever forget

26

Ben, non confus
Un solveur de contrainte qui est obligé de deviner et de backtracker, ça veut juste dire que son mécanisme d'inférence n'est pas assez puissant et/ou adapté à la grille, pas que la grille est inhéremment difficile what

De même que, je sais pas, un solveur automatisé pour SAT peut être obligé de faire un peu de brute force quand il est coincé (développer la formule f sous la forme v & f1 | ~v & f2 où f1 et f2 ne dépendent pas de v), mais ça ne veut pas dire qu'il n'y a pas une transformation simple qui permettrait de prouver que la formule est satisfiable ou non... Toute la difficulté et l'intérêt de la chose étant dans le fait de trouver la transformation en question smile

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

27

Ben comment font les gens pour assigner une difficulté à leurs grilles, alors ?
avatar
I'm on a boat motherfucker, don't you ever forget

28

Si la solution est unique, je ne comprends pas comment tu peux être obligé de mettre un chiffre au hasard confus
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

29

ie t'es à un endroit et y a aucun moyen suffisemment simple pour que tu le voies de savoir quoi faire ensuite
avatar
I'm on a boat motherfucker, don't you ever forget

30

Moumou :
Ben comment font les gens pour assigner une difficulté à leurs grilles, alors ?

Ils cherchent l'ensemble de transformations "le plus simple" pour arriver à résoudre la grille, et disent que la difficulté de la grille est la difficulté de cet ensemble ?

Et justement ce que je dis, c'est qu'il n'y a aucune grille qui ait une "difficulté infinie", i.e. qui n'ait aucun ensemble de transformations qui permette de la résoudre, ou autrement dit, où "on est obligé de mettre un chiffre au hasard pour continuer" ou qui "dépende du hasard", comme tu dis ^^

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)