tranzitiv algoritm de reducere: pseudocod?

voturi
30

Am fost în căutarea pentru un algoritm pentru a efectua o reducere a tranzitiv pe un grafic, dar fără succes. Nu e nimic în algoritmi BIBLIA (Introducere în Algoritmi de către Cormen și alții) și în timp ce l-am văzut o mulțime de pseudocod închidere tranzitiv, nu am fost capabil de a urmări în jos orice pentru o reducere. Cel mai aproape am este că există unul în „Algorithmische Graphentheorie“ de Volker Turau (ISBN: 978-3-486-59057-9), dar, din păcate, nu am acces la această carte! Wikipedia este nefolositor și Google este încă să se întoarcă la nimic. : ^ (

Stie cineva de un algoritm pentru efectuarea unei reduceri tranzitiv?

Întrebat 06/11/2009 la 23:33
sursa de către utilizator
În alte limbi...                            


7 răspunsuri

voturi
3

Articolul Wikipedia privind punctele de reducere a tranzitive la o punere în aplicare în cadrul Graphviz (care este open source). Nu chiar pseudocod, dar poate intr -un loc pentru a începe?

LEDA include un algoritm de reducere a tranzitiv . Nu am o copie a cărții LEDA mai, și ar fi putut fi adăugate această funcție după ce cartea a fost publicată. Dar dacă e acolo, atunci va exista o descriere bună a algoritmului.

Google indică un algoritm pe care cineva a sugerat pentru a fi incluse în Boost. Nu am încercat să - l citesc, așa că poate nu este corect?

De asemenea, acest lucru ar putea fi în valoare de o privire.

Publicat 07/11/2009 la 16:42
sursa de către utilizator

voturi
7

Esența de bază a algoritmului de reducere a tranzitiv am folosit este


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

Algoritmul de închidere tranzitiv am folosit în același script este foarte asemănătoare, dar ultima linie este


         add edge xz if edges xy and yz OR edge xz exist
Publicat 03/03/2010 la 15:49
sursa de către utilizator

voturi
3

Algoritmul de „girlwithglasses“ uită că o muchie de redundante-ar putea întinde un lanț de trei muchii. Pentru a corecta, Compute Q = R x R + unde R + este închiderea tranzitivă și apoi ștergeți toate marginile din R care apar în Q. A se vedea, de asemenea, articolul Wikipedia.

Publicat 08/12/2010 la 20:42
sursa de către utilizator

voturi
13

A se vedea Harry Hsu. "Un algoritm pentru găsirea unui grafic echivalent minim al unui digraph.", Journal of ACM, 22 (1): 11-16 ianuarie 1975. Algoritmul simplu cubica de mai jos (utilizând o x N matrice cale N) este suficient pentru DAGs, dar Hsu-l generalizează la grafice ciclice.

// 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;
Publicat 15/07/2011 la 03:47
sursa de către utilizator

voturi
1

Adancime algoritm în pseudo-python:

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)

Algoritmul este unul optim, dar se ocupă cu problema multi-margine-interval a soluțiilor anterioare. Rezultatele sunt foarte similare cu ceea ce Tred de la Graphviz produce.

Publicat 28/06/2012 la 03:04
sursa de către utilizator

voturi
3

Pe baza de referință furnizate de Alan Donovan, care spune că ar trebui să utilizați matricea de cale (care are un 1 dacă există o cale de la nodul i la nodul j) în locul matricei adiacență (care are un 1 numai în cazul în care există o margine de la nodul i la nodul j).

Unele mostre de cod Python urmează mai jos pentru a arăta diferențele dintre soluțiile

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')

ieşire:

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
Publicat 03/05/2013 la 12:16
sursa de către utilizator

voturi
0

portat la java / jgrapht, proba Python de pe această pagină de la @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)));
                }
            }
        }
    }
}

unitate de testare:

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 de testare

[[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
Publicat 25/07/2015 la 14:31
sursa de către utilizator

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