Group Abstract Group Abstract

Message Boards Message Boards

0
|
10K Views
|
3 Replies
|
5 Total Likes
View groups...
Share
Share this post:

How to construct graphs programmatically

Posted 11 years ago

Hi, I have to admitt I am just starting to work with the language more that just interactively calling one function after another. But now for graph theory I need to investigate a whole series of graphs which represent natural numbers and divisors.

I need to create graphs Dn = (Vn, An) with n in N >1 and arcs (directed edges) in Vn times Vn (v,w) with weight 0 if v divides w and 1 if not. So D3 would be

d03 = Graph[{2 [DirectedEdge] 2, 2 [DirectedEdge] 2, 
    2 [DirectedEdge] 3, 3 [DirectedEdge] 2, 3 [DirectedEdge] 3, 
    3 [DirectedEdge] 3}, EdgeWeight -> {0, 0, 1, 1, 0, 0}, 
   VertexLabels -> "Name", EdgeLabels -> "EdgeWeight"];

the problem is I need to investigate some medium size n for which I hardly can create the graph typing all vertices and edge weights.

Anyone feeling extremly generous throwing in some directions how to tackle this in Mathematica (sadly I am only fluent in Java and C++)? Help would be much appreciated - I'll spend some time reading the documentation in the meantime. About time to get some grip on functional programming anyways...

edit: just upgraded to V10 so all the pretty graph theory stuff added lately is available - not that I know how to properly apply it yet :|

POSTED BY: Erik Itter
3 Replies
Posted 11 years ago

I post this for illustrative purposes (if I have understood underlying aim correctly).

f[n_] := {DirectedEdge[##], Boole[Divisible[##]]} & @@@ Tuples[Range[2, n], 2]
g[n_] := With[{ds = Transpose@f[n]},
           Graph[##, 
           VertexLabels -> Thread[Range[2, n] -> (Placed[Framed[#, Background -> White], Center] & /@ 
           Range[2, n])],
           VertexLabelStyle -> Red, 
           EdgeLabels -> "EdgeWeight",
           EdgeStyle -> MapThread[Function[{u, v}, u -> {RGBColor[v, 0, 0], Thickness[0.005 + v 0.005]}], {#1, 
           ds[[2]]}]] & @@ ({#1, EdgeWeight -> #2} & @@ ds)]

Using:

Grid[Partition[g /@ Range[2, 10], 3], Frame -> All]

enter image description here

POSTED BY: Mark Dooris
Posted 11 years ago

sorry, just realized that I forgot to thank you (both), this solution was pretty much doing the job and easy to make it do the whole way.

POSTED BY: Erik Itter
Posted 11 years ago
POSTED BY: Bill Simpson
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard