19

バウンティ

この質問は、いくつかの問題を引き起こします。報奨金は、全体的に対処する回答に送られます。


これが私が遊んできた問題です。

私は、ユークリッド空間に基づかないソリューションに特に興味があります。

サイズ K の群集を形成するアクタのセットがあります。距離d(ActorA,ActorB)は任意の 2 つのアクタについて簡単に計算できます (「距離」のさまざまな定義に対してソリューションが機能するはずです)。数多くの確立されたアルゴリズムのいずれか。

この隣接セットは最初は正しいですが、アクタは常に移動しているため、各アクタの N 個の最近傍の展開リストを維持したいと考えています。私が興味を持っているのは、完全解よりも効率的な近似解です。

  1. エラーが導入された後、ソリューションは正確に収束する必要があります。
  2. エラーが大きくなりすぎた場合は、完全な再計算を実行しても問題ありませんが、これらのエラーの検出は安価です。

これまでのところ、友人の友人アルゴリズムを使用してきました。

recompute_nearest (Actor A)
{
    Actor f_o_f [N*N];
    for each Actor n in A.neighbours
        append n to f_o_f if n != A and n not in f_o_f

    Distance distances [N*N];
    for 0 <= i < f_o_f.size
        distances [i] = distance (A, f_o_f [i])

    sort (f_o_f, distances)
    A .neighbours = first N from f_o_f
}

これは、群集の動きが遅く、N が適切に大きい場合に、適切に機能します。小さな誤差の後に収束し、最初の基準を満たしますが、

  • 大きなエラーを検出する良い方法がありません。
  • エラーのサイズと頻度の定量的な説明はありませんが、
  • 実際には収束しますが、常に収束することを証明することはできません。

これらの点について何かお手伝いできますか?

また、うまく機能する代替アプローチを知っていますか

  • 群衆の動きが速いとき、
  • 一部のアクターの動きが速い場合、
  • N が小さい場合、
  • ある場所では群衆がまばらで、別の場所では密集している場合、
  • または特定の空間索引付けアルゴリズムを使用しますか?

私が現在取り組んでいる拡張機能は、友人の友人を一般化して、隣人の動きが速い場合に友人の友人の友人を取ることです。これはうまくスケーリングできず、エラーを定量化せずに適切なパラメーターを導き出すのは難しいと思います。

私はすべての提案を歓迎します!それは楽しい小さな問題です:-)


これまでの注目すべき提案

Fexvez: エージェントの速度に応じて、ランダムな余分な隣人をサンプリングします。サンプル サイズ。移動しようとしているエリアからサンプリングすることもおそらく役立つでしょう。

エージェントspeed*delta_timeが既知の最も遠い隣人までの距離を超えると、隣人を再サンプリングします。

最近傍グラフのスーパーセットであるDelaunay 三角形分割を維持します。1 つの最近傍のみを考慮します。

David Mount のANN ライブラリは、 移動を処理していないようです。

4

7 に答える 7

10

統計から得られる非常に単純で高速な方法は、ランダムな線形投影を使用することです。これらは、クラスターと近隣を非常に迅速に決定するのに役立ちます。より多くの予測を行うと、より正確になります(エラーに関する質問に対処すると思います)。

このペーパーでは、RLP に関連する新しいメソッド (DPES) を含む、いくつかのメソッドの広範な定量分析を提供します。

この論文では、移動する点のコンテキストでも距離保存を含む RLP の使用について説明します。

このホワイト ペーパーでは、モーション プランニングの RLP について説明し、いくつかのヒューリスティックについて詳しく説明します。

RLP メソッドは次のとおりです。

  1. とても早い
  2. 精度と速度を調整できる近似値を導く
  3. 距離と角度の保存 (証明可能)
  4. 大規模なディメンションと多数のオブジェクトに簡単にスケーリング
  5. 次元削減に便利
  6. コンパクトなプロジェクションにつながる (たとえば、階層的なバイナリ パーティショニングにプロジェクションできる)
  7. 柔軟: 自分にとって良いと思われる任意の空間に射影できます - 通常は R^d ですが、2^d (次元 d のバイナリ空間) への射影も許容されますが、特定の # の精度が低下する場合に限ります。投影の。
  8. 統計的に興味深い

低次元空間に埋め込んだ後、隣接計算は非常に簡単です。たとえば、同じ領域にビン化された投影 (投影をグリッドにビン化する場合) は、元の空間に近い可能性が非常に高いからです。

元のデータの次元は小さいですが (10 であっても小さい)、事前に選択されたグリッドに迅速に射影する機能は、近傍を識別してカウントするのに非常に役立ちます。

最後に、位置 (データをセンタリングしてスケーリングしている場合は相対位置) が変更されたオブジェクトについてのみ更新する必要があります。

関連する研究については、Johnson-Lindenstrauss lemma を調べてください。

于 2011-08-05T18:36:51.943 に答える
4

四分木を使ってみましたか?

つまり、「世界」をそれぞれ4つのサブノードを持つグラフに再帰的に分割します。その後、ツリーは、世界の特定の正方形内にあるオブジェクトをすばやく確認し、残りを破棄できます。ゲームでの衝突検出のパフォーマンスを向上させるためによく使用される非常に効果的なカリング手法。

これが3Dの場合は、八分木に拡張します。

于 2011-07-29T11:25:48.360 に答える
4

これは、友達の友達のアルゴリズムが時々隣人を見逃すことを示す簡単な反例です: 多くの (少なくとも 3*N 以上の) 等間隔のアクターの長い直線から始め、徐々に線を曲げて円にします。線が十分に長い場合、その中のアクターは近隣の局所的な変化を検出しません。特に、最後に登場する役者は、いつ会っても気が付きません。

