Comprender el pseudocódigo en el algoritmo de Donald B. Johnson

votos
5

¿Alguien sabe el algoritmo de Donald B. Johnson , que enumera todos los circuitos elementales (ciclos) en una dirección gráfica?

Tengo el papel que había publicado en 1975, pero no puedo entender el pseudocódigo.

Mi objetivo es implementar este algoritmo en Java.

Algunas preguntas que tengo, por ejemplo, es lo que es la matriz A k que se refiere. En el pseudocódigo, se menciona que

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

¿Eso significa que tenga que implementar otro algoritmo que encuentra la A k matriz?

Otra cuestión es lo que los medios siguientes?

begin logical f; 

¿Tiene también la línea logical procedure CIRCUIT (integer value v);significa que el procedimiento devuelve un circuito variable lógica? En el pseudocódigo también tiene la línea CIRCUIT := f;. ¿Qué significa esto?

Sería muy bueno si alguien podría traducirse pseudocódigo de este 1970 a un tipo más moderno de pseudocódigo para que pueda entenderlo

En caso de estar interesado para ayudar pero no se puede encontrar el documento, por favor envíeme un correo electrónico a pitelk@hotmail.com y te va a enviar el documento.

Publicado el 25/05/2010 a las 22:14
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
7

El pseudo-código es una reminiscencia de Algol, Pascal o Ada.

¿Eso significa que tenga que implementar otro algoritmo que encuentra la A k matriz?

A k parece ser una lista de matrices de valores de entrada que tienen las propiedades especificadas. Puede estar relacionado con la correspondiente matriz de adyacencia , pero no es claro para mí. Supongo que algo como esto:

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

Lo que logical fquiere decir?

Esto declara una variable local que representa una trueo falsevalor, similar a la de Java boolean.

logical procedure CIRCUIT (integer value v);

Esto declara un subprograma llamado CIRCUITque tiene un único parámetro entero vque se pasa por valor. El subprograma devuelve un logicalresultado de trueo false, y CIRCUIT := fasigna fcomo el resultado. En Java,

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

Las palabras clave beginy enddelimitan un ámbito de bloque que pueden anidarse, de modo CIRCUITestá anidado en el bloque principal y UNBLOCKestá anidado en el interior de CIRCUIT. :=es la asignación; ¬es not; es elemento; esta vacio; es !=; stacky unstacksugerir pushe pop.

Es sólo un comienzo, pero yo creo que sirve.

Adición: En la reflexión, Ay Bdebe ser isomorfos.

Aquí hay una muy literal contorno. No sé lo suficiente sobre A, By Vpara elegir una mejor estructura de datos de matrices.

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;
            }
        }
    }
}
Respondida el 26/05/2010 a las 06:09
fuente por usuario

votos
1

Se puede encontrar una aplicación Java de este algoritmo en github: https://github.com/1123/johnson . Se utiliza la biblioteca gráfica java Jung2.

Respondida el 13/02/2013 a las 21:47
fuente por usuario

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