2010-11-25 4 views
2

J'ai téléchargé quelques faits du projet open streetmap, vous pouvez le télécharger ici http://www.mediafire.com/?15pttpp847ld71x Ce programme que j'essaie de trouver aidera un utilisateur à obtenir l'itinéraire d'un Quelqu'un peut me dire comment implémenter l'algorithme de Dijkstra pour rechercher des chemins, aussi j'avais ce prédicat en tête -compute_path (Utilisateur, Début, Fin, PathNodes) où User sera compatible avec les valeurs d'utilisateur d'Amsterdam .pl Je suis en train d'essayer d'ajouter des extensions, peut-être que vous pouvez jouer avec, par exemple: .Tell Prolog quel genre d'utilisateur je suis (par exemple, piéton, cycliste, conducteur de voiture, ...). Prolog prend alors cette information en compte lors de la construction d'une route appropriée. Par exemple, un cycliste ne peut pas utiliser une autoroute. · Permet de demander un itinéraire entre une adresse de départ et une adresse d'arrivée qui visite explicitement un certain nombre d'endroits spécifiés par l'utilisateur (c'est-à-dire que l'utilisateur peut spécifier qu'il souhaite passer de A à C via B). · Permet de demander au Prolog des informations telles que "A quelle heure dois-je quitter le Point A pour me rendre au Point B, Amsterdam à 10h00?". · Utiliser une interface de langage humain comme celle que vous venez de créer afin que l'utilisateur puisse interagir avec le shell en utilisant comme: o Comment puis-je obtenir de "NameA", Amsterdam à "NameB", Amsterdam Si vous étiez en mesure de mettre en œuvre cela, j'apprécierai beaucoup, je suis nouveau dans Prolog et essayant d'être un apprenant rapide.créer des prédicats à partir de faits à partir d'une base de données dans prolog du projet open street

c'est le code que j'ai essayé de trouver

:-dynamic(node/3). 
:-dynamic(way/2). 

% some nodes 
node(46315543, 52.35548, 4.84315). 
node(46315968, 52.35558, 4.84068). 
node(46315971, 52.35531, 4.84986). 

% predicate to add a node to a way 
add_node_to_way(WayID, NodeID) :- 
    way(WayID, NodeList), 
    node(NodeID, _, _), 
    not(member(NodeID, NodeList)), 
    retract(way(WayID, NodeList)), 
    append(NodeList, [NodeID], NewNodeList), 
    assert(way(WayID, NewNodeList)). 

% main menu 
menu :- 
    write('1. list nodes\n'), 
    write('2. list ways\n'), 
    write('3. create node\n'), 
    write('4. create way\n'), 
    write('5. add node to way\n'), 
    write('6. exit\n'), 
    nl, 
    write('your option: '), 
    read(Option), 
    process(Option). 
menu :- 
    menu. 

process(1) :- 
    node(ID, Lat, Long), 
    writef('node with ID = %d, lat = %d and long = %d\n', [ID, Lat, Long]), 
    fail. 

process(2) :- 
    way(ID, NodeList), 
    writef('way with ID = %d and nodelist = ', [ID, NodeList]), 
    write(NodeList), 
    nl, 
    fail. 

process(3) :- 
    write('enter node ID: '), 
    read(ID), 
    not(node(ID, _, _)), 
    write('enter lat: '), 
    read(Lat), 
    write('enter long: '), 
    read(Long), 
    assert(node(ID, Lat, Long)), 
    fail. 

process(4) :- 
    write('enter way ID: '), 
    read(ID), 
    not(way(ID, _)), 
    assert(way(ID, [])), 
    fail. 

process(5) :- 
    write('enter ID of node to add: '), 
    read(NodeID), 
    node(NodeID, _, _), 
    write('enter ID of way to add to: '), 
    read(WayID), 
    way(WayID, _), 
    add_node_to_way(WayID, NodeID), 
    fail. 

process(6) :- 
    % exit point 
    write('bye'). 

Répondre

1

Il y a quelques années, je faisais quelque chose de similaire avec le soi-disant Une recherche *. Cette recherche est mieux adaptée aux problèmes plans non-labyrinthes que l'algorithme de Dijkstra. Une recherche ajoute à l'algorithme de Dijkstra un estimateur de distance de nœud à objectif en cours et le combine à la distance minimale déjà archivée.

Un très bon résultat peut être obtenu lorsque les routes principales ont des poids différents par rapport aux routes plus petites. Alors que l'algorithme recherche d'abord les routes principales, et ne détourne dans des routes plus petites que lorsque l'objectif est proche ou commence. Un très beau livre qui développe l'algorithme A * est le suivant:

Nilsson, N.J. (1980). Principes de l'intelligence artificielle. Palo Alto, Californie: Tioga Publishing Company.

Cordialement

Questions connexes