Jon Wilson wrote:
Hi Marco,
I cobbled something together for you real quick. Attached. The function you want to call is make-graph. node-count is obvious*. edge-density is the probability that any given node has an edge to any other given node. Symbol names are read from /usr/share/dict/words.

* if you set edge-density low, then you are likely to get a graph with fewer nodes than node-count. This could be fixed, but not without either allowing for disconnect graphs (which it didn't look like you were interested in, nor did you give a notation for), or making it so that edge-density didn't actually mean edge-density. Generating a 50-node graph with edge-density 0.03125, I got graphs with node counts in the upper 30s.
HTH,
Jon



Marco Maggi wrote:
Ciao,

  I need to test some module that handles graphs and
constraint networks; I would like to automatically
generate test graphs, both cyclic and acyclic. I wonder
if someone has already written some code for it and
is willing to share it or to suggest ideas.

  It should be "enough" to build something like a
pseudo-random mega-scheme-function-call like:

   (a
     (b c (d e a))
     (f (c g) (h c))
     (g (e b)))

in which:

* all the elements in the lists are symbols;
* each symbol appears once and only once as
  first element in a list;
* each symbol appears at least once as first
  element in a list.

TIA




_______________________________________________
Guile-user mailing list
Guile-user@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-user


(use-modules (srfi srfi-1) (srfi srfi-8))

(define (binomial p)
  (> p (random:uniform)))

(define (make-edge-list name nodes p used-nodes)
  (set! used-nodes (cons name used-nodes))
  (let ((edge-list '()))
	(for-each 
	  (λ (node)
		 (if (binomial p) ; add an edge going to this node.  Else, don't do anything.
		   (set! edge-list (xcons edge-list
								  (if (member node used-nodes)
									node
									(receive (edges used) (make-edge-list node nodes p used-nodes)
											 (set! used-nodes (append used used-nodes))
											 (cons node edges)))))))
	  nodes)
	(values edge-list used-nodes)))

(define words (open-input-file "/usr/share/dict/words"))

(define (make-graph node-count edge-density)
  (let* ((nodes (map (λ (x) (read words)) (iota node-count))))
	(receive (graph used-nodes)
			 (make-edge-list (car nodes) nodes edge-density '())
			 graph)))

_______________________________________________
Guile-user mailing list
Guile-user@gnu.org
http://lists.gnu.org/mailman/listinfo/guile-user

Reply via email to