アルゴリズムの 1 つを劇的に最適化したいのですが、できる限り最善の方法で説明しようと思います。
件名
t = 0の時点で 2D ユークリッド システムにいます。このシステムには、 O1とO2の 2 つのオブジェクトがあります。
O1とO2は、それぞれ点PAとPCに位置しています。
O1は点PBの方向に一定の既知の速度で移動します。オブジェクトは PB に到達すると停止します。
O2は一定の既知の速度で移動でき、O1とは異なるか、またはどの方向にも移動できません。時間 0 では、O2 には方向がありません。そのための方向を見つける必要があります。
既知のパラメータ:
- O1 : 位置、方向、速度
- O2 : 位置、速度
これがシステムの小さな図です。
点PIと時間tiを見つけたいと思いますPosition of O1 at the time ti = Position of O2 at the time ti = PI
。次に、オブジェクト O2 をポイント PI に移動させて、O2 の方向を取得します。
O2 の方向 (ポイント PI) が選択され、オブジェクト O1 と O2 の両方が移動している場合、オブジェクトは停止したり、互いに待機したりすることはありません。
この場合、結果は次のようになります (PI はこの図では D と示されています)。
アルゴリズム
このjsfiddleで、JS で記述された動作中のアルゴリズムを見つけることができます。これは、問題を理解するための優れた方法でもあります。
現時点では、機能するシンプルなアルゴリズムを使用していますが、多くの操作が必要なため、最適な交差点時間を取得し、その後交差点の位置を取得します。
この時間を取得するために、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 の "Reverse Case" など)、最適な点を見つけるために大量の計算が必要になります。
この jsFiddle では、位置 (-1000 ~ 1000) と速度 (1 ~ 200) に小さな値を使用していますが、このアルゴリズムは数値が大きいほど劇的に遅くなります。
時期尚早の最適化が悪い考えであることは知っていますが、私はプロジェクト (データベースの挿入/選択とデータ分析で構成され、何度も呼び出されるこのアルゴリズムを含む) の最後にあり、このアルゴリズムはプロジェクトの最大 80% を占めています場合によっては、プロジェクト システム リソースを使用して、改善によってシステムの安定性と応答性が実際に向上する可能性があります。