να βοηθήσει στην αλγόριθμο του Donalds Β Τζόνσον, δεν μπορώ να καταλάβω τον κωδικό ψευδο (ΜΕΡΟΣ ΙΙ)

ψήφοι
6

δεν μπορώ να καταλάβω ένα συγκεκριμένο τμήμα του εγγράφου που δημοσιεύθηκε από τον Donald Johnson για την εύρεση κύκλους (κυκλώματα) σε ένα γράφημα.

Πιο συγκεκριμένες i δεν μπορεί να καταλάβει τι είναι η μήτρα Ak η οποία αναφέρεται στην ακόλουθη γραμμή του κώδικα ψευδο:

Ak: = δομή γειτνίαση των ισχυρή συνιστώσα Κ με τουλάχιστον κορυφή στο υπογράφο του G που επάγεται από {s, s + 1, .... n}?

για να κάνουν τα πράγματα χειρότερα μερικές γραμμές μετά mentins «για το i στο Vk κάνει» χωρίς να δηλώσει ποια είναι η Vk είναι ...

Σε ό, τι έχω καταλάβει έχουμε τα εξής: 1) Σε γενικές γραμμές, μια ισχυρή συνιστώσα είναι ένα υπο-γράφημα ενός γραφήματος, όπου κάθε κόμβος αυτής της υπο-γράφημα είναι ένα μονοπάτι σε κάθε κόμβο του υπο-γράφημα ( με άλλα λόγια, μπορείτε να έχετε πρόσβαση σε κάθε κόμβο του υπο-γράφημα από οποιοδήποτε άλλο κόμβο του υπο-γράφημα)

2) ένα υπο-γράφημα που επάγεται από κατάλογο των κόμβων είναι μία γραφική παράσταση που περιέχει όλα αυτά τα κόμβων συν όλες τις ακμές που συνδέουν αυτούς τους κόμβους. σε χαρτί η μαθηματική ορισμός είναι F είναι ένα υπογράφημα του G που επάγεται από το W, εάν το W είναι υποσύνολο του V και F = (W, {u, y) | u, y σε W και (u, y) σε Ε)}) όπου u, y είναι τα άκρα, E είναι το σύνολο όλων των ακμών στο γράφημα, το W είναι ένα σύνολο κόμβων.

3) στην εφαρμογή κώδικα οι κόμβοι ονομάζονται με ακέραιο αριθμό 1 ... n.

4) Θα υποψιάζομαι ότι η Vk είναι το σύνολο των κόμβων του ισχυρού συστατικού Κ

τώρα στην ερώτηση. Ας πούμε έχουμε ένα γράφημα G = (V, E) με V = {1,2,3,4,5,6,7,8,9} που μπορεί να διαιρεθεί σε 3 ισχυρά συστατικά η SC1 = {1, 4,7,8} SC2 = {2,3,9} SC3 = {5,6} (και τα άκρα τους)

Μπορεί κανείς να μου δώσει ένα παράδειγμα για s = 1, s = 2, s = 5 Τι κι αν πρόκειται να είναι η Vk και Ak σύμφωνα με τον κώδικα;

Ο κώδικας ψευδο βρίσκεται σε προηγούμενη ερώτησή μου στην κατανόηση της ψευδοκώδικα στον αλγόριθμο του Donald B. Τζόνσον

και το χαρτί μπορεί να βρεθεί στην κατανόηση της pseudocode σε αλγόριθμο του Donald B. Τζόνσον

ευχαριστώ εκ των προτέρων

Δημοσιεύθηκε 30/05/2010 στις 19:50
πηγή χρήστη
Σε άλλες γλώσσες...                            


4 απαντήσεις

ψήφοι
10

Δουλεύει! Σε μια προηγούμενη επανάληψη του αλγορίθμου Johnson , είχα υποτίθεται ότι Aήταν ένας πίνακας γειτνίασης . Αντ 'αυτού, φαίνεται να αποτελούν μια λίστα γειτνίασης . Σε αυτό το παράδειγμα, υλοποιείται κάτω, τις κορυφές {a, b, c} αριθμούνται {0, 1, 2}, αποδίδοντας τα ακόλουθα κυκλώματα.

Προσθήκη: Όπως σημειώνεται σε αυτήν την προτεινόμενη επεξεργασία και χρήσιμη απάντηση , ο αλγόριθμος ορίζει ότι unblock()θα πρέπει να αφαιρέσετε το στοιχείο που έχει την αξία w και όχι το στοιχείο έχει το δείκτη w .

list.remove(Integer.valueOf(w));

