Saya akan merekomendasikan pendekatan alternatif: pohon acak mengeksplorasi cepat (RRT) . Satu hal yang keren tentang itu adalah Anda bisa membuatnya berputar-putar, atau meledak ke segala arah.
Algoritma ini sangat mendasar:
// 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;
}
Dengan memodifikasi RandomSample
dan ExtendToward
fungsinya, Anda bisa mendapatkan pohon yang sangat berbeda. Jika RandomSample
hanya sampel seragam di mana-mana, pohon akan tumbuh seragam di semua arah. Jika bias terhadap tujuan, pohon akan cenderung tumbuh ke arah tujuan. Jika selalu sampel tujuan, pohon akan menjadi garis lurus dari awal hingga tujuan.
ExtendToward
dapat memungkinkan Anda untuk melakukan hal-hal menarik ke pohon juga. Untuk satu hal, jika Anda memiliki hambatan (seperti dinding), Anda bisa membuat pohon tumbuh di sekitar mereka hanya dengan menolak ekstensi yang bertabrakan dengan dinding.
Ini terlihat seperti ketika Anda tidak bias mengambil sampel ke arah tujuan:
(sumber: uiuc.edu )
Dan inilah yang terlihat seperti dengan dinding
Beberapa properti keren RRT setelah selesai:
- RRT tidak akan pernah menyeberang dengan sendirinya
- RRT pada akhirnya akan mencakup seluruh ruang dengan cabang yang lebih kecil dan lebih kecil
- Jalur dari awal hingga tujuan bisa sepenuhnya acak dan aneh.