/ / Programowanie robota do eksploracji siatki [zamknięty] - java, wydajność, siatka, robot

Programowanie robota do badania siatki [zamknięte] - java, wydajność, siatka, robot

W moim projekcie staram się po prostu stworzyć robotaktóra eksploruje jak najwięcej siatki, bez dwukrotnego podążania tą samą ścieżką. Ma również czujnik, który sprawdza, czy obiekt stoi mu na drodze (obiekt może znajdować się tylko w korytarzu). Ale mam problem z próbowaniem zmuszenia robota do unikania tej samej ścieżki.

Próbowałem rozwiązać ten problem, tworząc 2Dtablica do przechowywania wartości całkowitych dla każdego kwadratu w siatce. Wartość 0 oznacza, że ​​robot nie był jeszcze na tym kwadracie na siatce, wartość 1 oznacza, że ​​kwadrat jest zablokowany na siatce, a wartość 2 oznacza, że ​​robot był już na tym kwadracie. Jeśli robot zobaczy, że kwadrat przed bieżącą pozycją ma wartość 2, wówczas obracałby się, by znaleźć kwadrat o wartości 0, ale jeśli nie ma kwadratu o wartości 0 wokół robota, zaczyna się cofać.

Mój problem można wyjaśnić jaśniej za pomocą tego przykładu:

wprowadź opis obrazu tutaj

Trójkąt reprezentuje robota i jego początekposition, przyjmuje się, że lewy dolny róg jest pozycją (0,0) na mojej siatce. Zielone kółka reprezentują elementy blokujące jego ścieżkę. Czerwony kwadrat jest celem robota. Robot może poruszać się tylko na białe kwadraty w siatce.

Kiedy uruchamiam program, robot się poruszado przodu (na wschód, ponieważ jest to obecny kierunek), aż dojdzie do skrzyżowania tuż przed zielonymi kółkami. Patrzy przed siebie i wykrywa przeszkodę, więc obraca się o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara i sprawdza kolejną blokadę, która ponownie się pojawia, a zatem obraca się ponownie w kierunku przeciwnym do ruchu wskazówek zegara. Więc teraz robot znajduje się w pozycji (0,2) na zachód. Może poruszać się tylko na zachód, aby uniknąć opuszczenia siatki lub uderzenia w obiekt, więc wraca do pozycji początkowej, ale nadal kieruje się na zachód. Będzie się teraz obracać o 90 stopni w kierunku zgodnym z ruchem wskazówek zegara, aż znajdzie kierunek, który utrzyma go na siatce, tj. Do momentu, gdy znów będzie skierowany na wschód. Siatka wygląda teraz następująco:

wprowadź opis obrazu tutaj

Ale teraz chcę zignorować kontynuowanie i przejście natę samą ścieżkę, ignorując ten kierunek i obracając ponownie o 90 stopni w kierunku przeciwnym do ruchu wskazówek zegara, aby skierować się na północ, aby mój robot mógł przenieść się na północ na nową ścieżkę. Mógłbym po prostu zignorować kierunek i po prostu obracać się, aby znaleźć nową ścieżkę, ale co, jeśli jestem otoczony ścieżkami wcześniejszymi i chcę, aby mój robot cofnął się do ostatniego skrzyżowania. Jak mogę to zrobić skutecznie. Również jak mogę skutecznie wykrywa kiedy muszę się wycofać.

Dziękuję Ci

Odpowiedzi:

1 dla odpowiedzi № 1

Rozwiązanie problemu na zdjęciu 2 może być tak proste, jak sprawdzenie innych white kwadraty wokół robota, zanim wykonasz ruch. Na zdjęciu 2 robot zobaczy, że kwadrat, przed którym stoi, jest „wyszarzony” i postanowi sprawdzić wszystkie inne kierunki i ostatecznie odkryje, że na północ od niego jest pusty biały kwadrat.

Edycja: Nie zdawałem sobie sprawy, że to był prawdziwy robot.

Ponieważ jest to jedyny sposób uczenia się tego, co znajduje się w komórcejest to, że obracając się do tej komórki i używając czujnika, robot będzie musiał wykonać pewną liczbę obrotów bez względu na to, co zrobisz. Kiedy napotka ścianę lub zielony obiekt, będzie musiał się obrócić, aż znajdzie nową ścieżkę do podróży. Możesz to zoptymalizować, ignorując ściany obudowy. Na przykład, gdy robot wraca do pozycji wyjściowej skierowanej na zachód, wiesz już, że na południu znajduje się ściana, ponieważ jego położenie współrzędnych to (0, -1), co jest nieprawidłowe. Pozwala to dowiedzieć się, że otwarta płytka znajduje się na północy, ponieważ odwiedziłeś już płytkę na wschodzie, wymagając tylko jednej tury.

Co więcej, kiedy robot w końcu podróżujecałą drogę na północ, kafelek (0,6) wiesz, że jest ściana na północy i na zachodzie ze względu na jego położenie. Następnie możesz inteligentnie odgadnąć, że otwarte miejsce musi znajdować się na wschodzie, ponieważ zachodni żeton (-1,6) jest nieprawidłowy i (0,7) również nie jest prawidłowy.

Bez zmiany czujnika, aby zobaczyć 2 bloki lubinstalując więcej czujników na robocie (tj. po jednym z każdej strony), nie można wiele zoptymalizować z powodu ograniczonej dostępności informacji.