2011-09-11 11 views
8

En teoría de grafos, se utiliza el algoritmo húngaro para calcular la portada de un grafo bipartito ponderado de borde mínimo (un conjunto de aristas que incide a cada vértices, el que tiene el peso total mínimo.)¿Cómo puedo encontrar una cubierta de borde mínima del gráfico bipartito ponderado usando Mathematica 8?

Me parece que en la nueva la versión 8 de Mathematica, hay un nuevo paquete de funciones para Graph Theory, (comience con Graph [].) Pero no he encontrado ninguna función que haga este trabajo. Encuentro una función llamada FindEdgeCover [] que solo puede encontrar una tapa de borde , no la mínima.

+1

¿Estás seguro de que la función no hace lo que necesitas? De acuerdo con la documentación, FindEdgeCover [g] encuentra una cubierta de borde del gráfico g con un número mínimo de bordes. Entonces, ¿no está encontrando la cobertura de borde mínima como se requiere? De lo contrario, se daría más de una respuesta, incluidas las cubiertas de borde no mínimas. – Verbeia

+1

No, por mínimo, quise decir el peso mínimo total de los bordes en el conjunto, no el número de bordes. – trVoldemort

+0

Ah, entonces la versión no ponderada, en efecto. Puede ser que la función necesaria aún no esté incorporada. – Verbeia

Respuesta

6

Hice algunos experimentos y, aunque no está documentado, parece que FindEdgeCover[] hace lo que quiere.

Considérese, por ejemplo:

h[list_] := CompleteGraph[4, EdgeWeight -> list] 

FindEdgeCover[[email protected]@6] 
(* 
-> {1->2,1->3,1->4} 
*) 

Pero

FindEdgeCover[[email protected]@[email protected]] 
(* 
-> {1->2,3->4} 
*) 

por supuesto ninguna garantía ...

Editar

Aquí tienes algo de código para experimentar con por usando diferentes adyacencias ponderadas ma trices

adj = {{\[Infinity], 1, 1, 1, 1}, {1, \[Infinity], 2, 2, 2}, 
     {1, 2, \[Infinity], 2, 2}, {1, 2, 2, \[Infinity], 2}, 
     {1, 2, 2, 2, \[Infinity]}} 
g = WeightedAdjacencyGraph[adj]; 
g = WeightedAdjacencyGraph[adj, VertexShapeFunction -> "Name", 
    EdgeLabels -> 
    MapThread[ 
    Rule, {[email protected], AbsoluteOptions[g, EdgeWeight] /. {_ -> x_} -> x}], 
    GraphHighlight -> FindEdgeCover[g]] 

enter image description here

Nota: El código es nada bueno, pero no pude encontrar una manera de utilizar EdgeLabels -> “EdgeWeight”. Publiqué this question para ver si alguien puede hacerlo.

Cuestiones relacionadas