(use srfi-27) (use srfi-1) (define-syntax while (syntax-rules () ((while condition things ... ) (do () ((not condition)) things ...)))) (define (uniform min max) (+ min (* (- max min) (random-real)))) (define (graph ldist ldepd) (begin ;; ltimes -> list of times (define ltimes (map (lambda (node-dist) (cons (car node-dist) ((cdr node-dist)))) ldist)) ;; start -> initializes alist of (TX . -1) (define start (lambda (lst) (map (lambda (node) (cons (car node) -1)) lst))) ;; initialize the var dictionary (define globassoc (start ldist)) ;; nodesleft? -> is there any node with -1? (define nodesleft? (any (lambda (x) (= -1 (cdr x))) globassoc)) ;; dependency -> dependencies of a certain element (define (dependency token) (cdr (assq token ldepd))) ;;depsolved -> all dependencies already have their value != 1 (define (depsolved? token) (not (any (lambda (dep) (= -1 (cdr (assq dep globassoc)))) (dependency token)))) ;; need-n-ready -> items which have both all deps and need a time (define need-n-ready (filter (lambda (node) (and (= -1 (cdr node)) (depsolved? (car node)))) globassoc)) ;; computeReadyNodes -> compute nodes which have no precedence problem (define computeReadyNodes (for-each (lambda (globassocnodes) (set-cdr! globassocnodes (+ ((cdr (assq (car globassocnodes) ldist))) (apply max (cons 0 (map (lambda (x) (cdr (assq x ltimes))) (dependency globassocnodes))))))) (need-n-ready))) (while (nodesleft?) (computeReadyNodes) globassoc))) (define obra (graph `( ;; nodes and distributions (T1 . ,(lambda () (uniform 32 48))) (T2 . ,(lambda () (uniform 40 60))) (T3 . ,(lambda () (uniform 15 25))) (T4 . ,(lambda () (uniform 10 15))) (T5 . ,(lambda () (uniform 10 15))) (T6 . ,(lambda () (uniform 6 10))) (T7 . ,(lambda () (uniform 18 24))) (T8 . ,(lambda () (uniform 4 8)))) '( ;; dependencies (T1 . '()) (T2 . (T1)) (T3 . (T1 T2)) (T4 . (T2)) (T5 . (T2 T3)) (T6 . (T2)) (T7 . (T2 T4 T5)) (T8 . (T4 T5 T6 T7)))))