Comprendre le pseudo-code dans l'algorithme de Donald B. Johnson

voix
5

Est -ce que quelqu'un sait l' algorithme de Donald B. Johnson , qui énumère tous les circuits élémentaires (cycles) dans un dirigé graphique?

J'ai le papier qu'il avait publié en 1975, mais je ne comprends pas le pseudo-code.

Mon objectif est de mettre en œuvre cet algorithme en Java.

Quelques questions que j'ai, par exemple, quelle est la matrice A k il se réfère. Dans le pseudocode, il mentionne que

Ak:=adjacency structure of strong component K with least 
    vertex in subgraph of G induced by {s,s+1,....n};

Est -ce que cela signifie que je dois mettre en œuvre un autre algorithme qui trouve la A k matrice?

Une autre question est ce que les moyens suivants?

begin logical f; 

Est -ce aussi la ligne logical procedure CIRCUIT (integer value v);signifie que la procédure de circuit retourne une variable logique? Dans le pseudocode a aussi la ligne « CIRCUIT := f;». Qu'est-ce que ça veut dire?

Ce serait formidable si quelqu'un pouvait traduire le pseudocode de 1970 à un type de pseudocode plus moderne, donc je peux le comprendre

Si vous êtes intéressé à aider, mais vous ne trouvez pas le papier s'il vous plaît écrivez-moi à pitelk@hotmail.com et je vous enverrai le papier.

Créé 25/05/2010 à 22:14
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
7

Le pseudo-code rappelle Algol, Pascal ou Ada.

Est -ce que cela signifie que je dois mettre en œuvre un autre algorithme qui trouve la A k matrice?

A k semble être une liste de tableaux de valeurs d'entrée ayant les propriétés spécifiées. Il peut être lié à la correspondante matrice de contiguïté , mais ce n'est pas clair pour moi. Je devine que quelque chose comme ceci:

int[][] a = new int[k][n];
int[][] b = new int[k][n];
boolean[] blocked = new boolean[n];
int s;

Qu'est - ce que logical fveut dire?

Ceci déclare une variable locale représentant une trueou falsevaleur, similaire à Java de boolean.

logical procedure CIRCUIT (integer value v);

Ceci déclare un sous - programme nommé CIRCUITayant un seul paramètre entier vqui est passé par valeur. Le sous - programme retourne un logicalrésultat de trueou false, et CIRCUIT := fattribue fle résultat. En Java,

boolean circuit(int v) {
    boolean f;
    ...
    f = false;
    ...
    return f;
}

Les mots - clés beginet enddélimitent un champ de blocs qui peuvent être imbriquées, donc CIRCUITest niché dans le bloc principal et UNBLOCKest imbriqué à l' intérieur de CIRCUIT. :=est l' affectation; ¬est not; est un élément; est vide; est !=; stacket unstacksuggérer pushet pop.

Il est seulement un début, mais j'espère que cela aide.

Addendum: A la réflexion, Aet Bdoit être isomorphe.

Voici un littéral aperçu. Je ne connais pas assez A, Bet Vde choisir une meilleure structure de données que les tableaux.

import java.util.Stack;

public final class CircuitFinding {
    static int k, n;
    int[][] a = new int[k][n];
    int[][] b = new int[k][n];
    boolean[] blocked = new boolean[n];
    int[] v = new int[k];
    int s = 1;
    Stack<Integer> stack = new Stack<Integer>();

    private void unblock(int u) {
        blocked[u] = false;
        for (int w : b[u]) {
            //delete w from B(u)
            if (blocked[w]) {
                unblock(w);
            }
        }
    }

    private boolean circuit(int v) {
        boolean f = false;
        stack.push(v);
        blocked[v] = true;
        L1:
        for (int w : a[v]) {
            if (w == s) {
                //output circuit composed of stack followed by s;
                f = true;
            } else if (!blocked[w]) {
                if (circuit(w)) {
                    f = true;
                }
            }
        }
        L2:
        if (f) {
            unblock(v);
        } else {
            for (int w : a[v]) {
                //if (v∉B(w)) put v on B(w);
            }
        }
        v = stack.pop();
        return f;
    }

    public void main() {
        while (s < n) {
            //A:= adjacency structure of strong component K with least
            //vertex in subgraph of G induced by {s, s+ 1, n};
            if (a[k] != null) {
                //s := least vertex in V;
                for (int i : v) {
                    blocked[i] = false;
                    b[i] = null;
                }
                L3:
                circuit(s);
                s++;
            } else {
                s = n;
            }
        }
    }
}
Créé 26/05/2010 à 06:09
source utilisateur

voix
1

Vous pouvez trouver une implémentation Java de cet algorithme sur github: https://github.com/1123/johnson . Il utilise la bibliothèque java graphique Jung2.

Créé 13/02/2013 à 21:47
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more