Otóż teraz, po przechodzeniu przeszukiwaniu grafu w głąb (tutu wątek), postanowiłem przejść przeszukać go wszerz. Jak poprzednio: iteracja mi się nie podobała, więc napisałem pseudokod bez.
Testy implementacji w JavaScripcie przechodzą (więc nie będę jej zamieszczać raczej). Jednak nadal nie jestem pewien, czy to na pewno jest przechodzenie przeszukiwanie wszerz, i czy jest poprawne. Może ktoś zanalizować pseudokod? Starałem się, by był jak najprostszy, ale mogło mi nie wyjść.
Pseudokod
BFS (vt, vVts, unvVts)
if isGoal(vt)
then return vt
else
newUnvVts <- concat(relativeComplement(getNbVts(vt), unvVts), unvVts) // <- tutu był bug; poprawione
if empty(newUnvVts)
then return nil
else
newVt <- newUnvVts[len(newUnvVts) - 1]
newVVts <- concat(vt, vVts)
return BFS(newVt, newVVts, newUnvVts)
Jako boczna uwaga: dziwna rzecz. Mój pseudokod BFS DFS wygląda na trudniejszy niż pseudokod DFS BFS. Wydaje mi się natomiast, że pseudokody, który widziałem, zachowują odwrotną relację (pseudokod DFS BFS trudniejszy niż pseudokod BFS DFS). Może żaden z moich pseudokodów nie jest ani ("czysty") BFS, ani DFS?
UPDATE: Oczywiście jest bug – rozjazd pseudokodu i implementacji w JS. Zaraz poprawię.
UPDATE2: Poprawiłem wyżej wspomniany bug.
UPDATE3: Poprawiłem literówki w "bocznej uwadze" pod koniec posta.
UPDATE4: Błąd – inne tytuły wątków ("przechodzenie" vs "przeszukiwanie"). Poprawię ten, żeby nie wprowadzać zamieszania.
UPDATE5: Poprawiona literówka: ifGoal
na isGoal
.