Je voudrais mettre en place un algorithme de recherche de chemin sur un Arduino, donc avec une faible empreinte mémoire et très peu de puissance CPU
Je viens juste de commencer ce projet et voudrait utiliser un simple fichier texte contenant le plan des salles, murs et les objets que je voudrais atteindre séquentiellement
(pour l'instant, je préfère développer l'algorithme sur mon PC afin de pouvoir le tester/débugger un max avant de porter ça sur une plateforme Arduino)
Le plan est pour l'instant tout simplement stocké dans une fichier texte tel que celui-ci
(où les + - et | indiquent les murs et les lettres les positions séquentielles par lesquelles passer]
Et je voudrais utiliser ce style de programme en C afin de trouver le meilleur chemin afin de passer séquentiellement par les chemins A, B, C puis D
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 |---------------------------| | A | | D | |--- ------ ------- ---- | | | | B C | |---------------------------|
Ce qui donne pour l'instant ceci, la recherche du plus court chemin n'y étant pas encore implémentée
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 #include <stdio.h> #include <stdlib.h> #include <string.h> #define WIDTH 80 #define HEIGHT 25 char Map[HEIGHT][WIDTH]; int LoadMap( char *mapname ) { FILE *file; int nLines = 0; char buf[80]; file = fopen(mapname, "r" ); if( file ) { nLines = 0; memset(Map, 0, 80*25); while ( fgets( buf , 80, file) ) { nLines++; strcpy(Map[nLines], buf); printf("%s", Map[nLines] ); } // printf("%d lines read \n", nLines); fclose(file); } else { printf("Cannot open the file %s :( \n", mapname); return -1; } return nLines; } int FindPosition( char object, int *xpos, int *ypos) { int x, y; int xa, ya, xb, yb; // printf("Search the position of the object %c \n", object); // Search the src coordinates for ( y = 0 ; y < HEIGHT ; y++) { for( x = 0 ; x < WIDTH ; x++) { if( Map[y][x] == 0 ) break; if( Map[y][x] == object ) { *xpos = x; *ypos = y; // printf("object %c finded at (%d,%d) \n", object, x, y); } } } } int FindPath( char src, char dst) { int xa, ya, xb, yb; // printf("Search the best path between %c and %c \n", src, dst); (void) FindPosition(src, &xa, &ya); (void) FindPosition(dst, &xb, &yb); printf("\tTODO : search the best path between %c(%d,%d) and %c(%d,%d) \n", src, xa, ya, dst, xb, yb); return 0; } int FindPaths( char *paths ) { printf("Find the best path %s \n\n", paths); for( int i = 0 ; i < strlen(paths) - 1 ; i++ ) { FindPath( paths[i] , paths[i+1] ); } } int main( int argc, char **argv ) { printf("Pathfinding v0.0 by Cyclone \n\n"); (void) LoadMap( argc > 1 ? argv[1] : "plan.map"); // FindPath('A', 'B'); FindPaths("ABCD"); return 0; }
(et c'est justement ce que je veux y faire ...)
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 Pathfinding v0.0 by Cyclone |---------------------------| | A | | D | |--- ------ ------- ---- | | | | B C | |---------------------------| Find the best path ABCD TODO : search the best path between A(5,4) and B(2,8) TODO : search the best path between B(2,8) and C(18,8) TODO : search the best path between C(18,8) and D(19,5)
Le problème étant bien entendu d'implémenter correctement la fonction int FindPath( char src, char dst), cf. les TODO, afin qu'elle trouve le meilleur chemin entre le point src et le point dst en évitant bien sûr de jouer le passe-muraille, sinon ce serait trop simple
Mon idée première serait de calculer la droite entre les points source et destination, puis d'essayer de "coller" un maximum à cette droite en adaptant le chemin parcouru à chacun des pas en tenant compte des obstacles présents entre la position courante et le prochain déplacement avant/arrière/gauche/droite à faire afin de contourner les différents obstacles trouvés tout en cherchant à m'éloigner au minimum de cette droite idéale
(les obstacles sont pour l'instant simplement les murs représentés par des - et des | mais je pense y rajouter d'autres obstacles comme des chaises ou ds tables qui utiliseront d'autres symboles que les lettre alphabétiques que je réserve au différents points par lesquels je voudrais passer)
Partager