J'essaie de modifier une fonction de montée en côte existante, qui prend deux noms de noeuds (tels que A et E), et dispose d'un paramètre optionnel est utilisé de manière récursive (une file d'attente). J'essaie de définir une fonction «moins chère» qui évalue si un chemin est moins cher qu'un autre. Aussi, au lieu d'un nœud d'objectif, j'essaie de passer une liste de nœuds d'objectif, que la fonction, en atteignant l'un de ces nœuds, arrête d'évaluer.Lisp - modifier A * pour vérifier le meilleur coût, recevoir la liste des noeuds
Le problème est que ma fonction ne retournera rien sauf le noeud de départ que j'ai entré et une liste vide.
Voici mon réseau/graphique et les coûts associés:
(setf (get 's 'coordinates) '(0 3)
(get 'a 'coordinates) '(4 6)
(get 'b 'coordinates) '(7 6)
(get 'c 'coordinates) '(11 9)
(get 'd 'coordinates) '(2 0)
(get 'e 'coordinates) '(9 2)
(get 'f 'coordinates) '(11 3))
(setf (get 's 'cost) 0
(get 'a 'cost) 16
(get 'b 'cost) 4
(get 'c 'cost) 10
(get 'd 'cost) 5
(get 'e 'cost) 12
(get 'f 'cost) 14)
Et voici ma fonction modifiée de montée Hill:
(defun hill-climb (start finish &optional (queue (list (list start))))
(cond ((endp queue) nil)
((member (first (first queue)) finish)
(reverse (first queue)))
(t (hill-climb start finish (append (sort (extend (first queue))
#'(lambda (p1 p2)
(cheaper p1 p2
finish)))
(rest queue))))))
Enfin, voici le « coût » et « meilleur marché » fonctions:
(defun cost (path)
(apply '+ (mapcar #'(lambda (x) (get x 'cost)) path)))
(defun cheaper (p1 p2)
(< (cost p1)
(cost p2)))
EDIT: Désolé, et est ici 'étendre':
(defun extend (path)
(print (reverse path))
(mapcar #'(lambda (new-node) (cons new-node path))
(remove-if #'(lambda (neighbor) (member neighbor path))
(get (first path) 'neighbors))))
Où 'étendre'? Notez que vous passez le mauvais nombre d'arguments à 'cheaper'. En outre, l'utilisation de listes chaînées uniques en tant que files d'attente n'est probablement pas la meilleure idée. – danlei
Désolé, ajouté étendre. Remarqué la chose la moins chère, avant utilisait une fonction qui a pris 3 arguments. La configuration de la file d'attente est en quelque sorte dictée par l'affectation. Je sais donc que le problème est que, parce que j'utilise une liste de noeuds d'objectif possibles au lieu d'un seul, lorsque j'appelle la fonction de manière récursive, je ne suis pas sûr de savoir comment cela fonctionnera en termes de ce que je repasse de la liste des «finish». Peut-être que si je modifie juste 'moins cher' cela fonctionnera mieux ... –
Maintenant, d'où vient la propriété 'neighbors'? Avez-vous prévu d'ajouter cette propriété dans une étape distincte? Je ne connais pas vos spécifications, mais je voudrais qu'un voisin soit à +/- 1 pour chaque coordonnée (?). De plus, comme il s'agit de devoirs, veuillez le marquer comme tel. – danlei