This is also a nice idea. I will take a look at both implementations.

On Nov 16, 8:16 pm, Mark Engelberg <mark.engelb...@gmail.com> wrote:
> 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