新規および改善 ;-)
もう少し考えさせられたコメントをくれたGuillaumeとJasonSに感謝します。これにより、統計が大幅に改善された2番目の提案が作成されました。
ギヨームは、私が投稿した以前の戦略では均一な密度が失われると述べました。もちろん、彼は正しいです。なぜなら、それは本質的に元のポイントを周回する傾向がある「酔っぱらいの散歩」だからです。ただし、ポイントを均一にランダムに配置すると、「パス」要件に失敗する可能性が高くなります(すべてのポイントは、100を超えるステップのないパスで接続できます)。その状態のテストには費用がかかります。1つが通過するまで純粋にランダムな解を生成することはさらにそうです。
Jason Sはバリエーションを提供しましたが、多数のシミュレーションにわたる統計的検定により、彼のバリエーションは、最初の提案と同じようにクラスター化されたパターンを生成すると結論付けました(座標値の平均と標準偏差の調査に基づく)。
以下の改訂されたアルゴリズムは、統計が純粋に(均一な)ランダム配置の統計と非常に似ているが、パス要件を満たすように構築によって保証されているポイントセットを生成します。残念ながら、口頭で説明するよりも視覚化する方が少し簡単です。事実上、ポイントは漠然と一貫した方向(NE、SE、SW、NW)にランダムによろめき、「壁に跳ね返る」ときにのみ方向を変える必要があります。
大まかな概要は次のとおりです。
ランダムに始点を選び、水平移動を右に、垂直移動を下に設定します。
残りのポイント数(たとえば、元の仕様では99)について繰り返します。
2.1。距離が50から100の間のdxとdyをランダムに選択します。(私の試行実装では、ユークリッド距離(二乗和の平方根)を想定しましたが、「タキシカブ」距離(絶対値の合計)はさらに簡単です。コード化する。)
2.2。水平方向と垂直方向の移動に基づいて、dxとdyを前のポイントに適用します(右/下->加算、左/上->減算)。
2.3。いずれかの座標が範囲外(0未満または少なくとも1000)になった場合は、違反した境界の周囲の座標を反映し、その移動を反対方向に置き換えます。これは、4つのケース(2つの座標x 2つの境界)を意味します。
2.3.1. if x < 0, then x = -x and reverse LEFT/RIGHT horizontal travel.
2.3.2. if 1000 <= x, then x = 1999 - x and reverse LEFT/RIGHT horizontal travel.
2.3.3. if y < 0, then y = -y and reverse UP/DOWN vertical travel.
2.3.4. if 1000 <= y, then y = 1999 - y and reverse UP/DOWN vertical travel.
ステップ2.3での反射は、新しいポイントを前のポイントから100単位以内に残すことが保証されているため、パス要件が維持されることに注意してください。ただし、水平方向と垂直方向の移動の制約により、ポイントの生成は空間全体でランダムに「スイープ」され、元の純粋な「酔っぱらいの歩行」アルゴリズムよりも全体的な分散が大きくなります。