создание предикатов из фактов из базы данных в прологе из открытого проекта карты улиц - PullRequest
2 голосов
/ 25 ноября 2010

Я скачал некоторые факты из открытого проекта StreetMap, вы можете скачать его здесь http://www.mediafire.com/?15pttpp847ld71x Эта программа, которую я пытаюсь придумать, поможет пользователю получить маршрут из одного места в другое, предоставляя кратчайшие возможные маршруты, кто-то может сказать мне, как реализовать алгоритм Дейкстры для поиска путей, также у меня был этот предикат в уме -compute_path (Пользователь, Пуск , End, PathNodes) где пользователь будет соответствовать пользовательским значениям из amsterdam.pl Я пытаюсь добавить расширения, может быть, вы можете поиграть с ним, например, следующее: .Скажите Пролог, что я за пользователь (например, пешеход, велосипедист, водитель автомобиля, ...). Затем Пролог примет эту информацию во внимание при построении подходящего маршрута. Например, велосипедист не может использовать шоссе. · Позволяет запросить маршрут между адресом отправления и адресом прибытия, который явно посещает ряд определенных пользователем мест (то есть пользователь может указать, что он хочет перейти от А к С через В). · Позволить запрашивать у Пролога такую ​​информацию, как «В какое время я должен покинуть пункт А, чтобы добраться до пункта В, Амстердам, в 10:00?». Используйте интерфейс на человеческом языке, подобный тому, который вы только что сделали, чтобы пользователь мог взаимодействовать с оболочкой, используя ввод, как: o как мне добраться от "NameA", Амстердам до "NameB", Амстердам Пожалуйста, вернитесь ко мне, если вы смогли реализовать это, я буду очень признателен, я новичок в Прологе и пытаюсь быстро учиться.

это код, который я пытался придумать

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

1 Ответ

1 голос
/ 05 января 2011

Несколько лет назад я делал нечто похожее с так называемым поиском A *.Этот поиск лучше подходит для плоских задач, подобных лабиринту, чем алгоритм Дейкстры.* Поиск добавляет к алгоритму Дейкстры текущий оценщик расстояния между узлами и целями и объединяет его с уже заархивированным минимальным расстоянием.

Очень хороший результат может быть получен, когда основные дороги имеют различный вес по сравнению с меньшими дорогами.Таким образом, алгоритм сначала выполняет поиск по основным дорогам, а расходится только на более мелкие дороги, когда приближается к цели или начинается.Очень хорошая книга, которая развивает алгоритм A *, следующая:

Nilsson, NJ (1980).Принципы искусственного интеллекта.Пало-Альто, Калифорния: издательство Tioga.

С наилучшими пожеланиями

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...