Advertisement
gmendezm

Algoritmos de grafos

Mar 30th, 2014
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 3.73 KB | None | 0 0
  1.  
  2.  
  3. (define grafo '( (i (a b))    ;;        a ---- c ---- x
  4.                  (a (i c d))  ;;      /   \  /
  5.                  (b (i c d))  ;;     /     \/
  6.                  (c (a b x))  ;;   i       X
  7.                  (d (a b f))  ;;     \    / \
  8.                  (f (d))      ;;      \  /   \
  9.                  (x (c))      ;;        b ---- d ---- f
  10.                  ))           ;;
  11.  
  12. ; Recorre una lista aplanada de elementos
  13. ; Comprueba la existencia de un elemento en la lista
  14. (define (miembro? ele lista)
  15.   (cond
  16.      ((null? lista)#f)
  17.      ((equal? ele (car lista))#t)
  18.      (else
  19.          (miembro? ele (cdr lista))
  20.      )
  21.   )
  22. )
  23.  
  24. ; Recibe una función booleana y una lista
  25. ; Si la lista es nula, retorna la lista
  26. ; Si el car de la lista es una función, quita el car y continua el algoritmo con la cola (cdr)
  27. ; Por el contrario, si el car de la lista no es una función, mete el car en una nueva lista que
  28. ; empieza a construir
  29. (define (remove-if fun? lista)
  30.   (cond
  31.         ((null? lista) lista)
  32.         ((fun? (car lista)) (remove-if fun? (cdr lista)))
  33.         (else
  34.             (cons (car lista) (remove-if fun? (cdr lista)))
  35.         )
  36.    )
  37. )
  38.  
  39. ; Car   -> (i (a b))
  40. ; Cadr  ->   ((a b))
  41. ; Cadar ->     (a b)
  42. (define (vecinos nodo grafo)
  43.   (cond
  44.     ((null? grafo)#f)
  45.     ; caar del grafo: Es el nodo evaluado
  46.     ; car del cdr; Es la lista de vecinos del nodo
  47.     ; cadar ; es el primer vecino
  48.     ((equal? (car (car grafo)) nodo) (car (cdr (car grafo)))) ;) ;(cadar grafo)
  49.     (else
  50.       (vecinos nodo (cdr grafo)))
  51.     )
  52.   )
  53.  
  54. ; Este algoritmo no es recursivo
  55. ; Recibe una ruta, por ejemplo (a)
  56. ; los vecinos de a son (i c d)
  57. ; Toma el car de la ruta, en este caso el car de la ruta es el car d (a), y el car sería a
  58. ; Busca los vecinos del car de la ruta, o sea de a
  59. ; A cada uno de esos vecinos le aplica una función
  60. ; Si el vecino ya es miembro de la ruta, lo convierte en una lista vacía
  61. ; Si el vecino no es miembro de la ruta, mete el vecino a la ruta
  62. ; Agarra esa lista y elimina todas las listas vacías de los vecinos que ya eran miembros
  63. (define (extender ruta grafo)
  64.   (remove-if null?
  65.      (map (lambda(vecino)
  66.             (cond
  67.                ( (miembro? vecino ruta) '())
  68.                ( else
  69.                   (cons vecino ruta)
  70.                 )
  71.              )
  72.            )
  73.           (vecinos (car ruta) grafo)
  74.       )
  75.    )
  76. )
  77.  
  78. ;; Metodo de busqueda en profundidad primero
  79. ;; Retorna una ruta desde ini hasta fin (Pero no es la ruta más corta, solo una posible ruta)
  80. ;; (prof a i grafo)
  81. ;; > (prof i ((a)) grafo)
  82. (define (prof ini fin grafo)
  83.   (prof-aux (list (list ini)) fin grafo)
  84. )
  85.  
  86. ; Recibe dos nodos, el nodo inicial y el nodo final, y un puntero al grafo
  87. ; El propósito es mostrar una ruta entre esos dos nodos
  88. (define (prof-aux rutas fin grafo)
  89.   (display "Rutas: ")
  90.   (display rutas)
  91.   (newline)
  92.   (cond
  93.     ((null? rutas)'())
  94.     ((equal? fin (car (car rutas))) (reverse (car rutas)))
  95.     (else
  96.        (prof-aux
  97.           (append (extender (car rutas) grafo) (cdr rutas)) ; parametro 1
  98.           fin                                               ; parametro 2
  99.           grafo                                             ; parametro 3
  100.        )
  101.     )
  102.   )
  103. )
  104.  
  105. ; Métodos Alternativos
  106.  
  107. ; (define (miembro? ele lista)
  108. ;   (ormap (lambda(x) (equal? x ele))
  109. ;          lista))
  110.  
  111.  
  112. ; (define (remove-if fun? lista)
  113. ;   (apply append
  114. ;          (map (lambda(x) (cond ((fun? x) '())
  115. ;                                (else (list x))))
  116. ;               lista)))
  117. ;
  118.  
  119.  
  120. ; (define (vecinos nodo grafo)
  121. ;   (let ( (resultado (assoc nodo grafo))
  122. ;          )
  123. ;     (cond ( (equal? resultado #f)
  124. ;             #f)
  125. ;           ( else
  126. ;             (cadr resultado)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement