Hello, I'm new in clojure and lisp, and I have problem with making
this code elegant (or at least short).

This is Floyd-Warshall algorithm - very simple algorithm in imperative
form (3 nested for loops).

In clojure the best I've get so far is this monstrosity:

(defn create-graph [nodes distances]
        {:nodes nodes :distances distances})

(defn processed [k i j D P]
        (let
                [S (+ (D [i k] 9999) (D [k j] 9999))]
                (if
                        (< S (D [i j] 9999))
                        (do
                                [       (assoc D [i j] S)
                                        (assoc P [i j] k)])
                        [D P])))

(defn shortest-path-before-k
        [k n distances previous]
        (loop [i 1 DP [distances previous]]
                (if (< i n)
                        (recur
                                (+ i 1)
                                (loop [ j                       1
                                                                [D P] DP]
                                        (if (< j n)
                                                (recur
                                                        (+ j 1)
                                                        (processed k i j D P))
                                                [D P])))
                        DP)))

(defn Floyd-Warshall [G]
        (let [n (count (G :nodes))]
                (loop   [k 1,
                                        distances (G :distances),
                                        previous {}]
                        (if
                                (< k n)
                                (let
                                        [DP (shortest-path-before-k k n 
distances previous)]
                                        (recur (+ k 1) (first DP) (second DP)))
                                [distances previous]))))


;;data for testing
(def G
        (create-graph
                [0 1 2 3 4 5 6 7 8]
                {       [0 1] 1, [0 3] 1,
                        [1 2] 1,
                        [2 0] 1,
                        [3 0] 1, [3 4] 1, [3 6] 1,
                        [4 5] 1,
                        [5 3] 1,
                        [6 3] 1, [6 7] 1,
                        [7 8] 1,
                        [8 6] 1}))

(Floyd-Warshall G)

How to do this the Right Way?

--~--~---------~--~----~------------~-------~--~----~
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