सकर्मक कमी एल्गोरिथ्म: स्यूडोकोड?

वोट
30

मैं एक एल्गोरिथ्म एक ग्राफ पर एक सकर्मक कमी प्रदर्शन करने के लिए की तलाश में गया है, लेकिन सफलता नहीं मिली। मेरी एल्गोरिदम बाईबल (Cormen एट अल द्वारा परिचय करने के लिए एल्गोरिदम) और whilst मैं सकर्मक बंद स्यूडोकोड के बहुत देखा है में कुछ भी नहीं है, मैं एक कम करने के लिए कुछ भी नीचे ट्रैक करने के लिए नहीं कर पाए हैं। निकटतम मुझे मिल गया है Algorithmische Graphentheorie वोल्कर Turau (ISBN: 978-3-486-59057-9) द्वारा में से एक है कि वहाँ है, लेकिन दुर्भाग्य से मैं इस पुस्तक के लिए उपयोग नहीं है! विकिपीडिया बेकार है और गूगल अभी तक कुछ भी आगे बढ़ने की बात है। : ^ (

किसी को भी एक सकर्मक कमी के प्रदर्शन के लिए एक एल्गोरिथ्म का पता है?

06/11/2009 को 23:33
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


7 जवाब

वोट
3

विकिपीडिया लेख Graphviz के भीतर एक कार्यान्वयन के लिए सकर्मक कमी अंक पर (जो खुला स्रोत है)। नहीं बिल्कुल स्यूडोकोड, लेकिन शायद किसी ऐसे स्थान पर शुरू करने के लिए?

LEDA एक शामिल सकर्मक कमी एल्गोरिथ्म । मैं की एक प्रति की जरूरत नहीं है LEDA पुस्तक अब और है, और बाद पुस्तक प्रकाशित किया गया था इस समारोह जोड़ दिया गया है हो सकता है। लेकिन अगर यह वहाँ में है, तो वहाँ एल्गोरिथ्म का अच्छा वर्णन किया जाएगा।

गूगल के लिए अंक एक एल्गोरिथ्म कि किसी बूस्ट में शामिल करने के लिए सुझाव दिया। मैं इसे पढ़ने के लिए कोशिश नहीं की है, तो हो सकता है सही नहीं?

इसके अलावा, इस एक नज़र लायक हो सकता है।

07/11/2009 को 16:42
का स्रोत उपयोगकर्ता

वोट
7

सकर्मक कमी एल्गोरिथ्म मैं प्रयोग किया जाता के बुनियादी सार है


foreach x in graph.vertices
   foreach y in graph.vertices
      foreach z in graph.vertices
         delete edge xz if edges xy and yz exist

सकर्मक बंद एल्गोरिथ्म मैं एक ही स्क्रिप्ट में प्रयोग किया बहुत समान है, लेकिन अंतिम पंक्ति है


         add edge xz if edges xy and yz OR edge xz exist
03/03/2010 को 15:49
का स्रोत उपयोगकर्ता

वोट
3

"Girlwithglasses" के एल्गोरिथ्म भूल जाता है कि एक अनावश्यक किनारे तीन किनारों की एक श्रृंखला अवधि सकता है। सही करने के लिए, गणना क्यू = आर एक्स आर + जहां आर + सकर्मक बंद है और उसके बाद आर कि प्र में दिखाई भी देखें विकिपीडिया लेख से सभी किनारों को हटा दें।

08/12/2010 को 20:42
का स्रोत उपयोगकर्ता

वोट
13

हैरी सू देखें। "एक संयुक्ताक्षर का एक न्यूनतम बराबर ग्राफ को खोजने के लिए एक एल्गोरिद्म।", एसीएम के जर्नल, 22 (1): 11-16 जनवरी 1975 के नीचे सरल घन एल्गोरिथ्म (एक एन एक्स एन पथ मैट्रिक्स का उपयोग करके) DAGs के लिए पर्याप्त होता है, लेकिन सू चक्रीय रेखांकन करने के लिए यह सामान्यीकरण करता।

// reflexive reduction
for (int i = 0; i < N; ++i)
  m[i][i] = false;

// transitive reduction
for (int j = 0; j < N; ++j)
  for (int i = 0; i < N; ++i)
    if (m[i][j])
      for (int k = 0; k < N; ++k)
        if (m[j][k])
          m[i][k] = false;
15/07/2011 को 03:47
का स्रोत उपयोगकर्ता

वोट
1

गहराई-प्रथम छद्म अजगर में एल्गोरिथ्म:

for vertex0 in vertices:
    done = set()
    for child in vertex0.children:
        df(edges, vertex0, child, done)

df = function(edges, vertex0, child0, done)
    if child0 in done:
        return
    for child in child0.children:
        edge.discard((vertex0, child))
        df(edges, vertex0, child, done)
    done.add(child0)

एल्गोरिथ्म उप इष्टतम है, लेकिन पिछले समाधान के बहु बढ़त अवधि समस्या से संबंधित है। परिणाम बहुत क्या tred से Graphviz पैदा करता है के समान हैं।

28/06/2012 को 03:04
का स्रोत उपयोगकर्ता

वोट
3

एलन डोनोवन द्वारा प्रदान की संदर्भ, जो कहते हैं (यदि वहाँ नोड मैं j नोड के लिए से एक रास्ता है जो एक 1 है) आप पथ मैट्रिक्स का उपयोग करना चाहिए के आधार पर निकटता मैट्रिक्स (जो एक 1 है के बजाय तभी एक बढ़त है नोड से मैं j नोड के लिए)।

कुछ नमूना अजगर कोड समाधान के बीच मतभेदों को दिखाने के लिए नीचे इस प्रकार है

def prima(m, title=None):
    """ Prints a matrix to the terminal """
    if title:
        print title
    for row in m:
        print ', '.join([str(x) for x in row])
    print ''

def path(m):
    """ Returns a path matrix """
    p = [list(row) for row in m]
    n = len(p)
    for i in xrange(0, n):
        for j in xrange(0, n):
            if i == j:
                continue
            if p[j][i]:
                for k in xrange(0, n):
                    if p[j][k] == 0:
                        p[j][k] = p[i][k]
    return p

def hsu(m):
    """ Transforms a given directed acyclic graph into its minimal equivalent """
    n = len(m)
    for j in xrange(n):
        for i in xrange(n):
            if m[i][j]:
                for k in xrange(n):
                    if m[j][k]:
                        m[i][k] = 0

m = [   [0, 1, 1, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 1, 1],
        [0, 0, 0, 0, 1],
        [0, 1, 0, 0, 0]]

prima(m, 'Original matrix')
hsu(m)
prima(m, 'After Hsu')

p = path(m)
prima(p, 'Path matrix')
hsu(p)
prima(p, 'After Hsu')

आउटपुट:

Adjacency matrix
0, 1, 1, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 1
0, 0, 0, 0, 1
0, 1, 0, 0, 0

After Hsu
0, 1, 1, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 1
0, 1, 0, 0, 0

Path matrix
0, 1, 1, 1, 1
0, 0, 0, 0, 0
0, 1, 0, 1, 1
0, 1, 0, 0, 1
0, 1, 0, 0, 0

After Hsu
0, 0, 1, 0, 0
0, 0, 0, 0, 0
0, 0, 0, 1, 0
0, 0, 0, 0, 1
0, 1, 0, 0, 0
03/05/2013 को 12:16
का स्रोत उपयोगकर्ता

वोट
0

जावा / jgrapht, @Michael Clerx से इस पृष्ठ पर अजगर नमूना वापस पोर्ट:

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import org.jgrapht.DirectedGraph;

public class TransitiveReduction<V, E> {

    final private List<V> vertices;
    final private int [][] pathMatrix;

    private final DirectedGraph<V, E> graph;

    public TransitiveReduction(DirectedGraph<V, E> graph) {
        super();
        this.graph = graph;
        this.vertices = new ArrayList<V>(graph.vertexSet());
        int n = vertices.size();
        int[][] original = new int[n][n];

        // initialize matrix with zeros
        // --> 0 is the default value for int arrays

        // initialize matrix with edges
        Set<E> edges = graph.edgeSet();
        for (E edge : edges) {
            V v1 = graph.getEdgeSource(edge);
            V v2 = graph.getEdgeTarget(edge);

            int v_1 = vertices.indexOf(v1);
            int v_2 = vertices.indexOf(v2);

            original[v_1][v_2] = 1;
        }

        this.pathMatrix = original;
        transformToPathMatrix(this.pathMatrix);
    }

    // (package visible for unit testing)
    static void transformToPathMatrix(int[][] matrix) {
        // compute path matrix 
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix.length; j++) { 
                if (i == j) {
                    continue;
                }
                if (matrix[j][i] > 0 ){
                    for (int k = 0; k < matrix.length; k++) {
                        if (matrix[j][k] == 0) {
                            matrix[j][k] = matrix[i][k];
                        }
                    }
                }
            }
        }
    }

    // (package visible for unit testing)
    static void transitiveReduction(int[][] pathMatrix) {
        // transitively reduce
        for (int j = 0; j < pathMatrix.length; j++) { 
            for (int i = 0; i < pathMatrix.length; i++) {
                if (pathMatrix[i][j] > 0){
                    for (int k = 0; k < pathMatrix.length; k++) {
                        if (pathMatrix[j][k] > 0) {
                            pathMatrix[i][k] = 0;
                        }
                    }
                }
            }
        }
    }

    public void reduce() {

        int n = pathMatrix.length;
        int[][] transitivelyReducedMatrix = new int[n][n];
        System.arraycopy(pathMatrix, 0, transitivelyReducedMatrix, 0, pathMatrix.length);
        transitiveReduction(transitivelyReducedMatrix);

        for (int i = 0; i <n; i++) {
            for (int j = 0; j < n; j++) { 
                if (transitivelyReducedMatrix[i][j] == 0) {
                    // System.out.println("removing "+vertices.get(i)+" -> "+vertices.get(j));
                    graph.removeEdge(graph.getEdge(vertices.get(i), vertices.get(j)));
                }
            }
        }
    }
}

