Sztuczna inteligencja/SI Ćwiczenia 5: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Jarabas (dyskusja | edycje)
Rozwiązanie zadania 1
Jarabas (dyskusja | edycje)
Rozwiązanie zadania 2
Linia 55: Linia 55:
'''Rozwiązanie'''  
'''Rozwiązanie'''  
<div class="mw-collapsible-content" style="display:none">
<div class="mw-collapsible-content" style="display:none">
% Program realizuje algorytm Dijkstry poszukując najkrótszej ścieżki pomiędzy
% dwoma wierzchołkami. Korzysta z predykatów tworzonych dynamicznie, za pomocą
% których implementowana jest kolejka dla przeszukiwania wszerz.
% Przykładowy zestaw danych.
wierzcholki([a,b,c,d,e,f]).
sasiedzi(a,[b,d,f]).
sasiedzi(b,[c,f,a]).
sasiedzi(c,[d]).
sasiedzi(d,[a,e]).
sasiedzi(e,[f,d]).
sasiedzi(f,[d]).
:- dynamic bialy/1,
            szary/1,
            sciezka/2.
% Główny predykat: znajdź ścieżkę od Poczatek do Koniec i zapisz ją w Sciezka
szukaj(Poczatek,Koniec,Sciezka) :-
  wierzcholki(V),                      % pobierz dostępne wierzchołki
  inicjuj(V),                          % inicjuj predykaty
  retract(bialy(Poczatek)),
  assert(sciezka(Poczatek,[Poczatek])),
  assert(szary(Poczatek)),              % pierwszy wierzchołek w kolejce
  dijkstra(Koniec,Sciezka),            % znajdź scieżkę
  !.                                    % uniemożliwiamy nawroty
% Ustawia wszystkie wierzchołki w stanie 'bialy'.
inicjuj([]).
inicjuj([X|Y]) :-
  assert(bialy(X)),
  inicjuj(Y).
% Wyszukaj ścieżkę do Koniec i zapisz ją w Sciezka.
dijkstra(Koniec,Sciezka) :-
  retract(szary(Koniec)),
  sciezka(Koniec,Sciezka).
dijkstra(Koniec,Sciezka) :-
  retract(szary(Wierzcholek)),
  sasiedzi(Wierzcholek,Sasiedzi),
  sprawdz_sasiadow(Wierzcholek,Sasiedzi),
  dijkstra(Koniec,Sciezka).
dijkstra(_,[]).                        % Jeśli dotarł tutaj, to nie ma połączenia.
% Predykat dla każdego sąsiada aktualizuje ścieżkę do niego i dodaje jego
% sąsiadów do kolejki.
sprawdz_sasiadow(_,[]).
sprawdz_sasiadow(Wierzcholek,[Sasiad|Reszta]) :-
  retract(bialy(Sasiad)),
  sciezka(Wierzcholek,Sciezka),        % pobierz ścieżkę do bieżącego wierzchołka
  assert(sciezka(Sasiad,[Sasiad|Sciezka])),
  assertz(szary(Sasiad)),              % dodaj na końcu kolejki
  sprawdz_sasiadow(Wierzcholek,Reszta).
sprawdz_sasiadow(Wierzcholek,[_|Reszta]) :-    % jeśli poprzedni sąsiad nie był wolny
  sprawdz_sasiadow(Wierzcholek,Reszta).
</div>
</div>
</div>
</div>

Wersja z 22:48, 17 sie 2006

Zadanie 1

Zaimplementować w języku PROLOG predykat rozwiązujący problem plecakowy.

Rozwiązanie

Zadanie 2

Zaimplementować w języku PROLOG predykat rozwiązujący problem poszukiwania najkrótszej drogi w grafie.

Rozwiązanie

Zadanie 3

Napisać program poszukujący drogi w labiryncie metodą w głąb i wszerz.

Rozwiązanie

Zadanie 4

Rozważmy drzewo genealogiczne. Załóżmy, że krawędzie są skierowane od rodziców w kierunku dzieci. W którym kierunku - zgodnie czy przeciwnie do skierowania krawędzi - lepiej jest prowadzić przeszukiwanie drzewa, chcąc stwierdzić, że X jest prapradziadkiem Y?

Rozwiązanie