Bonjour,
j'essaye de programmer des algorithme à l'aide de code Hash,
mais je rencontre quelques soucis avec la méthode REMOVEDUP().
Ci-joint une table avec un programme fonctionnel sans utiliser removedup mais qui n'est pas optimal dans le sens ou on conserve les points éliminés tout le long du calcul (je les marque avec une variable convexe='0' pour signifier au code que ces points ont été éliminés).
J'ai ensuite modifié le programme pour l'optimiser en me disant que cette fois-ci je n'allais pas les marquer mais les éliminer au fur et à mesure du calcul de l'objet hash.
je remplace donc au niveau de l'étape 0
par le code
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /** le point A1 est à l interieur du convexe on l invalide --> convexe=0 **/ put 'branche non OK test vect point ordre num ' ordre ; put "convexe " convexe ; DO UNTIL (convexe^='0'); /* debug put x= y= ordre= ; */ rc=h.find_prev(); /* debug put x= y= ordre=; */ put '**recherche point a eliminer point num ' ordre rc=; END; put 'point a eliminer point num ' ordre ; convexe='0'; /** on marque l elimination sur le point A1 **/ rc=h.replacedup(); /* put rc= ;*/ DO UNTIL (convexe^='0');rc=h.find_prev(); put "recherche point A1 point num " ordre; END; put "point A1 point num " ordre ; Xa1=X;Ya1=Y; DO UNTIL (convexe^='0');rc=h.find_prev(); put "recherche point A2 point num " ordre; END; put "point A2 point num " ordre ; Xa2=X;Ya2=Y; DO UNTIL (convexe^='0');rc=h.find_next(); put "recherche point test principal point num " ordre ; END; DO UNTIL (convexe^='0');rc=h.find_next(); put "recherche point test principal point num " ordre ; END; put "point test trouvé point num " ordre;
mais je n'obtiens pas le même résultat le deuxième code échoue le h.find_prev() (rc=160038) juste après le h.removedup() ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /** le point A1 est à l interieur du convexe on l invalide --> convexe=0 **/ put 'branche non OK test vect point ordre num ' ordre ; put "convexe " convexe ; /*DO UNTIL (convexe^='0');*/ /* debug put x= y= ordre= ; */ rc=h.find_prev(); /* debug put x= y= ordre=; */ put '**recherche point a eliminer point num ' ordre rc=; /* END;*/ put 'point a eliminer point num ' ordre ; /* convexe='0'; *//** on marque l elimination sur le point A1 **/ /* rc=h.replacedup();*/ rc=h.removedup() ; put 'REMOVE' rc= ; /*DO UNTIL (convexe^='0');*/ rc=h.find_prev(); put 'PREV apres REMOVE ' rc= ; put "recherche point A1 point num " ordre; /*END;*/ put "point A1 point num " ordre ; Xa1=X;Ya1=Y; /*DO UNTIL (convexe^='0');*/rc=h.find_prev(); put 'PREV apres REMOVE ' rc= ; put "recherche point A2 point num " ordre; /*END;*/ put "point A2 point num " ordre ; Xa2=X;Ya2=Y; /*DO UNTIL (convexe^='0');*/rc=h.find_next(); put "recherche point test principal point num " ordre ; /*END;*/ /*DO UNTIL (convexe^='0');*/rc=h.find_next(); put "recherche point test principal point num " ordre ; /*END;*/ put "point test trouvé point num " ordre;
ci-dessous le programme fonctionnel
ci-dessous le programme adapté avec removedup mais qui plante...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
77
78
79
80 DATA _null_; LENGTH r Xa2 Ya2 Xa1 Ya1 8 vect 8; DECLARE HASH h(DATASET:'calcul', MULTIDATA: 'y', ORDERED: 'y'); h.DEFINEKEY('id'); h.DEFINEDATA('id', 'Tg_theta','x','y','convexe','ordre'); h.DEFINEDONE(); CALL MISSING (id,Tg_theta,x,y,ordre); DO ID= 1 TO &nb ; /** calcul de chaque ensemble pris un à un **/ put "*******DEBUT CONVEXE******** convexe numero " id ; Xa2=.;Ya2=.;Xa1=.;Ya1=.; /** initialisation vecteur de calcul */ rc=h.find(); /* positionnement sur le premier point de l ensemble **/ DO WHILE (rc=0); /** bouclage sur tout les points de l ensemble **/ /** B0 **/ IF Xa2=. THEN do; DO UNTIL (Xa2^=.);/** B1 chargement des premiers termes du vecteur de calcul **/ Xa2=Xa1;Ya2=Ya1;Xa1=X;Ya1=Y; put 'intialisation point num ' ordre; rc=h.find_next(); END; /** fin B1 **/ end; PUT ' apres initialisalition point num ' ordre; /** rmq produit vectoriel Vect=(Xa2-Xa1)*(Y-Ya1)-(Ya2-Ya1)*(X-Xa1)>0 sens direct **/ DO WHILE(convexe='0');rc=h.find_next();put 'test vect point num ' ordre ;END; vect=(Xa2-Xa1)*(Y-Ya1)-(Ya2-Ya1)*(X-Xa1); put '*' vect=; if vect>0 THEN DO; /** le point est bon on passe au point suivant **/ Xa2=Xa1;Ya2=Ya1;Xa1=X;Ya1=Y; rc=h.find_next(); put 'branche OK test vect point ordre num ' ordre; END; ELSE DO; /** le point A1 est à l interieur du convexe on l invalide --> convexe=0 **/ put 'branche non OK test vect point ordre num ' ordre ; put "convexe " convexe ; DO UNTIL (convexe^='0'); /* debug put x= y= ordre= ; */ rc=h.find_prev(); /* debug put x= y= ordre=; */ put '**recherche point a eliminer point num ' ordre rc=; END; put 'point a eliminer point num ' ordre ; convexe='0'; /** on marque l elimination sur le point A1 **/ rc=h.replacedup(); /* put rc= ;*/ DO UNTIL (convexe^='0');rc=h.find_prev(); put "recherche point A1 point num " ordre; END; put "point A1 point num " ordre ; Xa1=X;Ya1=Y; DO UNTIL (convexe^='0');rc=h.find_prev(); put "recherche point A2 point num " ordre; END; put "point A2 point num " ordre ; Xa2=X;Ya2=Y; DO UNTIL (convexe^='0');rc=h.find_next(); put "recherche point test principal point num " ordre ; END; DO UNTIL (convexe^='0');rc=h.find_next(); put "recherche point test principal point num " ordre ; END; put "point test trouvé point num " ordre; END; END;/** fin B0 **/ put "*******FIN CONVEXE******** convexe numero " id ; END; rc=h.output(dataset: 'work.fin2'); put rc= ; RUN;
Le fichier calcul est dans le zip calcul.zip
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
77
78
79
80 DATA _null_; LENGTH r Xa2 Ya2 Xa1 Ya1 8 vect 8; DECLARE HASH h(DATASET:'calcul', MULTIDATA: 'y', ORDERED: 'y'); h.DEFINEKEY('id'); h.DEFINEDATA('id', 'Tg_theta','x','y','convexe','ordre'); h.DEFINEDONE(); CALL MISSING (id,Tg_theta,x,y,ordre); DO ID= 1 TO &nb ; /** calcul de chaque ensemble pris un à un **/ put "*******DEBUT CONVEXE******** convexe numero " id ; Xa2=.;Ya2=.;Xa1=.;Ya1=.; /** initialisation vecteur de calcul */ rc=h.find(); /* positionnement sur le premier point de l ensemble **/ DO WHILE (rc=0); /** bouclage sur tout les points de l ensemble **/ /** B0 **/ IF Xa2=. THEN do; DO UNTIL (Xa2^=.);/** B1 chargement des premiers termes du vecteur de calcul **/ Xa2=Xa1;Ya2=Ya1;Xa1=X;Ya1=Y; put 'intialisation point num ' ordre; rc=h.find_next(); END; /** fin B1 **/ end; PUT ' apres initialisalition point num ' ordre; /** rmq produit vectoriel Vect=(Xa2-Xa1)*(Y-Ya1)-(Ya2-Ya1)*(X-Xa1)>0 sens direct **/ DO WHILE(convexe='0');rc=h.find_next();put 'test vect point num ' ordre ;END; vect=(Xa2-Xa1)*(Y-Ya1)-(Ya2-Ya1)*(X-Xa1); put '*' vect=; if vect>0 THEN DO; /** le point est bon on passe au point suivant **/ Xa2=Xa1;Ya2=Ya1;Xa1=X;Ya1=Y; rc=h.find_next(); put 'branche OK test vect point ordre num ' ordre; END; ELSE DO; /** le point A1 est à l interieur du convexe on l invalide --> convexe=0 **/ put 'branche non OK test vect point ordre num ' ordre ; put "convexe " convexe ; /*DO UNTIL (convexe^='0');*/ /* debug put x= y= ordre= ; */ rc=h.find_prev(); /* debug put x= y= ordre=; */ put '**recherche point a eliminer point num ' ordre rc=; /* END;*/ put 'point a eliminer point num ' ordre ; /* convexe='0'; *//** on marque l elimination sur le point A1 **/ /* rc=h.replacedup();*/ rc=h.removedup() ; put 'REMOVE' rc= ; /*DO UNTIL (convexe^='0');*/ rc=h.find_prev(); put 'PREV apres REMOVE ' rc= ; put "recherche point A1 point num " ordre; /*END;*/ put "point A1 point num " ordre ; Xa1=X;Ya1=Y; /*DO UNTIL (convexe^='0');*/rc=h.find_prev(); put 'PREV apres REMOVE ' rc= ; put "recherche point A2 point num " ordre; /*END;*/ put "point A2 point num " ordre ; Xa2=X;Ya2=Y; /*DO UNTIL (convexe^='0');*/rc=h.find_next(); put "recherche point test principal point num " ordre ; /*END;*/ /*DO UNTIL (convexe^='0');*/rc=h.find_next(); put "recherche point test principal point num " ordre ; /*END;*/ put "point test trouvé point num " ordre; END; END;/** fin B0 **/ put "*******FIN CONVEXE******** convexe numero " id ; END; rc=h.output(dataset: 'work.fin2'); put rc= ; RUN;
Merci de votre aide
Partager