1

我从 open streetmap 项目下载了一些事实,你可以在这里下载http://www.mediafire.com/?15pttpp847ld71x 我试图提出的这个程序将帮助用户获得从一个地方到另一个地方的行程,提供最短的路线,有人可以告诉我如何实现 Dijkstra 的算法来搜索路径,我也有这个谓词 -compute_path(User, Start , End, PathNodes) 其中 User 将与 amsterdam.pl 中的用户值保持一致 我正在尝试添加扩展名,也许您可​​以使用它,例如以下内容: .Tell Prolog 我是哪种用户(例如行人,骑自行车的人,汽车司机, ...)。那么 Prolog 在构建适当的路由时会考虑这些信息。例如,骑自行车的人不能使用高速公路。· 可以询问出发地和到达地之间的行程,明确访问多个用户指定的地点(即用户可以指定他想从A 经B 到C)。· 可以向 Prolog 询问诸如“我什么时候必须离开 A 点,才能在上午 10:00 到达阿姆斯特丹 B 点?”等信息。· 使用您刚刚制作的人类语言界面,以便用户可以使用以下输入与 shell 进行交互: o 我如何从阿姆斯特丹的“NameA”到“NameB”,如果您能够的话,请回复我为了实现这一点,我将非常感激,我是 Prolog 的新手,并试图成为一个快速学习者。

这是我试图想出的代码

:-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'). 
4

1 回答 1

1

几年前,我正在用所谓的 A* 搜索做类似的事情。这种搜索比 Dijkstra 算法更适合平面非迷宫类问题。A* 搜索向 Dijkstra 算法添加了当前节点到目标节点的距离估计器,并将其与已存档的最小距离相结合。

与较小的道路相比,当主要道路的权重不同时,可以获得非常好的结果。这样算法首先搜索主要道路,只有在接近目标或开始时才转向较小的道路。一本非常好的开发 A* 算法的书如下:

新泽西州尼尔森 (1980)。人工智能原理。加利福尼亚州帕洛阿尔托:泰奥加出版公司。

此致

于 2011-01-05T00:08:42.307 回答