J'ai plutôt l'impression que personne s'en sert et met même son point d'honneur a aller vite sans.
En se qui me concerne pas une ligne d'ASM que du Pascal
Boris
Version imprimable
J'ai plutôt l'impression que personne s'en sert et met même son point d'honneur a aller vite sans.
En se qui me concerne pas une ligne d'ASM que du Pascal
Boris
Voila les grilles (je suis motivé). Yen a de plusieurs difficulté, pour chaque type de solveur ...
Pour ce qui est de l'assembleur, je ne m'en sert pas du tout ! Et franchement, meme si je savais m'en servir, je crois pas que je le ferai ... ^^Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 Grille 1 : 500004200 100020030 090000005 000400000 805196302 000005000 400000060 030070009 007300008 Grille 2 : 020001030 800900001 000060400 009600180 300000007 087003900 006090000 100006008 050300010 Grille 3 : 084010590 056009000 009050040 040500938 000000000 931004070 090040700 000900450 075080360 Grille 4 (AI Escargot) : 100007090 030020008 009600500 005300900 010080002 600004000 300000010 040000007 007000300 Grille 5 (Easter Monster) : 100000002 090400050 006000700 050903000 000070000 000850040 700000600 030009080 002000001 Grille 6 (1ere de la liste 17 de FullSpeed) : 071000000 000080600 000400000 000100072 800050000 000000000 040702000 600000850 000000300 Grille 7 (derniere de la liste 17 de FullSpeed) : 079000600 000100400 000200000 000000750 400300000 100000000 060080000 000090010 000000023
FullSpeed > pour ce qui est du post du nombre de tests :
Je suis d'accord que tu vérifie seulement une fois : quand il teste A=0, il doit passer tout les bits du chiffre pour voir si c'est nul, il fait donc 32 opérations ...
NON!!!
Quand il testensi la valeur est nulle il ne regarde pas les 32 bits!
A quoi il sert le flag Z?
Quand tu fais une operation arikthmetique comme un shr
quaoiqu'il, advienne si le resultat donne zero le flags Z zt positionne
donc si tu shift 000000000000000000000000000000000000000000000000001
il fait un decalage met le bit Z a vrai et toi derrière tu sors
Dans un test tu as deux parties: le test avec le positionnement des indicateurs et ensuite un branchement en fonction des indicateurs. Exemple
if A=0 then C=1
le code est
cmp a,0 je compare a et 0 et je met le flag z a vrai ou faux
jnz suite je regarde si le z est positionne Jump Not Zero
Mov c,1 else je met 1 dans c
suite je continue
La taille des opérateurs n'a aucune incidence : ou le cmp donne zero ou pas
Boris
tu prends les deux code et tu chronomètre tu verras bien si tu n'as pas succombé a la canicule
Cela a du bon parfois d'habiter en Bretagne : pas de canicule ni secheresse il parait qu'il pleut tout le temps (hein outOfRange)
Ok je testerai ... Je précise que ce que j'ai dit n'est pas testé, je me plante peut etre (surement ?) ...
Mick otes moi d'un doute : je ne suis pas entrain d'optimiser ton solveur en douce? :D
Tu n'aurais pas,un vieux code pur un soilveur logique (genre ta première version) Commeje te l'ai dis j'ai codé toutes les meyhodes mais je suis en pnne sur leur organisation
Cela me donnera peut etre des idees.
Boris
Je suis entrain de tester Delphi 2009 pour voir si le code genere est meilleur
mais il ne connait plus
QueryPerformanceFrequency
Dans la version que je teste l'aide ne matche pas
et j'ai la flemme de tout désinstaller pour télécharger la version d'évaluatioin chez CODEGEAR
Alors si quelqu'un a l& m&nip...
Merci
Je suis détenteur des licences DELPHi depuis la 3 jusqu'a la 7
la 9 ne m'interesse pas beaucoup j'attends la 10!
Boris
N'aie pas peur, je suis pas du genre a piquer les idées comme ca ... Si je veux le faire, je demande l'accord. A un moment je voulais prendre celui de Franck (en lui demandant) mais j'ai laissé tomber. Ma méthode est peut etre plus lente, mais c'est la mienne, et rien que pour ca, je la garde. En plus, je n'ai pas envie de rendre mon code plus chargé qu'il l'est. (tout ca pour gagner tres peu de temps). Je me sert de PRO Delphi, et je me suis rendu compte qu'une procédure était appelée environ 5000 fois dans mon programme, ce qui me prenait environ 200 µs (la presque totalité de ma résolution). Apres optim, je suis descendu a 100µs. Ce type d'optim est plus efficace que de changer une boucle qui n'est appelée que quelques fois ...
J'aimerais préciser que ca fait une semaine (ou plus) que je n'ai pas touché au solveur (meme quand j'ai dit que je m'attaquerai au brute force), et donc je n'ai pas pu te prendre tes idées ;)
Alors :
1 - On ne doit pas se donner de code (dsl)
2 - Ma premiere version est ma derniere version. Je suis parti direct avec des idées qui fonctionnent, et, ce que je trouve de plus précieux dans mon code n'est pas l'algorithme de résolution (quoique ...) mais surtout la facon dont la grille est enregistrée dans des variables, et la maniere de se reperer dans la grille.
3 - Pour l'organisation : tu veux parler de l'enchainement des méthodes ? alors tu fais de la plus rapide a la plus lente ;)
Voila !
J'attendrais pour mon solveur mais tu le sais mopi je ne fais pas dans la logique alors c'etait pas pour le defi.
Je vais m'inscrire au defi Pascal comme cela iune version avec ASM pour Delphiu et une version sans ASM pour le multiplateforme
Allez fdais chauffer les neurones...
Boris
Bis repetita
A qui et comment faire parvenir son solveur et ses sources
Merci
Bonjour FullSpeed.
Les modalités pour envoyer votre proposition sont expliqués dans les règles que vous pouvez retrouver ici.
AAAaaaarrrgggghhh ! J'ai un méga probleme super bizarre !!
Premierement, j'ai créé un algo qui est CAPABLE de me donner la solution bruteforce d'une grille. Or, cet algo ne donne le résultat que si je met des lignes inutiles (et quand je dit inutile, c'est inutile !!) dans mon code.
Je suis désolé, j'expose tres peu mon code, meme si c'est interdit.
Je m'explique : j'ai une fonction récursive pour mon algo, qui passe chaque case de ma grille (donc 81). Elle recoit en parametre une valeur NoCase qui définit le n° de la case a traiter. Cette valeur permettant entre autres de determiner si la résolution est finie.
Le code tel qu'expliqué ne résoud pas la grille. La fonction récursive me renvoie false, et des valeurs mauvaises.
MAIS, si je rajoute ces lignes a la fin de ma function (ou ailleurs) :
le solveur résoud bien la grille !!Code:
1
2 if NoCase=80 then Showmessage('toto');
J'y comprends rien!
Si je remplace le Showmessage par un Sleep(0), ca résoud aussi !
En fait, c'est si je me sert du NoCase dans une condition que ca me la résoud !
Ca m'a rappelé un topic avec la meme erreur, qui venait de l'optimisation faite par Delphi. Alors, j'ai testé sans optimisation, mais ca ne change rien !
Alors j'aimerais savoir comment faire, parce que la, je galere trop !
Merci pour votre aide !!
Essayes de supprimer tout tes fichiers DCU et reconstruire le projet. Peux-être qu'il y a une donnée périmée que le compilateur n'arrive pas à mettre à jour.
Merci, mais ce n'est pas de la que vient l'erreur ... Sinon je ne pourrais pas voir mes modifs dans mon programme. En tout cas, j'ai modifié quelques boucles a l'interieur et tout marche ... C'est a n'y rien comprendre ...
Edit : voila, mon solveur BruteFroce est opérationnel ;)
Je viens de tester quelques grilles, et les temps sont moins bons que pour le solveur logique (logique me direz vous :lol:) Enfin bref : voila les chronos :
Je précise que Easter Monster est un cas vraiment a part des autres !!!!
Plusieurs remarques :Code:
1
2
3
4
5
6
7
8
9 Logique / BruteForce / Logique et BruteForce Grille 1 : 0.143 ms / 0.770 ms / 0.143 ms Grille 2 : 0.212 ms / 3.120 ms / 0.212 ms Grille 3 : -------- / 0.580 ms / 0.288 ms Grille 4 : -------- / 1.830 ms / 1.807 ms Grille 5 : -------- / 23.60 ms / 23.64 ms Grille 6 : 0.134 ms / 1.221 S / 0.134 ms Grille 7 : 0.150 ms / 5.437 ms / 0.150 ms Grille début : ---- / 0.029 ms / 0.053 ms
Des fois, le temps avec solveur logique est plus long, pourquoi ?
Parce que le solveur logique ne trouve rien, mais parcours la grille inutilement, Ou alors la grille ne contient que tres peu de valeurs.
Haha, ton solveur logique arrive meme pas a résoudre la grille du début !!
A votre avis, pk ?
Tu met beaucoup de temps a résoudre Easter Monster (Grille 5) !
Cette grille est horrible ! Pour une grille normale (prenons AI Escargot comme exemple), j'ai une procédure qui est appelée environ 30 000 fois (je crois). Elle met 0.002 µs a s'executer. Et avec Easter Monster, elle est appelée 900 000 fois 8O. J'ai optimisé pour l'appeler "que" 400 000 fois. Rien que ca prends déja 1-2 ms. Et c'est aussi démesuré avec les procedures plus longues (aucune ne dépasse la µs), ce qui explique cet ecart !
Tu met beaucoup de temps a résoudre la grille 6 (17 de FullSpeed) en BruteForce !
Et encore, c'est rien par rapport a la grille Near Worst Case (6 secondes environ en BF SEULEMENT)
Edit 2 : Je viens de faire un deuxieme solveur Brute Force différent, se rapprochant de ce qu'explique (vite fait dans ses quelques posts) FullSpeed. Résultat : 3-4 fois plus lent que l'autre. J'avoue, je n'ai pas trop optimisé :oops: . Ah ? Par contre sur la grille du début, on gagne 0.009 ms :mouarf:
Merci alain mais iil y a la maniere de propose un defit
mmmais pas celle pour envoyer les repondes (ou je ne l'ai pas vue)
Boris
FullSpeed m'a chargé de poster ce message pour lui, car il a un probleme et n'arrive pas a poster :?
Citation:
Envoyé par FullSpeed
Ca c'est toi qui le dit :ccool:Citation:
Envoyé par FullSpeed
Avant de réinventer l'eau tide un de nos valeureus candidats ou moderateurs aurait-il une basique init de table genre
Region1 = 1,2,3,10,11,12,18,19,20
Le courageux Boris:lol:
Mick moi le mien est fini: il est peut être moins bon mais il restera le premier:ccool:
Ah j'avais pas compris, je croyais que tu parlais de la vitesse de résolution ;)
Dans ce cas, bien joué, meme si ce n'est pas le premier qui gagne.
[Cadeau]Au lieu de numeroter tes cases de 1 a 81, tu pourrais reperer chaque case par son numeero de ligne suivi de son numero de colonne : premiere case = 11, et ton init serait 11,12,13,21,22,23,31,32,33 (peut etre plus simple a gerer ...[/Cadeau]
Je ne gere pas les lignes et les colonnes..(calcul en dynamique)
Il n'y que pour les régions que l'on ne peut pas calculer simplement
Il est plus rapide de recalculer que d'avoir une table et de piocher dedans
Tu as bien dit quelle que part que tu appelles une routine 500 000 fois ?
Moi je s'est 12 millions
Boris