Δείγμα εξόδου:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 0 1
1 0 2 1
1 2 0 1
1 2 1
2 0 1 2
2 0 2
2 1 0 2
2 1 2

Από προεπιλογή, το πρόγραμμα ξεκινά με s = 0? εφαρμογή s := least vertex in Vόπως η βελτιστοποίηση παραμένει. Μια παραλλαγή που παράγει μόνο μοναδικό κύκλων φαίνεται εδώ .

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * @see http://dutta.csc.ncsu.edu/csc791_spring07/wrap/circuits_johnson.pdf
 * @see https://stackoverflow.com/questions/2908575
 * @see https://stackoverflow.com/questions/2939877
 * @see http://en.wikipedia.org/wiki/Adjacency_matrix
 * @see http://en.wikipedia.org/wiki/Adjacency_list
 */
public final class CircuitFinding {

    final Stack<Integer> stack = new Stack<Integer>();
    final List<List<Integer>> a;
    final List<List<Integer>> b;
    final boolean[] blocked;
    final int n;
    int s;

    public static void main(String[] args) {
        List<List<Integer>> a = new ArrayList<List<Integer>>();
        a.add(new ArrayList<Integer>(Arrays.asList(1, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 1)));
        CircuitFinding cf = new CircuitFinding(a);
        cf.find();
    }

    /**
     * @param a adjacency structure of strong component K with
     * least vertex in subgraph of G induced by {s, s + 1, n};
     */
    public CircuitFinding(List<List<Integer>> a) {
        this.a = a;
        n = a.size();
        blocked = new boolean[n];
        b = new ArrayList<List<Integer>>();
        for (int i = 0; i < n; i++) {
            b.add(new ArrayList<Integer>());
        }
    }

    private void unblock(int u) {
        blocked[u] = false;
        List<Integer> list = b.get(u);
        for (int w : list) {
            //delete w from B(u);
            list.remove(Integer.valueOf(w));
            if (blocked[w]) {
                unblock(w);
            }
        }
    }

    private boolean circuit(int v) {
        boolean f = false;
        stack.push(v);
        blocked[v] = true;
        L1:
        for (int w : a.get(v)) {
            if (w == s) {
                //output circuit composed of stack followed by s;
                for (int i : stack) {
                    System.out.print(i + " ");
                }
                System.out.println(s);
                f = true;
            } else if (!blocked[w]) {
                if (circuit(w)) {
                    f = true;
                }
            }
        }
        L2:
        if (f) {
            unblock(v);
        } else {
            for (int w : a.get(v)) {
                //if (v∉B(w)) put v on B(w);
                if (!b.get(w).contains(v)) {
                    b.get(w).add(v);
                }
            }
        }
        v = stack.pop();
        return f;
    }

    public void find() {
        while (s < n) {
            if (a != null) {
                //s := least vertex in V;
                L3:
                circuit(s);
                s++;
            } else {
                s = n;
            }
        }
    }
}
Απαντήθηκε 01/06/2010 στις 18:30
πηγή χρήστη

ψήφοι
1

Είχα υποβληθούν οι μια επεξεργασία αιτήματος για κωδικό @ trashgod να καθορίσει την εξαίρεση ρίχνονται μέσα unblock(). Ουσιαστικά, ο αλγόριθμος δηλώνει ότι το στοιχείο w(το οποίο είναι όχι ένας δείκτης) πρέπει να αφαιρεθεί από τον κατάλογο. Ο κωδικός ανωτέρω χρησιμοποιείται list.remove(w), η οποία αντιμετωπίζει wως δείκτη.

Μου να επεξεργαστείτε το αίτημα απορρίφθηκε! Δεν είμαι σίγουρος γιατί, επειδή έχω δοκιμάσει το παραπάνω με την τροποποίηση μου σε ένα δίκτυο 20.000 κόμβους και 70.000 άκρες και δεν συντριβή.

Έχω, επίσης, τροποποιημένο αλγόριθμο Τζόνσον να είναι περισσότερο προσαρμοσμένα στην μη κατευθυνόμενη γραφήματα. Αν κάποιος θέλει αυτές τις αλλαγές, παρακαλούμε επικοινωνήστε μαζί μου.

Παρακάτω είναι ο κωδικός μου unblock().

private void unblock(int u) {
    blocked[u] = false;
    List<Integer> list = b.get(u);
    int w;
    for (int iw=0; iw < list.size(); iw++) {
        w = Integer.valueOf(list.get(iw));
        //delete w from B(u);
        list.remove(iw);
        if (blocked[w]) {
            unblock(w);
        }
    }
}
Απαντήθηκε 12/02/2013 στις 04:05
πηγή χρήστη

ψήφοι
1

