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