I think the simplest and most efficient way to simulate the random
connection process in a functional manner is to start by generating a
shuffled list of d copies of each vertices (this represents the d legs for
each vertex), and then pair them up using partition.  At this point you have
a list of all the undirected edges, so you just add them to your graph.
 This process should work with any graph representation.

So if your vertices are numbered 0 through 3, and you want 3 edges coming
out from each vertex, you begin by shuffling the list:
[0 1 2 3 0 1 2 3 0 1 2 3]
into something like:
[2 1 3 0 3 0 2 2 0 3 1 1]
Then partition this into:
[[2 1] [3 0] [3 0] [2 2] [0 3] [1 1]]
These are your 6 undirected edges which you store in your graph however you
like.

For demonstration purposes, consider a graph representation where an
undirected edge is stored as two directed edges, vertex ids are numbers in
(range number-of-nodes), and the graph is just a vector that associates
vertex ids with vectors of ids you can get to via outgoing directed edges.

A straightforward implementation of graph-building functions:

(defn empty-graph [number-of-nodes]
 (vec (repeat number-of-nodes [])))

(defn add-directed-edge [graph node1 node2]
 (let [node1-neighbors (graph node1)]
   (assoc graph node1 (conj node1-neighbors node2))))

(defn add-edge [graph [node1 node2]]
 (-> graph
     (add-directed-edge node1 node2)
     (add-directed-edge node2 node1)))

And the random generation is easy:

(defn random-graph [number-of-nodes number-of-edges]
 (reduce add-edge (empty-graph number-of-nodes)
         (partition 2 (shuffle (take (* number-of-nodes number-of-edges)
                                     (cycle (range number-of-nodes)))))))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to