C#: Comment faire un tableau de structs ? - C#/.NET managed - Programmation
Marsh Posté le 11-12-2008 à 09:51:26
tu es sur que tu ne devrai pas plutôt faire un tableau d'objet ? , avec une classe tableEntry ?
Marsh Posté le 11-12-2008 à 09:55:52
Classe, struct, pareil
par contre sur le net jai trouvé que les tableaux doivent etre typés et que du coup, c'est pas top.
Quelle est la meilleure facon (ou la plus simple, disons) d'implementer une matrice a 2 dimensions en C# ? Je vais passer de mon int[,] a un truc qui peut contenir des structs. Un Dictionary, peut etre ?
Marsh Posté le 11-12-2008 à 10:07:08
ReplyMarsh Posté le 11-12-2008 à 10:16:05
Donc ca marche avec une classe mais pas un struct
Merci
Marsh Posté le 11-12-2008 à 13:18:16
class ou struc ce n'est pas pareil.
Leur allocation mémoire est totalement différente (pour l'un dans la HEAP, pour l'autre dans la STACK).
Les struct ne doivent idéalement pas dépasser 16 bytes.
Marsh Posté le 15-12-2008 à 09:54:11
c'est pas parceque c'est possible que c'est une bonne pratique
Marsh Posté le 15-12-2008 à 11:21:10
A la base c'etait pour un programme de resolution de Sudoku en brute force. Ca fonctionne bien, maintenant j'aimerais l'optimiser: pour le sudoku qui est donné en "near worst case" sur wiki, mon prog met 4:52 minutes avec une config moyenne de nos jours (:o).
J'utilise un tableau a 2 dimensions contenant des cell, ma classe:
Code :
|
Voici la methode de brute force:
Code :
|
Sachant que je ne peux pas ameliorer grand chose niveau logique pour la resolution du puzzle, peut-etre que je peux ameliorer qqch niveau programmation, n'etant pas un guru Y-a-t-il des astuces / idees pour reduire le temps de calcul en utilisant certaines methodes d'implementation ?
Marsh Posté le 17-12-2008 à 11:53:33
Tu es sur que c'est du "near worst case"?
Parce que j'ai écrit pour voir entre hier et ce matin un petit programme en C# (surtout pour voir si je perd pas la main dans ce langage que je pratique peu), qui ne fait pas de la brute force, mais applique juste les regles logiques de base (et qui ne saura pas resoudre une grille ou il faut faire des essais, comme une grille qui a plus d'une solution).
Or il résoud ta grille quasiment instantanément en 17 passes dans mon algo.
step 17:
| 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 |
| 02 | 04 | 06 | 01 | 07 | 03 | 09 | 08 | 05 |
| 03 | 05 | 01 | 09 | 02 | 08 | 07 | 04 | 06 |
| 01 | 02 | 08 | 05 | 03 | 07 | 06 | 09 | 04 |
| 06 | 03 | 04 | 08 | 09 | 02 | 01 | 05 | 07 |
| 07 | 09 | 05 | 04 | 06 | 01 | 08 | 03 | 02 |
| 05 | 01 | 09 | 02 | 08 | 06 | 04 | 07 | 03 |
| 04 | 07 | 02 | 03 | 01 | 09 | 05 | 06 | 08 |
| 08 | 06 | 03 | 07 | 04 | 05 | 02 | 01 | 09 |
A+,
Marsh Posté le 17-12-2008 à 12:27:38
On peut aussi passer par une liste:
Code :
|
Après, l'idéal étant de n'utiliser que la liste si besoin, sans passer par le Array
Marsh Posté le 17-12-2008 à 14:31:41
gilou a écrit : Tu es sur que c'est du "near worst case"? |
Je peux voir ton algo ?
Sinon c'est un worst case justement pour un algo de bruteforce, sinon le terme de worstcase n'a pas de sens
Marsh Posté le 17-12-2008 à 16:17:53
Typiquement, mon algo ne marche que s'il existe une resolution directe.
Cette grille de départ (Télé Loisir Force 3 de cette semains ) le bloque au bout de 3 itérations (et résolution pour 11 cases)
| 01 | | | | | | | 05 | | |
A+,
Marsh Posté le 17-12-2008 à 17:02:03
L'algo marche ainsi:
Une classe pour definir ce qu'est une case:
Code :
|
Une classe pour définir une grille
Code :
|
Une classe pour définir une partie:
Code :
|
todo est la liste des cases dont les valeurs viennent d'être connues et qu'on va traiter.
On initialise la grille avec les valeurs d'une grille initiale, et on met chaque case de la grille initiale dans la liste todo.
Code :
|
InitSquare(n) va mettre a n son champ digit et réduire a {n} sa liste possible_digits.
ou ta grille exemple est:
Code :
|
Ensuite pour chaque element de la liste todo on va virer sa valeur des possible_digits des cases dans la même ligne, colonne et carré interne:
Code :
|
RemoveDigit fait gaffe a pas le virer sur la case de todo en cours elle même.
C'est appellé dans cet fonction, qui fait la resolution de la grille:
Code :
|
Donc apres avoir traité la liste todo, on la vide, et on regarde si notre traitement n'a pas créé de nouvelles cases qu'on va pouvoir resoudre (et donc mettre dans la liste todo):
Pour chaque chiffre, on regarde si il n'est pas présent qu'une seule fois dans les possible_digits dans une ligne, une colonne ou un carré interne, si oui, pour la seule case portant cette valeur, si elle n'a pas déja sa valeur dans digit (ie deja traitée), on met la valeur, et on reduit possible_digits a cette valeur. Si la case n'est pas déja dans la todo list, on la met.
Code :
|
FindUniqueInSqr est du même tonneau, mais plus coton a établir comme formule, il faut utiliser des modulo et la division entiere.
Enfin l'algo verifie qu'il n'y a pas des cases qui ont possible_digit a une seule valeur et digit pas positionné, sinon, on positionne digit et on ajoute la case dans la todo list.
On a une nouvelle liste todo, on réitere l'algo:
Code :
|
j'ai mis une valeur maximale a 99 tours, mais en fait, ca ne devrait pas dépasser 9*9=81 (ou 81+1) tours.
L'algo consiste pour une case connue, a réduire les possibilités dans sa ligne, colonne, carré interne, puis a regarder:
- si pour une valeur donnée, il n'y a pas qu'une seule possibilité par ligne, colonne ou carré interne
- si il n'y a pas des cases qui n'ont qu'une seule possibilité
Il y a peut être des améliorations a apporter a cet algo, mais il faut que j'aille lire du coté des techniques de résolution des grilles de Sudoku pour voir s'il y a d'autres techniques directes (ie ne faisant pas a un moment donné une hypothése "si la valeur en cette case est... alors, et voir si on arrive a une contradiction" ).
Il y a en particulier la technique de la hidden pair qu'il faudrait que je rajoute.
A+,
Marsh Posté le 17-12-2008 à 18:50:23
J'ai un truc similaire, avant de commencer le brute force je diminue le nombre de candidats pour chaque cellule. Par contre ta methode ne marche que pour les sudokus solvables par un humain, avec de la logique.
Quelques idees de methodes a implementer: http://www.mots-croises.ch/Manuels [...] hnique.htm (bonne chance pour certaines )
Le brute force, lui, garantit de trouver une solution ('sil en existe une). Ce que j'ai fait, c'est une sorte de preprocessing avant le brute force qui permet d'optimiser (donc reduire) l'arbre de possibilités histoire de minimiser le temps du backtracking.
J'arrive a 4 minutes 52 pour la grille "near worst case" de brute force (69 175 317 appels recursifs !), et 2183 milisecondes en appliquant une astuce qui simplifie le tout (518 275 appels).
Il serait d'ailleurs interessant de trouver LA grille worst case, si c'est possible.
Ca devient tres vite tres mathematique, ces trucs
Marsh Posté le 17-12-2008 à 21:13:17
Citation : J'ai un truc similaire, avant de commencer le brute force je diminue le nombre de candidats pour chaque cellule. Par contre ta methode ne marche que pour les sudokus solvables par un humain, avec de la logique. |
Je fais rarement des sudokus pour le plaisir, alors je ne connais pas les techniques logiques utilisées pour résoudre les grilles, je ne m'attendais pas a un truc parfait, c'etait juste pour voir si la logique simple permettait d'aller plus vite que la force brute.
A+,
Marsh Posté le 18-12-2008 à 14:08:18
gilou a écrit :
Je fais rarement des sudokus pour le plaisir, alors je ne connais pas les techniques logiques utilisées pour résoudre les grilles, je ne m'attendais pas a un truc parfait, c'etait juste pour voir si la logique simple permettait d'aller plus vite que la force brute. |
Oui.
De ce que je me souviens, les meilleurs solveur de sudoku utilisent avant tout toutes les regles logiques avant de sortir le brute force en dernier recours.
Marsh Posté le 11-12-2008 à 09:02:05
Bonjour,
Question con a laquelle je ne trouve pas de reponse
J'ai un struct tout con qui contient 2 integer, par ex.
J'aimerais creer un tableau contenant des ces structs, mais je ne parviens pas a trouver la syntaxe correcte.
J'oublie quel détail ?
---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt