我想极大地优化我的算法之一,我将尽力以最好的方式解释它。
主题
我们当时处于二维欧几里德系统中t = 0。
在这个系统中有两个对象:O1 and O2.
O1 and O2分别位于点PA and PC.
O1移动于常数和已知点方向的速度PB。当物体到达PB时就会停止。
O2可以移动到常数和已知 speed 不同与否O1 的任意方向。在时间 0 时,O2 有没有方向,我们需要为它找到一个。
已知参数:
这是系统的小图。
我们想找到重点PI和时间ti其中:Position of O1 at the time ti = Position of O2 at the time ti = PI
。然后我们让物体O2移动到点PI,得到氧气方向.
当选择 O2(点 PI)的方向并且物体 O1 和 O2 都在移动时,物体永远不会停止或等待对于彼此。
In this case, the result would be something like this (PI is noted D on this picture).
算法
你可以在这里找到用 JS 编写的工作算法jsfiddle http://jsfiddle.net/mamadrood/86n9f/,这也是理解问题的好方法。
此时我使用一个简单的算法,该算法有效,但可以进行很多操作,我将得到最佳的交叉点时间,然后得到交叉点位置。
为了得到这个时间,我会检查一下O1的位置,并检查O2此时是否可能到达这个位置。如果O2无法及时到达物体,我们将增加150%的时间,但如果O2当时能够越过O1-B线,我们将减少50%的时间。
最终,经过多次近似,我们将找到两个物体相遇的完美时间。
伪代码
function getOptimalIntersectionTime time
if distance between O1 and O2 at the time `time` < 1
return time
else if O2 could not reach the object O1 at the time `time`
return getOptimalIntersectionTime time * 1.5
else
return getOptimalIntersectionTime time * 0.5
我为什么担心?
我的算法有效,但在某些情况下(例如 jsFiddle 中的“反向案例”)需要大量微积分才能找到最佳点。
在这个 jsFiddle 中,我们对位置(-1000 到 1000)和速度(1-200)使用了很少的值,但是随着数字的增大,该算法的速度会显着变慢。
我知道过早优化是一个坏主意,但我已经完成了项目(包括数据库插入/选择和数据分析,包括这个被调用很多次的算法),并且这个算法占用了 80% 的时间。在某些情况下会占用系统资源,因此改进可以真正提高系统的稳定性和响应能力。