Bonjour a tous,
Je suis débutante en matlab et je souhaiterai un coup de main. S'il y a bien un gentil développeur qui voudrait bien jeter un coup d’œil à mon code, cela m'aidera énormément.
J'ai un graphe eulérien et je veux énumérer tout les chemins possibles. J'ai trouvé un code qui trouve juste un seul chemin et je suis en train de le modifier. Mon idée est de rendre l'algorithme récursif, appeler la fonction a chaque nœuds. Sauf que voila je me perd dans toutes les imbrications et j'ai besoin d'un coup de main. Je vous met en premier lieux le code que j'ai trouver. Et ensuite ce que j'ai gribouiller.
le code trouvé :
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 nb_edge = ne(g); elist = zeros(nb_edge,2); step = 0; v = start; % ne : fonction qui retourne le nombre de sommets while ne(h) step = step+1; next = neighbors(h,v); % if v has even degree (or only one neighbor) any neighbor will do if (mod(length(next),2) == 0) || (length(next) == 1) w = next(1); else for w=next % make sure vw is not a cut edge delete(h,v,w); clf;ndraw(h); if (has_path(h,v,w)) break else add(h,v,w) % restore the edge clf;ndraw(h) end end end delete(h,v,w); clf;ndraw(h); elist(step,:) = [v,w]; v = w; end
Et voici mon horrible création :
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 function chemin=tour (h1,v,elist,step) if ne(h1)~=0 next = neighbors(h1,v); % if v has even degree (or only one neighbor) any neighbor will do if ((mod(length(next),2) == 0)&& isempty(next)) || (length(next) == 1) w = next(1); delete(h1,v,w); elist(step,:) = [v,w]; step = step+1; else for voisin=1:size(next,2) w=next(voisin); nb=nb+1; substep{nb}=step; subgraph{nb}=graph; copy(subgraph{nb},h1); sublist{nb}=elist; % make sure vw is not a cut edge delete(subgraph{nb},v,w); if (has_path(subgraph{nb},v,w)) nb_path=nb_path+1; % rappel de fonction delete(subgraph{nb},v,w); sublist{nb}(substep{nb},:) = [v,w]; substep{nb} = substep{nb}+1; elist = tour(subgraph{nb},w,sublist{nb},substep{nb}); else add(h1,v,w) % restore the edge clf;ndraw(h1) chemin=elist; w=next(voisin+1); end end end v = w; elist=tour (h1,v,elist,step); end chemin=elist chemins{nb}=elist; free(h1); end
Partager