Arama butonu
Bu konudaki kullanıcılar: 1 misafir
12
Cevap
2365
Tıklama
0
Öne Çıkarma
YOL BULMA ALGORİTMASI (YARDIM LAZIM)
G
11 yıl
Yüzbaşı
Konu Sahibi

Arkadaşlar resimde gördüğünüz harita üzerinde uğraşıyorum. X noktası bulunduğumuz yer ve hedef Y noktası.

1'ler duvar görevinde yani geçilmez alan. 0'lar ise yollar.

Biz X'den Y'ye giden yolu bulacağız. Ve izlediğimiz rotayı yazdıracağız.

Programın çoğu noktası hazır ancak sadece ihtiyacımız olan yolları kullanmamız lazım burada problem yaşıyorum. Algoritmada yardımcı olabilecek ya da örnek bir kod gösterebilecek birileri çıkarsa çok memnun olurum.

Teşekkürler.


< Resime gitmek için tıklayın >



R
11 yıl
Yüzbaşı

G
11 yıl
Yüzbaşı
Konu Sahibi

Atmıştım resmi gözüküyor bende ama tekrar atayım.


< Resime gitmek için tıklayın >


Bu mesaja 1 cevap geldi.
K
11 yıl
Yüzbaşı

Bunun ağaç yapısını kullanmalısın. dizi[i,j] noktasından [i+1,j] [i-1,j] [i,j+1] [i,j-1] şeklinde başlangıç noktasından 4 yöne bakacaksın. eğer değer sınırlar içerisinde ve 0 değeri ise bunu ağaca bir düğüm(node) olarak ekle. Böyle ekley eklye ağaç derinleşecek baktın ki bir yerde 4 tarafa da gidecek yer yok (tabi geldiğin yöne bakmayacaksın) burada backtracking yapıp bir üst node'a çıkıp oradan devam edeceksin. Böylece ağaç dallanacak. Y'ye ulaştığın noktada aramayı bitirip yola ulaşabilirsin. Eğer tek bir yol yoksa arama işlemini kesmez devam edersin.
Ağacın sonsuz döngüye girmesini engellemek için node'un parent değerleri ile kontrol etmelisin ve bu değeri es geçmelisin.



M
11 yıl
Yarbay

Aynisini 2. Sinifta yapmistik data structures dersinde. Algoritma soyle, bulundugun noktada birden fazla yone gidebiliyorsan birini random sec. hepsini sectigin en ustte olacak sekilde stack e at. Cikmaz sokaga gelince stack.pop(). Cunku bu yol, yol degil. Recursive olarak bu algoritma ile finish e ulasiyorsun. Finish e gelince stack.print(). Her labirentin bir cozumu oldugu varsayimi yoksa, null check leri arttirmak gerekiyor. Tree ile de cozulur ama stack daha performansli ve pratik.





< Bu mesaj bu kişi tarafından değiştirildi Mephalay -- 20 Ağustos 2014; 12:25:50 >

< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
K
11 yıl
Yüzbaşı

Çizilen yolda dönemeç var, sonsuza girmemesi için durumu stack ile nasıl çözebilirsin ki?


Bu mesaja 1 cevap geldi.
M
11 yıl
Yarbay

Yol ayrimlarinda gidebilecegi yerler stack e push edilir. Gidilen yol cikmaz sokaga gelince de, stackten pop edilip bir onceki yol ayrimindaki diger yol secilir. Yani sonsuz dongu olmasi icin pop etmemek gerekiyor. Tree yapisi ile de yanlis tasarimla sonsuz tree generate edebilir. Tree nin dezavantaji traverse ederken ki maliyet, stack.pop cok hizli ona gore. Ama dedigim gibi, tree ile de cozulur.



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @keftar
K
11 yıl
Yüzbaşı

Abi yolun kendisi dönemeç zaten çıkmaz yol olmuyor ki sürekli karşına 0 çıkacak ve dönecek çıkmaz yol değil bu, sonsuz döngü stack ile bunu nasıl çözeceksin?


Bu mesaja 1 cevap geldi.
C
11 yıl
Yarbay

Bizimde bir labirent ödevimiz vardı. Stack yapısıyla çözmüştük. Mantığını anlarsan en uygun yapının stack olacağını anlarsın.

Belki faydası olur bir incele verdiğim siteleri

http://www.cs.bu.edu/teaching/alg/maze/

http://www.codeproject.com/Articles/230295/Solve-Maze-Problem-tortuous-game

 
The simplest (to implement) algorithm would be to just keep a stack of locations you've been at, and the route you took from each, unless backtracking gives you that information.

To go back, just pop off old locations from the stack and check for more exits from that location until you find an old location with an untested exit.

By consistently testing the exits in the same order each time, if you know that backtracking to a location comes from down (ie. last time you were at the old location you went down), then you simply pick the next direction after down.

I am not entirely sure what you mean by going back too far though, I would assume you would want to go back to the previous place you have untested routes, is that not what you want?

Note that unless you try to keep track of the path from the starting point to your current location, and avoiding those squares when you try to find new routes, you might end up going in circle, which would eventually make the stack too large.

A simple recursive method which marks the path it takes and never enters areas that are marked can easily do this.

Also, if your thing that moves through the maze is slightly smarter than just being able to move, and hit (stop at) walls, in that it can see from its current point in all directions, I have other algorithms that might help.


Bu mesaja 1 cevap geldi.
K
11 yıl
Yüzbaşı

abi labirentte çözüm tek olur döngülü bir yol olmaz o yüzden stack kullanılır. Örnekteki yola baktın mı 4 tane 0 var kare gibi döngü var orada senin dediğin tek bir yolu olan döngü fln olmayan labirentte olur yapmayın


Bu mesaja 1 cevap geldi.
T
11 yıl
Yarbay

Her ne kadar millet BFS/DFS tarzi seyler onersede ben Dinamik programlamayla bunun daha kolay yapilacagina inaniyorum. Neden dersen bu sorunun benzeri ACM ICPC de cikti. Hatta aynisi fakat en buyuk sorun duvarlar yerine yolun agirligi vardi. BFS/DFS/Dijkstra cok yavas calisiyordu o yuzden Floyd Warshall tarzi birsey yazmistim. Bunun disinda bir arkadasin bahsettigi gibi A* var su sekilde:
< Resime gitmek için tıklayın >


Bu mesaja 1 cevap geldi.
G
11 yıl
Yüzbaşı
Konu Sahibi

İlginiz ve yardımlarınız için çok teşekkürler arkadaşlar cevaplar üzerine çalışacağım.


Bu mesaja 1 cevap geldi.
M
11 yıl
Yüzbaşı

Resimde gösterdiğin şekilde verilen labirentte yol bulmak için en basit yoldan stack yapısını kullanabilirsin. Bunların yanında biraz daha gelişmiş bir şey yapmak istiyorsan en kısa yol bulma algoritmalarından olan " Bellman Ford " ya da " Dijkstra " algoritmalarını kendine göre düzenleyerek bi algoritma oluşturabilirsin. Tabi bu algoritmaları kullanmak istiyorsan Graph yapısı hakkında bilgiye de sahip olman lazım.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.