@trashgod, δείγμα εξόδου σας περιέχει κύκλο που είναι κυκλική μετάθεση. Για παράδειγμα 0-1-0 και 1-0-1 είναι ίδιες Στην πραγματικότητα η έξοδος θα πρέπει να περιέχει μόνο 5 κύκλο δηλαδή 0 1 0, 0 2 0, 0 1 2 0, 0 2 1 0, 1 2 1,

χαρτί Johnson εξηγεί τι ένας κύκλος είναι: «Δύο στοιχειώδη κυκλώματα είναι διαφορετικά, αν κάποιος δεν είναι μια κυκλική μετάθεση του άλλου. «Κάποιος μπορεί επίσης να ελέγξετε τη σελίδα Wolfram: Αυτό επίσης εξόδου 5 κύκλο για την ίδια είσοδο.

http://demonstrations.wolfram.com/EnumeratingCyclesOfADirectedGraph/

Απαντήθηκε 08/04/2015 στις 12:14
πηγή χρήστη

ψήφοι
1

Η ακόλουθη παραλλαγή παράγει μοναδικά κύκλους. Με βάση αυτό το παράδειγμα , αυτό είναι προσαρμοσμένη από μία απάντηση που παρέχεται από @ user1406062 .

Κώδικας:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;

/**
 * @see https://en.wikipedia.org/wiki/Johnson%27s_algorithm
 * @see https://stackoverflow.com/questions/2908575
 * @see https://stackoverflow.com/questions/2939877
 * @see http://en.wikipedia.org/wiki/Adjacency_matrix
 * @see http://en.wikipedia.org/wiki/Adjacency_list
 */
public final class CircuitFinding {

    final Stack<Integer> stack = new Stack<Integer>();
    final Map<Integer, List<Integer>> a;
    final List<List<Integer>> b;
    final boolean[] blocked;
    final int n;
    Integer s;

    public static void main(String[] args) {
        List<List<Integer>> a = new ArrayList<List<Integer>>();
        a.add(new ArrayList<Integer>(Arrays.asList(1, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 1)));
        CircuitFinding cf = new CircuitFinding(a);
        cf.find();
    }

    /**
     * @param a adjacency structure of strong component K with least vertex in
     * subgraph of G induced by {s, s + 1, n};
     */
    public CircuitFinding(List<List<Integer>> A) {
        this.a = new HashMap<Integer, List<Integer>>(A.size());
        for (int i = 0; i < A.size(); i++) {
            this.a.put(i, new ArrayList<Integer>());
            for (int j : A.get(i)) {
                this.a.get(i).add(j);
            }
        }
        n = a.size();
        blocked = new boolean[n];
        b = new ArrayList<List<Integer>>();
        for (int i = 0; i < n; i++) {
            b.add(new ArrayList<Integer>());
        }
    }

    private void unblock(int u) {
        blocked[u] = false;
        List<Integer> list = b.get(u);
        for (int w : list) {
            //delete w from B(u);
            list.remove(Integer.valueOf(w));
            if (blocked[w]) {
                unblock(w);
            }
        }
    }

    private boolean circuit(int v) {
        boolean f = false;
        stack.push(v);
        blocked[v] = true;
        L1:
        for (int w : a.get(v)) {
            if (w == s) {
                //output circuit composed of stack followed by s;
                for (int i : stack) {
                    System.out.print(i + " ");
                }
                System.out.println(s);
                f = true;
            } else if (!blocked[w]) {
                if (circuit(w)) {
                    f = true;
                }
            }
        }
        L2:
        if (f) {
            unblock(v);
        } else {
            for (int w : a.get(v)) {
                //if (v∉B(w)) put v on B(w);
                if (!b.get(w).contains(v)) {
                    b.get(w).add(v);
                }
            }
        }
        v = stack.pop();
        return f;
    }

    public void find() {
        s = 0;
        while (s < n) {
            if (!a.isEmpty()) {
                //s := least vertex in V;
                L3:
                for (int i : a.keySet()) {
                    b.get(i).clear();
                    blocked[i] = false;
                }
                circuit(s);
                a.remove(s);
                for (Integer j : a.keySet()) {
                    if (a.get(j).contains(s)) {
                        a.get(j).remove(s);
                    }
                }
                s++;
            } else {
                s = n;
            }
        }
    }
}

Παραγωγή:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 2 1

Όλες οι κύκλοι, για αναφορά:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 0 1
1 0 2 1
1 2 0 1
1 2 1
2 0 1 2
2 0 2
2 1 0 2
2 1 2
Απαντήθηκε 10/03/2016 στις 17:09
πηγή χρήστη

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