找到障碍物周围边缘数最少的最短路径

时间:2013-03-13 23:35:47

标签: c# path-finding

我需要一种能够向我提供有关两点之间最短路径的信息的算法。路径应尽可能少,因为每个路点,每个转弯花费时间和时间 - 在我的情况下 - 是昂贵的。

应该计算路径以引导某些形状(大多数是圆形或矩形)的障碍物。

路径存储的信息应该是路径路点的笛卡尔坐标,或者是极坐标(即我单位要执行的命令,如转向角度α,移动距离b)。然而,我更喜欢每个航路点的笛卡尔坐标。

没有导航网或其他东西,只有坐标系和有关障碍物和其他禁区的位置的信息,其中一些是固定的,有些可能(很可能会)移动。

啊,所有这些都应该在.NET中以某种方式提供。

由于

//编辑:为了让事情更清晰一点,这里是我打算做的事情的图片:https://dl.dropbox.com/u/8802336/path.png

2 个答案:

答案 0 :(得分:2)

您的问题可以通过两种方式解释。


<强> 1。我想找到最短的路径,通过选择边数最少的那个来打破关系

您可以通过在图形的每个边缘的权重中添加一些非常小的数字ε来实现此目的。该号码必须满足ε < 1/numberOfEdges。这将通过边缘*ε增加每条路径的长度,这意味着更短的路径将是优选的。这甚至可以用负重边缘工作。注意浮点不准确。


<强> 2。我想找到转弯次数最少的路径,通过选择路径最短的路径打破关系

您可以通过向图表上每条边的权重添加一些大数字E来实现此目的。该号码必须满足E > sumOfAllEdgeWeights。这将确保仅考虑具有最少边数的路径。 使用负权重边缘。注意整数溢出。

答案 1 :(得分:0)

如果目标是:

1)最小化边数。

2)最小化距离。

按照这个顺序,你可以这样做一件事:

1)从头到尾画一条线。

2)计算你的线碰撞的每个物体。

3)对于每个对象,计算垂直于对象的两个点,这些点允许您将路径拆分为两个路径段。您可以通过将线分成两段来为矩形执行此操作,对于段A,可以看到它可以通过的四个角中的哪一个,对于段B,可以看到它可以通过的四个角中的哪一个并尝试所有组合,直到找到排放量最小的两个。对于圆圈,我忘了怎么做,但是在两边只有一个解决方案,两个路径段与圆圈齐平,所以你可以使用三角法或其他东西(我会试着弄明白:))

对于两个新路径,以递归分支方式调用4)。

4)对于您生成的两个线段,重复计算,直到没有碰撞为止。与A *类似,你应该首先计算看起来最好的路径(剩下最少的碰撞,或者如果太难,则先做最浅的碰撞)。

5)通过您喜欢的任何指标选择最佳路径。在A *方式中,您应该对列表进行排序,以便通过您的指标获得最佳路径,因此您可以选择第一条完成路径。

我不能在脑海中证明这一切都会有效,但我之前已经看过类似的东西了。

修改

要计算围绕圆的一个方向上两个线段的最近路径,请对每个线段执行

- 边A:从行的起点(或行尾)xs,ys到圆的中心xc,yc,length = a

- 边B:从中心xc,yc到圆周的某个地方,所以长度= r

-Side C:从B侧的端点到xs,ys(斜边)

A和B形成的角度是直角,我们知道A和B的长度,所以我们可以将C的长度计算为sqrt(A ^ 2 + B ^ 2)

最后,我们知道C的长度= A的长度/ sin(角度(B到C))= B的长度/ sin(角度(A到C)),这意味着我们可以用三角法来找出角度A到C和角度B到C。

这让我们可以完全构建路径段的一侧。对另一边重复,我们将路径分成两部分,在两个部分上对齐圆圈 - &gt;最小化距离。