|
|
|
|
Posté par
chreks, le dimanche 13 mai 2007 à 23:54:11Principe général
Il fonctionne sur le principe de la recherche du « meilleur-d’abord » (Best first search).
On dispose d’une situation initiale START bien connue, d’une (ou plusieurs) situation(s) finale(s) déterminée(s) GOAL. La préoccupation est alors de trouver comment passer de START à GOAL avec un coûts minimal ou un profit maximum.
On appelle état l’ensemble des informations permettant d’identifier un sous - problème. Pour passer d’un état à un autre, on dispose d’opérateurs apportant un gain additif. Appliquer ces opérateurs à un état s’appelle développer l’état. Réciproquement, on suppose qu’on dispose de marqueurs permettant de retrouver les développements successifs ayant conduit à une solution. Car c’est d’avantage le cheminement nécessaire pour identifier une solution que la solution elle même qui compte dans cette approche : cette dernière étant connue.
Une fonction d’évaluation
En fait l’algorithme parcours un arbre de recherche et, pour éviter de s’engager vers un noeud par un chemin plus mauvais qu’un précédant, il va stocker des informations sur les nœuds qu’il parcours. Pour cela, il va évaluer la qualité du nœud auquel il se trouve grâce à une fonction d’évaluation f.
Lorsque l’on examine l’état v, on connaît le coût de START à v : c’est la somme des coût c(START, v1), c(v1, v2), …, c(vk, GOAL) des opérateurs nécessaires pour passer de START à v. Mais, à moins que v = GOAL, le coût (« futur ») de v à GOAL est inconnu : on ne peut que l’estimer.
En général, la fonction d’évaluation est donc définie comme la somme de deux autres fonctions notées couramment g et h, telles que pour un nœud donné v:
· g donne le coût du chemin déjà parcouru depuis la racine, de START à v,
·
v
h est une estimation du coût du chemin restant à faire jusqu’au nœud final, de v à GOAL.
Figure 1 : Recherche avec l’algorithme A*
Mais on peut aussi pondérer le rapport entre le gain connu g et le gain espéré h par la formule du type f = w.g + (1 - w).h où wÎ[0; 1].
L’idéal est d’avoir une estimation exacte de cette distance, ainsi l’effort d’exploration de l‘espace de recherche sera minimal. Cependant de telles estimations demandent souvent trop de temps de calcul pour être applicables. Il faut donc trouver un compromis entre le temps de calcul et l’exploration de l’espace de recherche pour rendre l’algorithme pratiquement acceptable [Nils82] [PeKi82].
C’est pour cela qu’on parle de stratégie informée. En effet, à tout instant, pour chaque nœud, on doit pouvoir fournir une estimation de la valeur du chemin restant à parcourir.
L’algorithme
Le principe de l’algorithme consiste à chaque étape à choisir un état u dans la liste A_VOIR (1°) des états à développer, initialement égale à START, et ce jusqu'à ce que GOAL ait été identifié, ou que cette liste soit vide (le problème n’admet pas de solution). Cette sélection suit une stratégie « meilleur d’abord », dans la mesure où l’élément sélectionné dans A_VOIR est celui dont l’évaluation est la meilleure.
On supprime u de A_VOIR pour l’ajouter à la liste DEJA_VU (2°), initialement vide, qui contient l’ensemble de tous les états parcourus pendant la recherche.
Par application d’opérateurs sur l’état sélectionné u, on obtient de nouveaux états vi, les successeurs de u, que l’on ajoute à la liste A_VOIR (3°).
Si ces situations vi ont déjà été envisagées, mais avec un coût moindre, on met les coût à jour, et on considère que l’état doit être réexaminé en tenant compte de cette nouvelle situation.
Cela donne de manière plus formelle :
1. Fonction A_star(START, GOAL : T_Data) : T_Path
2. A_VOIR ← {START} // Liste des éléments à développer
3. DEJA_VU ← Æ // Liste des éléments déjà explorés
4. u ← Æ
5. Tant que (A_VOIR ≠ Æ) et (u ≠ GOAL) faire
6. v ← Choix_dans(A_VOIR) // En meilleur d’abord
7. Si (u ¹ G) alors
8. A_VOIR ← A_VOIR \ {u}
9. DEJA_VU ← DEJA_VU È {u}
10. LISTE_FILS ← Developper(u) // En appliquant les opérateurs
11. Pour chaque v dans LISTE_FILS faire
12. Si (v Ï (A_VOIR È DEJA_VU)) alors
13. A_VOIR ← A_VOIR È {(v; f(v))}
14. Pred(v) ← u
15. Sinon
16. w ← Pred(v)
17. Si (g(w) + c(w, v) < g(u) + c(u, v)) alors
18. Pred(v) ← u
19. g(v) ← g(u) + c(u, v)
20. f(v) ← g(v) + h(v)
21. Si (v Î DEJA_VU) alors
22. DEJA_VU ← DEJA_VU \ {v}
23. A_VOIR ← A_VOIR È {v}
24. Fin_Si
25. Fin_Si
26. Fin_Si
27. Fin_Pour
28. Fin_Si
29. Fin_TantQue
30. Si (u = GOAL) alors
31. Retourner (START, ..., Pred(Pred(u)), Pred(u), u)
32. Sinon
33. Pas de solution
34. Fin_Si
Configuration: Windows XP Firefox 2.0.0.3
s'il vous plait, j'ai vraiment besoin de vous !
je viens encore vous redemander de l'aide sur un parcours d'arbre ternaire en récursif! merci beaucoup! |
donner l'algorithme de parcoure d'un arbre binaire(ifixe, postefixe,prefixe) en c++ |
#include<stdio.h>
#include<string.h> #include<stdlib.h> #define size 100 //definition d'un noeud typedef struct noeudarbre *point; typedef struct noeudarbre { char valeur; point droite,gauche; }; point tab[size]; int sommet=0,base=0; point fils[size]; int front=0,rear=-1; void affich_menu(void); point lirarbre(char *ch); void empiler(point c); point depiler(void); void emfiler(point c); point defiler(void); void p_lvr(point c); void p_lrv(point c); void p_vlr(point c); void p_p_n(point c); int alpha(char); /*****************************************************************/ /*********************** Programme principal *********************/ int main() { /* Declaration des variables et initialisation */ char arbre[20]; int choix = -1; while(choix != 0) { /* affichage du menu */ affich_menu(); /* saisie du choix */ printf("\tVotre choix:\n"); scanf("%d",&choix); /* acces au choix demandé */ switch(choix) { case 1: { printf("lire arbre:-->\n"); printf("entrer l'arbre exprission parenthésée:\n\n"); scanf("%s",arbre); point lirarbre(char arbre); break; } case 2: { printf("parcoure (lvr):-->\n"); void p_lvr(point c); break; } case 3: { printf("parcoure (lrv):-->\n"); void p_lrv(point c); break; } case 4: { printf("parcoure (vlr):-->\n"); void p_vlr(point c); break; } case 5: { printf("parcoure (par niveau):-->\n"); p_p_n(tab[0]); break; } case 0:break; default :{ printf("Choix impossible.\n"); break; } } printf("\n\n"); } } /***************************************************************/ /************************ Definition des prototypes ************/ /***************************************************************/ /* Nom de la fonction:affich_menu */ /* But:affiche le menu */ /* Entrees: */ /* Sorties: */ /***************************************************************/ void affich_menu() { printf("\t\tManipulation d'arbre binaire:\n\n"); printf("\t1-> Creation d'un arbre binaire.\n"); printf("\t2-> parcore lvr(infixé-->inorder).\n"); printf("\t3-> parcore lrv (postfixé-->postorder).\n"); printf("\t4-> parcore vlr (préfixé-->preoder).\n"); printf("\t5-> parcore par niveau.\n"); printf("\t0-> Quitter\n\n"); } point lirarbre(char *ch) { int statut=0; int i; point p,r; for(i=0;i<strlen(ch);i++) { printf("\ntraitement de %c\n",ch[i]); if(alpha(ch[i])) { p=(point)malloc(sizeof (noeudarbre)); if(p!=NULL)printf("\npointeur crée\n"); p->valeur=ch[i]; if(p->valeur==ch[i])printf ("valeur ajoutée"); p->droite=NULL; p->gauche=NULL; if (statut==1)tab[sommet-1]->gauche=p; if (statut==2) tab[sommet-1]->droite=p; if (ch[i+1]=='(')empiler(p); } if(ch[i]==')')r=depiler (); if(ch[i+1]==',') statut=2; if(ch[i]=='(') { if(ch[i+1]==',') statut=2; else statut=1; } } } void empiler(point c) { if(sommet<20) { tab[sommet]=c; sommet++; } else { printf("pile pleine"); exit(-1); } } point depiler() { if(sommet!=base) { sommet--; return tab[sommet]; } else return NULL; } void emfiler(point c) { rear=(rear-1)%size; if(front==rear) rear= (rear-1)%size; else fils[rear]=c; } point defiler(void) { if(front!=rear) rear=(rear-1)%size; return fils[rear]; } /*parcours postfixé (postorder)*/ void p_lrv(point c) { int fin; fin=0; do{ while(c!=NULL) {empiler(c); printf("%c",c->valeur); c=c->gauche; } if(sommet>=0) { c=depiler(); c=c->droite; } else fin=1; }while(fin==0); } /*parcours infixé(inorder)*/ void p_lvr(point c) { int fin; fin=0; do{ while(c!=NULL) {empiler(c); c=c->gauche; } c=depiler(); if(c!=NULL) { printf("%c",c->valeur); c=c->droite; } else fin=1; }while(!fin); } /*parcours préfixé (preorder)*/ void p_vlr(point c) { int fin=0; do{ while(c!=NULL) {empiler(c); c=c->gauche; } if(sommet>=0) { c=depiler(); printf("%c",c->valeur); c=c->droite; } else fin=1; }while(fin==0) ; } //fonction d'affichage void p_p_n(point c) { if(c!=NULL) { printf("*** %c fils droit %c fils gauche %c\n",c->valeur,c->droite->valeur,c->gauche->valeur); p_p_n(c->gauche); p_p_n(c->droite); } } int alpha(char b) { char val[26]="z"; int i; for(i=0;i<27;i++)if(val[i]==b)return 1; return 0; }
|
je veux remerci bcp Mer Mohamed |
je veux remerci bcp Mer Mohamed |
aide moi comment j'affiche le menu d'une base de données pour sortis avec un petit logiciel ( je travail avec l'accese) |
bon jour à tout le monde; c-v-p aide moi comment j'analysée avec gcov et profilé avec gpof sous linux.
merci à la vance |
J'ai un problème avec mon windows, vous pouvez m'aider ? svp |
| 18/05 04h22 | Lutter contre le spam | Spam |
| 15/01 02h30 | Le problème du cavalier d'Euler | Prolog |
| 12/01 10h46 | [Windows XP] Mise en place d'un réseau privé virtuel (VPN) | Windows XP |
| 10/04 20h18 | Structure logique d'un disque dur | Disque dur |
| 11/07 20h42 | Affichage hiérarchique et groupé des messages | Mozilla Thunderbird |
| 04/05 17h12 | C++ parcours iteratif arbres binaires | 1 |
| 19/10 17h58 | [C] Parcours d'une liste chainee | 7 |
| 09/07 18h56 | [Wild life park 2, mon CE] problème arbres | 0 |
| 01/07 16h13 | Conteneurs d'arbres en c++ | 0 |
![]() | Genopro - Genolog est un logiciel de généalogie permettant de construire un arbre généalogique sur plusieurs générations. Il s'agit... | Catégorie: Bureautique Licence: Freeware/gratuit |
![]() | X-Mas Tree - X-Mas Tree est tout simplement un programme permettant de concevoir un arbre de Noël virtuel. Cette nouvelle version propose... | Catégorie: Graphisme Licence: Freeware/gratuit |
![]() | CCleaner - CCleaner (Crap Cleaner) est un utilitaire de nettoyage gratuit permettant de garantir un respect de la vie privée en... | Catégorie: Anonymat/Confidentialité Licence: Freeware/gratuit |
![]() | Free Mp3 Wma Converter - Free Mp3 Wma Converter permet de convertir tout vos fichiers Mp3 , Wma , Ogg , AAC , m4a , mp4 , Ape , flac, Wav : ... | Catégorie: Conversion Licence: Freeware/gratuit |
![]() | Sony CMT-CPZ2 | Catégorie: Chaîne Hi-Fi | 185.00 € Ubaldi |
![]() | Plextor PX-608CU CD-RW/DVD+/-RW (+/-R | Catégorie: Graveur CD/DVD | 113.99 € Rue du Commerce |
![]() | Philips SPD3400CC CD-RW/DVD+/-RW (+/-R | Catégorie: Graveur CD/DVD | 60.88 € Compufirst |
![]() | Philips SPD3500CC CD-RW/DVD+/-RW (+/-R | Catégorie: Graveur CD/DVD | 68.00 € Compufirst |