I was wondering if it was possible to ask Mathematica to draw a graph provided some set of vertices: $(v_1, ..., v_N) \in V$ connected by $M$ edges $(e_1, ..., e_M) \in E$, where the length of each edge, $(l_1, ..., l_M) \in L$, is explicitly specified? Obviously I don't expect Mathematica to have a built-in semidefinite convex optimization package to find approximate solutions to the graph realization problem. Rather, I'm wondering if its possible to utilize the "ball and spring" approach Mathematica already uses for displaying arbitrary fixed edge length graphs?
Update (in response to comments) - There's a lot of theory in the literature on solving this "Graph Realization Problem" for graphs with various topologies, some of the most recent focusing on semidefinite convex optimization methods. However, I'm trying to focus my question on specifically getting Mathematica to try a ball and spring minimization process to "realize" a graph provided a specified topology and set of edge lengths. Certainly if anyone knows of an SDP solver for graph realization implemented in Mathematica, I'd love to hear about it. However, I somehow doubt such an implementation exists.
Answer
In the recent version of Mathematica (version 9), an "approximate" solution to the graph realization problem can be obtained by tuning the repulsive/attractive force in the SpringElectricalEmbedding
via EdgeWeight
:
elength = {2, 4, 2, 4, 3, 4};
g = CompleteGraph[4, EdgeWeight -> elength,
EdgeLabels -> "EdgeWeight",
GraphLayout -> {"VertexLayout" -> {"SpringElectricalEmbedding",
"EdgeWeighted" -> True}}]
Compare the resulting edge lengths with the given distances:
coords = GraphEmbedding[g];
edges = Table[coords[[List @@ e]], {e, EdgeList[IndexGraph[g]]}];
dist = EuclideanDistance @@@ edges
(* {0.574522, 1.3316, 0.576753, 1.14065, 0.980596, 1.14082} *)
dist/elength
(* {0.287261, 0.3329, 0.288377, 0.285163, 0.326865, 0.285204} *)
MeanDeviation[%]
(* 0.0192805 *)
Comments
Post a Comment