Je recommanderais une approche alternative: l'arbre aléatoire à exploration rapide (RRT) . Une chose intéressante à ce sujet est que vous pouvez le faire tourner dans les coins ou exploser dans toutes les directions.
L'algorithme est vraiment basique:
// 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;
}
En modifiant les fonctions RandomSample
et ExtendToward
, vous pouvez obtenir des arbres très différents. Si RandomSample
juste des échantillons uniformément partout, l'arbre se développera uniformément dans toutes les directions. S'il est biaisé vers l'objectif, l'arbre aura tendance à croître vers l'objectif. S'il échantillonne toujours le but, l'arbre sera une ligne droite du début au but.
ExtendToward
peut également vous permettre de faire des choses intéressantes sur l'arbre. D'une part, si vous avez des obstacles (tels que des murs), vous pouvez faire pousser l'arbre autour d' eux simplement en rejetant les extensions qui entrent en collision avec les murs.
Voici à quoi cela ressemble lorsque vous ne biaisez pas l'échantillonnage vers l'objectif:
(source: uiuc.edu )
Et voici à quoi ça ressemble avec des murs
Quelques propriétés intéressantes du RRT une fois terminé:
- Le RRT ne se franchira jamais
- Le RRT couvrira finalement tout l'espace avec des branches de plus en plus petites
- Le chemin du début au but peut être complètement aléatoire et étrange.