編集: 実際、私はさらに単純な反例を考えました: それぞれ N 個以上のアクターからなる 2 つの孤立したコンパクトなクラスターを取り、それらを互いに衝突コースに送ります。

于 2011-07-29T11:28:39.650 に答える
3

解決策のように見えるものがあります。

recompute_nearest (Actor A)各「再計算」ステップでは、線形の時間がかかります。これは、各アクターの場合ほど問題ではないと思います。

要点を理解しましょう。アイデアは各アクターのためのものであり、計算の直前に特定の数のランダムな友達を追加しrecompute_nearest (Actor A)ます。この数は小さくしないでください。小さくしないと、エラーが検出されません。大きすぎないようにする必要があります。そうしないと、ネイバーのネイバーの計算が2次式になるため、計算コストが高くなりすぎます。

しかし、「小さすぎない」または「大きすぎない」とはどういう意味ですか?1人のアクターAから始めて、彼のネイバーリストがどのように更新されるかを確認します。各ポイントpについて、元のKアクターのパーセントを追加するとします。次に、別のポイントBがAに近づいたが、友達の友達ではない場合は、「ランダムな友達」を使用して「すばやく」追加する必要があります。各反復で、(1-p)彼を選択しない可能性があります。

簡単な計算によると、このポイントを10回以下の反復で90%のケースで見つけたい場合は、が必要になりますp=20%。これはひどく高価です。

..。

しかし、すべてが失われるわけではありません!私が言いたい最初のポイントは、エラーが「一緒に行く」傾向がある場合、パフォーマンスが劇的に向上するということです!最初は遠く離れている2つのブロブ(チャットしている人、星団など)を想像してみてください。これらのブロブが衝突した場合、友達の友達は問題があることに気付くことはありません。しかし、私のアルゴリズムでは、1つのエラーを見つけて、ネイバーリストを正しく適合させると、友達の友達アルゴリズムが残りのすべてのエラーを修正します。

それぞれがポイントの1%のみを含む2つの小さなブロブがK=1.000あり、99%の確実性で10回以下の反復でスポットしたい場合は、必要なのは1つだけであると計算できますp=1%。(Kが大きいほど、pを小さくする必要があります!)まあ、それはいくつかのポイントが「一緒に行く」ことを前提としています。

私は別の最適化をしました:ランダムなポイントの数と質を適応させます。簡単に言えば、速いアクターには遅いアクターよりもランダムな友達を与える必要があります。そして、他の速い俳優を好むこれらの友人をランダム化する必要があります。数値化することはできませんが、なぜパフォーマンスが向上するのかは推測できます。


あなたの質問に関する小さな編集:「俳優が速いときに私は何をしますか?」エラーを見つけるために自分で与えたステップ数で、アクターの速度を変換できます。私が言いたいのは、各俳優が彼の友人の彼の周りに円を持っていると考えることができればということです。その理論上の円は彼の友達リストに対応しています。ほとんどのアクターが10回の反復でこの円を完全に横切ることができないが、15回で横切ることができる場合は、問題を特定するために10回の反復を自分に与えることを検討する必要があります。アクターが非常に高速で、この「円」を3つのステップで通過できる場合は、このアルゴリズムは適していません(各ステップで再計算せずに、ネイバーリストを保持しようとするのは幻想だと思います)。

基本的に、ネイバーリストを保持することは、何らかの構造(つまり、2つの反復間でほぼ同じもの)があることを示唆します。スピードは逆です、速い俳優はあなたが構造を持っていないことを意味します。非常に速いアクターの場合、ネイバーリストを保持することはおそらく悪い考えです。


ブロブに関する技術的な詳細。

s%各アクター(サイズ)を含む2つのBLOBがありますsK(例はs = 1%

e%(例は1%)とnステップ(例は10)の許容誤差を自分に与えます

次に、pの上限があります:p <= [log(1-e^(1/n))]/[s*K²*log(1-s)]

私の例の真の価値はp <= 0.989%

p = [log(1-e^(1/n))]/[s*K²*log(1-s)]sが小さく、Kが大きい場合があります。そうでない場合、pははるかに小さくなります。

于 2011-07-29T13:31:44.643 に答える
1

私が試してみること。

  1. kNN を実行するための基本データ構造としてツリーをカバーします。特徴: データの固有の次元が固定されている場合、ユークリッド メトリックは必要ありません。線形空間の使用法、kNN/挿入/削除はすべて O(log n) です。非機能: モーション。

  2. 移動するオブジェクトを処理するには、オブジェクトごとに定期的に、古い位置を削除し、新しい位置を挿入して、kNN を見つけます。

オブジェクトの周期を速度に反比例するように設定すると、カバー ツリーと現実の間の最大の不一致は定数によって制限されることがわかります。

于 2011-09-17T13:45:10.207 に答える
0

アクターが特定のタイムステップで移動する距離が、最も遠い既知のネイバーまでの距離を超える場合は、すべてのネイバーをリサンプリングします。

別のトリガー:最後のリサンプルからアクターが移動した距離が、最も遠い既知の隣人までの距離を超えた場合、リサンプリングします。

ここでは簡単な最適化がうまくいきます。階層空間インデックスがある場合は、a)ジャンプサイズに等しい半径の球とb)少なくともN個のアクターの両方を含むノードを検索します。

于 2011-07-29T13:44:09.233 に答える
0

KDツリーを使用すると、ポイントの固定半径内を効率的に検索できます。すべてのポイントの隣接がd1単位内にあり、前の測定からの任意のポイントの最大変位がd2である場合、ポイントのd1+d2単位内で検索するだけで済みます。

ミンコフスキー距離を扱っている場合は、DavidMountのANNライブラリを使用できます。ただし、任意の距離関数を使用するライブラリがあるかどうかはわかりません。

于 2011-07-29T12:03:38.717 に答える