(भाग II) Donalds बी जॉनसन एल्गोरिथ्म में मदद, मैं छद्म कोड नहीं समझ सकता

वोट
6

मैं कागज एक ग्राफ में चक्र (सर्किट) खोजने के बारे में डोनाल्ड जॉनसन द्वारा प्रकाशित के एक खास हिस्से नहीं समझ सकता।

अधिक विशिष्ट मैं नहीं समझ सकता क्या मैट्रिक्स एके जो छद्म कोड की निम्न पंक्ति में बताया गया है है:

एके: जी की subgraph द्वारा प्रेरित में कम से कम शीर्ष के साथ मजबूत घटक कश्मीर = समीपता संरचना {s, s + 1, .... n};

की घोषणा क्या Vk है बिना बातें बदतर कुछ लाइनों के बाद है mentins बनाने के लिए Vk में मैं के लिए करते हैं ...

जहाँ तक मैं समझता हूँ कि हम निम्न होना है: 1) सामान्य रूप में, एक मजबूत घटक एक ग्राफ की एक उप-ग्राफ, जो इस उप ग्राफ के हर नोड के लिए में उप ग्राफ के किसी भी नोड के लिए एक रास्ता (है दूसरे शब्दों में आप उप ग्राफ के किसी भी अन्य नोड से उप ग्राफ के किसी भी नोड पहुंच सकता है)

2) एक उप ग्राफ प्रेरित नोड्स की एक सूची से इन सभी नोड्स के साथ साथ इन सभी नोड्स जोड़ने किनारों से युक्त एक ग्राफ है। समाचार पत्र में गणितीय परिभाषा है एफ जी की एक subgraph डब्ल्यू द्वारा प्रेरित है अगर डब्ल्यू वी और एफ = (डब्ल्यू, का उपसमुच्चय होती है {यू, y) | यू, डब्ल्यू में y और (यू, y) ई में)}) जहां यू, वाई किनारों हैं, ई ग्राफ में सभी किनारों का सेट है, डब्ल्यू नोड्स के एक सेट है।

3) कोड लागू करने में नोड्स पूर्णांक संख्या 1 द्वारा नामित कर रहे हैं ... एन।

4) मुझे संदेह है कि Vk मजबूत घटक लालकृष्ण के नोड्स का सेट है

अब सवाल का। चलो कहते हैं कि हम वी = {} 1,2,3,4,5,6,7,8,9 जो इसे 3 मजबूत घटकों SC1 = {1 में विभाजित किया जा सकता है के साथ एक ग्राफ जी = (वी, ई) है, 4,7,8} SC2 = {2,3,9} SC3 = {5,6} (और उनके किनारों)

किसी को भी मेरे लिए रों = 1, एस = 2, एस = 5 क्या हुआ अगर Vk और एके कोड के अनुसार होने जा रहा एक उदाहरण दे सकते हैं?

छद्म कोड में मेरे पिछले सवाल में है डोनाल्ड बी जॉनसन एल्गोरिथ्म में स्यूडोकोड को समझना

और कागज पर पाया जा सकता डोनाल्ड बी जॉनसन एल्गोरिथ्म में स्यूडोकोड को समझना

पहले ही, आपका बहुत धन्यवाद

30/05/2010 को 19:50
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
10

यह काम करता हैं! एक में पहले यात्रा के जॉनसन एल्गोरिथ्म , मैं माना जाता था कि Aएक था निकटता मैट्रिक्स । इसके बजाय, यह एक प्रतिनिधित्व करने के लिए प्रकट होता है समीपता सूची । कि उदाहरण में, नीचे, कोने कार्यान्वित {एक, ख, ग} गिने जा रहे हैं {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

मैं एक sumbitted था संपादित @ 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,

जॉनसन कागज की व्याख्या क्या एक चक्र है: अगर एक दूसरे के एक चक्रीय परिवर्तन नहीं है 'दो प्राथमिक सर्किट अलग हैं। एक ही इनपुट के लिए यह भी उत्पादन 5 चक्र: 'एक भी Wolfram पेज देख सकते हैं।

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