DFS nie stopuje po osiągnięciu celu

Robert55
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 22 kwie 2010, o 08:38
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz

DFS nie stopuje po osiągnięciu celu

Post autor: Robert55 »

Witam. Mam pewien problem javovo algorytmiczny.
Otóż tak mam Punkt, który upraszczając trzyma w sobie połączenia z innymi punktami(dokładnie tablicę stringów-nazwy tych punktów, odszukiwaniem i zwracaniem szukanego punktu jako obiektu Punkt zajmuje się odpowiednia metoda).
Szukam drogi między dwoma punktami i przeszukiwanie DFS się wykonuje, wypisuje mi sięt to coś ponieżej, gdzie [] to miejsce gdzie miała byc nieszczęsna droga między punktami(zbiór punktów, które wystąpiły po drodze): ArrayList<ArrayList<String>>
Kuznice
Tu byłem
Tu TEŻ
Kalatowki
Tu byłem
Tu byłem
Tu TEŻ
Hala Kondratowa
Tu byłem
Tu byłem
Tu TEŻ
Przelecz pod Kondracka Kopa
Tu byłem
Tu TEŻ
Kopa Kondracka
Tu byłem
Tu TEŻ
Kondracka Przelecz
Tu byłem
Tu byłem
Tu TEŻ
Giewont
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Kasprowy Wierch
Tu byłem
Tu TEŻ
Myslenickie Turnie
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Szalasiska
Tu byłem
Tu byłem
Tu TEŻ
Murowaniec
Tu byłem
Tu TEŻ
Przelecz miedzy Kopami
Tu byłem
Tu TEŻ
Nosalowa Przelecz
Tu byłem
Tu byłem
Tu TEŻ
Nosal
Tu byłem
Tu byłem
Tu TEŻ
Bystre
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Polana Olczyska
Tu byłem
Tu byłem
Tu TEŻ
Wielki Kopieniec
Tu byłem
Tu byłem
Tu TEŻ
Toporowa Cyrhla
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Czarny Staw Gasienicowy
Tu byłem
Tu byłem
Tu TEŻ
Przelecz Karb
Tu byłem
Tu TEŻ
Czerwone Stawki
Tu byłem
Tu TEŻ
Swinicka Przelecz
Tu byłem
Tu TEŻ
Przelecz Liliowe
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Swinica
Tu byłem
Tu byłem
Tu TEŻ
Zawrat
Tu byłem
Tu byłem
Tu TEŻ
Kozia Przelecz
Tu byłem
Tu TEŻ
Zmarzly Staw
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Zadni Granat
Tu byłem
Tu TEŻ
Skrajny Granat
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Kozi Wierch
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu TEŻ
Koscielec
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
Tu byłem
[]

A szukam drogi między kuźnicami a kalatówkami, więc powinno od razu się dodać i wypisać na końcu tam gdzie jest [], ale nie, program nie zauważa, że natrafił na swój cel.

Kod: Zaznacz cały

	public ArrayList<ArrayList<String>> DFS (Punkt początek, Punkt koniec){
		ArrayList<ArrayList<String>> drogi = new ArrayList<ArrayList<String>>();
		ArrayList<String> droga = new ArrayList<String>();
		Punkt domyślny = początek;
		czas = czas + 1;
		domyślny.setCzaswykonania(czas);
		System.out.println(domyślny.nazwa);
		for(int i = 0; i <domyślny.połączenia.size(); i ++ ){
			System.out.println("Tu byłem");
			if(znajdź(domyślny.połączenia.get(i),nowy1).czaswykonania == 0){ // tu powinien być wierzochłek do którego prowadzi drogia
				System.out.println("Tu TEŻ");
				[b]if(domyślny.nazwa.equals(koniec)){[/b]
				System.out.println("wynosił koniec");	
				droga.add(koniec.nazwa);
				drogi.add(droga);
				
				}
				DFS(znajdź(domyślny.połączenia.get(i),nowy1), koniec);
			}
		}
		czas = czas + 1;
		
		
		return drogi;
	}

