Sztuczna inteligencja/SI Ćwiczenia 5: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwaniam (→Zadanie 4) |
(Rozwiązanie zadania 3) |
||
Linia 124: | Linia 124: | ||
'''Rozwiązanie''' | '''Rozwiązanie''' | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
+ | Poniżej znajdują się dwie funkcje, korzystające ze zdefiniowanych wcześniej struktur danych, zmiennych globalnych i funkcji pomocnicznych. Pełna treść programu znajduje się w tym pliku: [[Media:labirynt.cc]]. | ||
+ | |||
+ | /* Przeszukiwanie w głąb. Funkcja jest rekurencyjna, dzięki czemu dane z każdego | ||
+ | * kroku trzymane są bezpośrednio na stosie - nie potrzeba kontenera dla | ||
+ | * przetwarzanych węzłów przestrzeni przeszukiwań. | ||
+ | */ | ||
+ | void labirynt_wglab (const Pole & poczatek) | ||
+ | { | ||
+ | odwiedzone (poczatek); | ||
+ | |||
+ | if (jestGorny(poczatek) && !czyOdwiedzone(gorny(poczatek))) | ||
+ | labirynt_wglab (gorny(poczatek)); | ||
+ | |||
+ | if (jestLewy(poczatek) && !czyOdwiedzone(lewy(poczatek))) | ||
+ | labirynt_wglab (lewy(poczatek)); | ||
+ | |||
+ | if (jestDolny(poczatek) && !czyOdwiedzone(dolny(poczatek))) | ||
+ | labirynt_wglab (dolny(poczatek)); | ||
+ | |||
+ | if (jestPrawy(poczatek) && !czyOdwiedzone(prawy(poczatek))) | ||
+ | labirynt_wglab (prawy(poczatek)); | ||
+ | } | ||
+ | |||
+ | /* Przeszukiwanie wszerz. Węzły trzymane są w zwykłej kolejce (FIFO). */ | ||
+ | void labirynt_wszerz (const Pole & poczatek) | ||
+ | { | ||
+ | queue<Pole> kolejka; | ||
+ | kolejka.push (poczatek); | ||
+ | odwiedzone (poczatek); | ||
+ | |||
+ | while (!kolejka.empty()) { | ||
+ | Pole & pole = kolejka.front(); | ||
+ | |||
+ | if (jestGorny(pole) && !czyOdwiedzone(gorny(pole))) { | ||
+ | kolejka.push (gorny(pole)); | ||
+ | odwiedzone (gorny(pole)); | ||
+ | } | ||
+ | if (jestLewy(pole) && !czyOdwiedzone(lewy(pole))) { | ||
+ | kolejka.push (lewy(pole)); | ||
+ | odwiedzone (lewy(pole)); | ||
+ | } | ||
+ | if (jestDolny(pole) && !czyOdwiedzone(dolny(pole))) { | ||
+ | kolejka.push (dolny(pole)); | ||
+ | odwiedzone (dolny(pole)); | ||
+ | } | ||
+ | if (jestPrawy(pole) && !czyOdwiedzone(prawy(pole))) { | ||
+ | kolejka.push (prawy(pole)); | ||
+ | odwiedzone (prawy(pole)); | ||
+ | } | ||
+ | |||
+ | kolejka.pop(); | ||
+ | } | ||
+ | } | ||
+ | |||
</div> | </div> | ||
</div> | </div> |
Wersja z 20:34, 28 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