1

オープン ストリートマップ プロジェクトからいくつかの事実をダウンロードしました。ここからダウンロードできますhttp://www.mediafire.com/?15pttpp847ld71x このプログラムは、ユーザーがある場所から別の場所への旅程を取得し、最短ルートを提供するのに役立ちます。パスを検索するためにダイクストラのアルゴリズムを実装する方法を誰かが教えてくれます。また、この述語を念頭に置いていました -compute_path(User, Start , End, PathNodes) ここで、User は amsterdam.pl のユーザー値と一致します運転手、 ...)。Prolog は、適切なルートを構築するときにこの情報を考慮に入れます。たとえば、サイクリストは高速道路を使用できません。· ユーザー指定の場所を明示的に訪問する出発地と到着地の間の旅程を要求できるようにします (つまり、ユーザーは A から B 経由で C に行きたいと指定できます)。· Prolog に、「午前 10 時にアムステルダムの B 地点に行くには、A 地点を何時に出発すればよいですか?」などの情報を尋ねることができるようにします。· ユーザーが次のような入力を使用してシェルと対話できるように、あなたが作成したようなヒューマン ランゲージ インターフェイスを使用します。これを実装するために、私はとても感謝しています.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*検索と似たようなことをしていました。この検索は、ダイクストラのアルゴリズムよりも、平面の非迷路のような問題に適しています。A *検索は、ダイクストラのアルゴリズムに現在のノードから目標ノードまでの距離推定量を追加し、すでにアーカイブされている最小距離と組み合わせます。

幹線道路の重みが小さい道路と異なる場合、非常に良い結果が得られます。そのため、アルゴリズムは最初に主要道路を検索し、ゴールに近づくか開始したときにのみ、より小さな道路に迂回します。A*アルゴリズムを開発する非常に素晴らしい本は次のとおりです。

ニルソン、NJ(1980)。人工知能の原則。カリフォルニア州パロアルト:Tioga Publishing Company

よろしくお願いします

于 2011-01-05T00:08:42.307 に答える