Kuznice;Kalatowki;1650;35';200;1;niebieski;;
Kalatowki;Kuznice;1650;25';0;1;niebieski;;
Kalatowki;Hala Kondratowa;1600;50';140;1;niebieski;;
Hala Kondratowa;Kalatowki;1600;40';0;1;niebieski;;
Kalatowki;Kondracka Przelecz;1700;1h15';380;1;niebieski;;
Kondracka Przelecz;Kalatowki;1700;55';0;1;niebieski;;
Kondracka Przelecz;Giewont;650;30';170;2;niebieski;ekspozycja, stromizny;lancuchy
Giewont;Kondracka Przelecz;650;20';0;2;niebieski;ekspozycja, stromizny;lancuchy
Kuznice;Nosalowa Przelecz;560;30';100;1;zielony;;
Nosalowa Przelecz;Kuznice;560;25';0;1;zielony;;
Kuznice;Myslenickie Turnie;3000;1h15';330;1;zielony;;
Myslenickie Turnie;Kuznice;3000;1h;0;1;zielony;;
Myslenickie Turnie;Kasprowy Wierch;3200;1h45';620;1;zielony;;
Kasprowy Wierch;Myslenickie Turnie;3200;1h15';0;1;zielony;;
Nosalowa Przelecz;Nosal;300;15';100;1;zielony;;
Nosal;Nosalowa Przelecz;300;10';0;1;zielony;;
Nosal;Bystre;400;25';0;1;zielony;;
Bystre;Nosal;400;40';200;1;zielony;;
Nosalowa Przelecz;Przelecz miedzy Kopami;3300;1h40';350;1;niebieski;niedzwiedzie;
Przelecz miedzy Kopami;Nosalowa Przelecz;3300;1h15';70;1;niebieski;niedzwiedzie;
Nosalowa Przelecz;Polana Olczyska;1400;25';0;1;zolty;;
Polana Olczyska;Nosalowa Przelecz;1400;30';70;1;zolty;;
Polana Olczyska;Wielki Kopieniec;2000;1h;280;1;zielony;;
Wielki Kopieniec;Polana Olczyska;2000;45';0;1;zielony;;
Wielki Kopieniec;Toporowa Cyrhla;1800;1h;0;1;zielony;;
Toporowa Cyrhla;Wielki Kopieniec;1800;1h10';380;1;zielony;;
Kuznice;Przelecz miedzy Kopami;3500;1h40';500;1;zolty;;
Przelecz miedzy Kopami;Kuznice;3500;1h10';0;1;zolty;;
Przelecz miedzy Kopami;Murowaniec;1500;20';80;1;niebieski;niedzwiedzie;
Murowaniec;Przelecz miedzy Kopami;1500;25';80;1;niebieski;niedzwiedzie;
Kasprowy Wierch;Szalasiska;1700;40';0;1;zolty;;
Szalasiska;Kasprowy Wierch;1700;55';470;1;zolty;;
Szalasiska;Murowaniec;1000;25';120;1;zolty;;
Murowaniec;Szalasiska;1000;30';0;1;zolty;;
Szalasiska;Przelecz Liliowe;1400;1h;440;1;zielony;;
Przelecz Liliowe;Szalasiska;1400;45';0;1;zielony;;
Kasprowy Wierch;Przelecz Liliowe;1300;20';60;1;czerwony;;
Przelecz Liliowe;Kasprowy Wierch;1300;20';90;1;czerwony;;
Kondracka Przelecz;Kopa Kondracka;1200;45';280;1;zolty;;
Kopa Kondracka;Kondracka Przelecz;1200;30';0;1;zolty;;
Kopa Kondracka;Przelecz pod Kondracka Kopa;550;15';0;1;czerwony;;
Przelecz pod Kondracka Kopa;Kopa Kondracka;550;20';115;1;czerwony;;
Przelecz pod Kondracka Kopa;Kasprowy Wierch;3500;1h40';350;1;czerwony;;
Kasprowy Wierch;Przelecz pod Kondracka Kopa;3500;1h20';300;1;czerwony;;
Przelecz pod Kondracka Kopa;Hala Kondratowa;2300;1h;0;1;zielony;;
Hala Kondratowa;Przelecz pod Kondracka Kopa;2300;1h20';560;1;zielony;;
Przelecz Liliowe;Swinicka Przelecz;1000;30';200;1;czerwony;;
Swinicka Przelecz;Przelecz Liliowe;1000;25';0;1;czerwony;;
Swinicka Przelecz;Swinica;700;50';150;2;czerwony;ekspozycja, stromizny, przepascie;lancuchy
Swinica;Swinicka Przelecz;700;35';0;2;czerwony;ekspozycja, stromizny, przepascie;lancuchy
Swinicka Przelecz;Czerwone Stawki;1000;40';0;2;czarny;;
Czerwone Stawki;Swinicka Przelecz;1000;55';350;2;czarny;;
Szalasiska;Czerwone Stawki;1300;30';100;1;czarny;;
Czerwone Stawki;Szalasiska;1300;25';0;1;czarny;;
Czerwone Stawki;Przelecz Karb;800;30';150;1;niebieski;;
Przelecz Karb;Czerwone Stawki;800;20';0;1;niebieski;;
Murowaniec;Czarny Staw Gasienicowy;1600;30';120;1;niebieski;;
Czarny Staw Gasienicowy;Murowaniec;1600;20';0;1;niebieski;;
Czarny Staw Gasienicowy;Przelecz Karb;850;40';220;1;czarny;;
Przelecz Karb;Czarny Staw Gasienicowy;850;30';0;1;czarny;;
Przelecz Karb;Koscielec;700;50';300;2;czarny;;
Koscielec;Przelecz Karb;700;40';0;2;czarny;;
Swinica;Zawrat;600;45';0;3;czerwony;przepascie, ekspozycja;lancuchy,klamry
Zawrat;Swinica;600;50';150;3;czerwony;przepascie, ekspozycja;lancuchy,klamry
Zmarzly Staw;Zawrat;850;1h20';360;3;niebieski;przepascie, ekspozycja;lancuchy,klamry
Czarny Staw Gasienicowy;Zmarzly Staw;1700;30';100;1;niebieski;;
Zmarzly Staw;Czarny Staw Gasienicowy;1700;30';0;1;niebieski;;
Zmarzly Staw;Kozia Przelecz;900;1h;330;2;zolty;;lancuchy
Kozia Przelecz;Zmarzly Staw;900;50';0;2;zolty;;lancuchy
Zawrat;Kozia Przelecz;800;1h45';60;3;czerwony;przepascie, ekspozycja, stromizny;lancuchy,klamry, drabinki
Kozia Przelecz;Kozi Wierch;750;1h30';160;3;czerwony;przepascie, ekspozycja, stromizny;lancuchy,klamry
Kozi Wierch;Zadni Granat;1000;1h15';0;3;czerwony;ekspozycja, stromizny;lancuchy,klamry
Zadni Granat;Skrajny Granat;350;30';0;3;czerwony;przepascie, ekspozycja, stromizny;lancuchy,klamry
Skrajny Granat;Czarny Staw Gasienicowy;2000;1h30';0;2;zolty;ekspozycja, stromizny;lancuchy,klamry
Czarny Staw Gasienicowy;Skrajny Granat;2000;2h;600;2;zolty;ekspozycja, stromizny;lancuchy,klamry
Zmarzly Staw;Zadni Granat;1200;1h15';460;2;zielony;;
Zadni Granat;Zmarzly Staw;1200;1h05';0;2;zielony;;
Awatar użytkownika
N4RQ5
Użytkownik
Użytkownik
Posty: 421
Rejestracja: 15 lis 2006, o 16:22
Płeć: Mężczyzna
Lokalizacja: Suwałki/Wawa
Pomógł: 104 razy

DFS nie stopuje po osiągnięciu celu

Post autor: N4RQ5 »

Nie jestem pewien ale wina może leżeć po stronie tego że trzymasz drogę w lokalnej zmiennej a algorytm jest rekurencyjny. Nie przekazujesz dalszym wykonaniom tego co do tej pory zebrałeś więc to ginie.
Swoją drogą na pierwszy rzut oka nie widzę tam warunku który przerywałby rekurencyjne wywoływanie po znalezieniu celu. Przejrzyj to sobie dokładniej.

Poza tym parę kluczowych uwag co do stylu.
1. Po cholerę trzymasz połączenia jako zbiór nazw? To znacznie utrudnia pisanie i ułatwia robienie błędów. Po to w kolekcjach można trzymać referencje do obiektów by unikać czegoś takiego.
2. Jak już wyrzucasz jakieś komunikaty diagnostyczne w pętlach to warto by były znaczące. To znaczy by wypisywały jakieś parametry dla konkretnego obrotu. W tym przypadku numer kolejnego obrotu i Punkt który obrabiają.
ODPOWIEDZ