Tôi muốn giới thiệu một cách tiếp cận khác: cây ngẫu nhiên khám phá nhanh (RRT) . Một điều thú vị về nó là bạn có thể khiến nó đi vòng quanh các góc, hoặc nổ tung theo mọi hướng.
Thuật toán thực sự cơ bản:
// 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;
}
Bằng cách sửa đổi các chức năng RandomSample
và ExtendToward
, bạn có thể nhận được các cây rất khác nhau. Nếu RandomSample
chỉ cần mẫu đồng đều ở khắp mọi nơi, cây sẽ phát triển đồng đều theo mọi hướng. Nếu nó thiên về mục tiêu, cây sẽ có xu hướng phát triển về phía mục tiêu. Nếu nó luôn lấy mẫu mục tiêu, cây sẽ là một đường thẳng từ đầu đến mục tiêu.
ExtendToward
có thể cho phép bạn làm những điều thú vị cho cây. Đối với một điều, nếu bạn có chướng ngại vật (như tường), bạn có thể khiến cây phát triển xung quanh chúng chỉ bằng cách từ chối các phần mở rộng va chạm với tường.
Đây là những gì nó trông giống như khi bạn không thiên vị lấy mẫu về mục tiêu:
(nguồn: uiuc.edu )
Và đây là những gì nó trông giống như với các bức tường
Một số thuộc tính tuyệt vời của RRT sau khi hoàn thành:
- RRT sẽ không bao giờ vượt qua chính nó
- RRT cuối cùng sẽ bao phủ toàn bộ không gian với các nhánh nhỏ hơn và nhỏ hơn
- Con đường từ đầu đến mục tiêu có thể hoàn toàn ngẫu nhiên và kỳ lạ.