Я рекомендував би альтернативний підхід: швидко досліджуване випадкове дерево (RRT) . Хороша річ у тому, що ви можете змусити її ходити по кутах або вибухати в усі сторони.
Алгоритм дійсно основний:
// Returns a random tree containing the start and the goal.
// Grows the tree for a maximum number of iterations.
Tree RRT(Node start, Node goal, int maxIters)
{
// Initialize a tree with a root as the start node.
Tree t = new Tree();
t.Root = start;
bool reachedGoal = false;
int iter = 0;
// Keep growing the tree until it contains the goal and we've
// grown for the required number of iterations.
while (!reachedGoal || iter < maxIters)
{
// Get a random node somewhere near the goal
Node random = RandomSample(goal);
// Get the closest node in the tree to the sample.
Node closest = t.GetClosestNode(random);
// Create a new node between the closest node and the sample.
Node extension = ExtendToward(closest, random);
// If we managed to create a new node, add it to the tree.
if (extension)
{
closest.AddChild(extension);
// If we haven't yet reached the goal, and the new node
// is very near the goal, add the goal to the tree.
if(!reachedGoal && extension.IsNear(goal))
{
extension.AddChild(goal);
reachedGoal = true;
}
}
iter++;
}
return t;
}
Змінюючи функції RandomSample
та ExtendToward
функції, ви можете отримати дуже різні дерева. Якщо RandomSample
просто рівномірно пробувати всюди, дерево буде рівномірно рости в усіх напрямках. Якщо його упереджене до мети, дерево буде схильне рости до мети. Якщо воно завжди пробиває мету, дерево буде прямою лінією від початку до мети.
ExtendToward
може дозволити вам робити цікаві речі і для дерева. По-перше, якщо у вас є перешкоди (наприклад, стіни), ви можете змусити дерево рости навколо них, просто відкинувши розширення, що стикаються зі стінами.
Ось як це виглядає, коли ви не зміщуєте вибірку до мети:
(джерело: uiuc.edu )
А ось як це виглядає зі стінами
Деякі цікаві властивості RRT після його закінчення:
- RRT ніколи не перетне себе
- Зрештою, RRT покриє весь простір все меншими та меншими гілками
- Шлях від початку до мети може бути абсолютно випадковим і дивним.