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

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
(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