अध्याय परीक्षा :

import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;

public class TransitiveReductionTest {

    @Test
    public void test() {

        int[][] matrix = new int[][] {
            {0, 1, 1, 0, 0},
            {0, 0, 0, 0, 0},
            {0, 0, 0, 1, 1},
            {0, 0, 0, 0, 1},
            {0, 1, 0, 0, 0}
        };

        int[][] expected_path_matrix = new int[][] {
            {0, 1, 1, 1, 1},
            {0, 0, 0, 0, 0},
            {0, 1, 0, 1, 1},
            {0, 1, 0, 0, 1},
            {0, 1, 0, 0, 0}
        };

        int[][] expected_transitively_reduced_matrix = new int[][] {
            {0, 0, 1, 0, 0},
            {0, 0, 0, 0, 0},
            {0, 0, 0, 1, 0},
            {0, 0, 0, 0, 1},
            {0, 1, 0, 0, 0}
        };

        System.out.println(Arrays.deepToString(matrix) + " original matrix");

        int n = matrix.length;

        // calc path matrix
        int[][] path_matrix = new int[n][n];
        {
            System.arraycopy(matrix, 0, path_matrix, 0, matrix.length);

            TransitiveReduction.transformToPathMatrix(path_matrix);
            System.out.println(Arrays.deepToString(path_matrix) + " path matrix");
            Assert.assertArrayEquals(expected_path_matrix, path_matrix);
        }

        // calc transitive reduction
        {
            int[][] transitively_reduced_matrix = new int[n][n];
            System.arraycopy(path_matrix, 0, transitively_reduced_matrix, 0, matrix.length);

            TransitiveReduction.transitiveReduction(transitively_reduced_matrix);
            System.out.println(Arrays.deepToString(transitively_reduced_matrix) + " transitive reduction");
            Assert.assertArrayEquals(expected_transitively_reduced_matrix, transitively_reduced_matrix);
        }
    }
}

परीक्षण ouput

[[0, 1, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 1, 1], [0, 0, 0, 0, 1], [0, 1, 0, 0, 0]] original matrix
[[0, 1, 1, 1, 1], [0, 0, 0, 0, 0], [0, 1, 0, 1, 1], [0, 1, 0, 0, 1], [0, 1, 0, 0, 0]] path matrix
[[0, 0, 1, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [0, 1, 0, 0, 0]] transitive reduction
25/07/2015 को 14:31
का स्रोत उपयोगकर्ता

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