Algorytm znajdowania drogi w macierzy

0

Witam,
czy jest ktoś w stanie wskazać mi algorytm dzięki któremu będę w stanie odnaleźć optymalną drogę w macierzy? Moje zadanie jest dosyć niestandardowe jeżeli chodzi o implementacje, dlatego, że muszę odnaleźć optymalną drogę w losowo wygenerowanej macierzy zero-jedynkowej (w okolicach 100x100), gdzie:

  • "jednostka" poruszająca się przechodząc do kolejnego pola MUSI przejść do pola o wartości różniącej się (z 0 do 1 i odwrotnie). Inne przejście jest niemożliwe, jednostka nie może przejść z pola o wartości 1 do pola o wartości 1, z zerami podobnie.
  • ustalenie startu drogi i jej końca nie ma większego znaczenia. Może być ustawione na "szytwno".
  • w przypadku gdy jednostka jest otoczona polami o tej samej wartości - automatycznie nie może się poruszać i stoi w miejscu.
  • gdy jednostka przechodząc, w pewnym momencie napotka te same wartości, ma się cofać tak długo, aż napotka pole o przeciwnej wartości na które może przejść.

Mam nadzieję że zrozumiecie mój być może nie jasny opis problemu ;). Można to jak najbardziej porównać do sposobu poruszania się dobrze znanego prymitywnego pantofelka, który może się poruszać tylko i wyłącznie z cząsteczki kwasowej do zasadowej i odwrotnie (z 0 do 1 oraz z 1 do 0).

Pozdrawiam

2

Pytania uściślające:
Co ma zrobić algorytm?

  • poinformować, że droga nie istnieje lub podać jakąś drogę,
  • poinformować, że droga nie istnieje lub podać drogę najkrótszą.
    Jakie pola są sąsiadujące? Muszą mieć wspólny bok, czy wystarczy wspólny wierzchołek.
0

Algorytm ma poinformować, że droga nie istnieje lub podać drogę najkrótszą. Jeżeli chodzi o ostatni pytanie, to nie wiem czy rozumiem, mógłbyś je ubrać w inne słowa?

0

Rozważmy prostą sytuację - planszę 2x2. Czy sąsiadami dla pola (0,0) są tylko pola (0,1) i (1,0) - wspólny bok, czy również pole (1,1) - wspólny wierzchołek?

0

Aaa już rozumiem :). Sąsiadami dla pola (0,0) są tylko (1,0) i (0,1). Jednostka może poruszać się tylko prostopadle, jak taksówki w Nowym Jorku po przecznicach :)

0

Jeśli nie jest Ci potrzebna szczególnie wysoka wydajność, a zależy Ci przede wszystkim na łatwości implementacji, najprostszy algorytm będzie najlepszy — na przykład taki, jak opisany TUTAJ (w skrócie — zaczynając od końca (akurat w Twoim przypadku to obojętne) robisz drzewo możliwych ścieżek; jeśli w pewnym momencie dojdziesz do startu, to wszystkie wierzchołki powyżej będą stanowić najkrótszą możliwą ścieżkę, jeśli nie dojdziesz (bo skończy Ci się graf), to taka ścieżka nie istnieje).

Jeśli wysoka wydajność jest potrzebna, to weź A* i posiedź kilka dni nad wymyślaniem heurystyki.

0

Dziękuję za podsunięcie metod. Zanim zacznę, czy Waszym zdaniem implementacja będzie możliwa bez użycia funkcji, czy jednak funkcje uproszczą sprawę? Na pewno będę implemenotwał to zagadnienie w edytorze Rstudio (który używa R (https://www.r-project.org/)).

0

Wszystko, co się da zaimplementować przy użyciu funkcji, da się też zaimplementować bez nich. Jest to przy okazji doskonały sposób na utrudnienie sobie życia i skomplikowanie kodu ponad miarę, szczególnie użyteczny, jeśli płacą Ci od linijki kodu i nie zależy Ci na tym, by ten program kiedykolwiek zadziałał.

0

Po to ten program robię, by działał :). Wydajność również nie ma większego znaczenia, gdyż obszar nie będzie specjalnie duży. Czy w razie komplikacji / problemów, mogę liczyć na pomoc w tym temacie kontynuując rozpoczęty wątek?

1 użytkowników online, w tym zalogowanych: 0, gości: 1