Buduję model snake game odtwarzany na powierzchni sześcianu. Obecnie wykorzystuje algorytm Dijkstry do odnajdywania ścieżki. Pomimo optymalizacji przy użyciu struktur danych kolejki o ustalonym i priorytetowym znaczeniu, nadal jest on zbyt wolny. Zauważysz opóźnienie, gdy wąż zje przedmiot żywnościowy i zaczyna szukać nowego.Heurystyczny algorytm gwiazdotwórczy dla powierzchni kostki
Próbuję go użyć zamiast A *, ale nie mogę znaleźć dobrej heurystyki. Na płaskiej siatce z 4 kierunkami ruchu korzystałbym z odległości na Manhattanie. Próbowałem używać odległości 3D Manhattan abs(dx) + abs(dy) + abs(dz)
, która nie działała bez powodu: dla węża świat gry jest naprawdę 6 grids (corresponding to the faces of the cube) z niezwykłymi właściwościami zawijania.
W kodzie każde pole jest przechowywany w grid[15][15]
2D tablicy. Jest 6 takich tablic do przechowywania każdej twarzy. Tak więc każdy kwadrat ma potrójną wartość (arrayX, arrayY, d)
, aby opisać przesunięcie w tablicy 2D i określić, która tablica. Ponadto każdy kwadrat ma potrójną pozycję przestrzenną z potrójnym oznaczeniem (x, y, z)
.
Oto obszar kodu gry gdzie Pathfinding dzieje:
https://github.com/mhluska/Snakeception/blob/master/src/js/game.coffee#L105
Oto kod biblioteki dla A *:
https://github.com/mhluska/Stimpack/blob/master/src/js/graph.coffee#L60
Co jest odpowiednia, zwięzłe heurystyczny dla tego swiat gry?
Można myśleć o wykresie jako 2D + ukształtowanej siatki, która owija się wokół, więc heuriistic dla A * będzie tylko biorąc przy minimum kilku wartości * (spróbuj sobie wyobrazić, jak chcesz to zrobić na 1D siatka wokół pierwszej) *. Jednak z tylko 1000 węzłów, to naprawdę nie powinno być konieczne, nawet w JavaScript. Pewna część twojego kodu (lub prawdopodobnie struktury danych, których używasz) trwa ** zbyt długo. Musisz wykonać profilowanie, aby określić, które linie powodują spowolnienie - powinieneś łatwo przeszukać ponad 1000 węzłów bez zauważalnego opóźnienia. –