2016-08-25 10 views
0

nランダムポイントのキューブを作成して、最小距離のしきい値がすべて1であるようにしようとしています。私はそれを行うために行列を使用しているので、各列はキューブの(x,y,z)ポイントになります。私は時にはそれが動作し、ときどき動作しないコードを持っています。私は本当に理由は分かりません...助けやアドバイスは、コードの入力は、キューブの側面の1つの長さと私が使用したい点の数であると評価されています。最小距離のランダムなポイント[オクターブ]

更新:コードの 明確化:
だから、3列とn行のランダムな行列を作成することになっています。これは、キューブ内でnポイントの座標(x,y,z)を表します。制約条件は、キューブlxのサイズと、ポイント間の最小距離dです。だから私のコードはnx3ランダム行列を生成し、その要素の新しい点を生成していなければ、その距離が少なくとも1であるかどうかを確認するために各項目をチェックします。その後、それは戻って、その制限を維持するために前のすべての点をチェックします。一部のポイントの距離が1未満であるため、失敗しています。私は十分なチェックをしていないか、それが何か他のものかどうかはわかりません。

入力値:キューブの

  • 長さ:ポイントのlx = 7.35
  • 数:n = 256

コード:

function [A]=distribution(lx,n) 
    format long; 
    A=0; 
    new=0; 
    d=1; 
    A=rand(n,3).* [lx]; 
    A=reshape(A.' ,3,n); 
    while(new <= (n+1)) 
    for i=1:(n-1) 
     for j=(i+1):n 
      r=A(:,i) - A(:,j); 
      rsum= sum(dot(r,r)); 
      if(rsum < 1.0) 
       A(:,j)=rand(1,3).* [lx]; 
      end 
     end 
     for k=1:i-1 
      r2=A(:,k) - A(:,i); 
      r2sum= sum(dot(r2,r2)); 
      if(r2sum < 1.0) 
       A(:,j)=rand(3,1).* [lx]; 
      end 
     end 
    end 
    new=new +1; 
    endwhile 
    A=reshape(A.' ,n,[]); 
+0

「時にはそれが動作し、時にはそれが動作しない」を掘るかもしれない動作しない場合は、かなりあいまいです。あなたのコードは何をしているのですか? – beaker

+0

したがって、3つの列とN行のランダムな行列を作成することになっています。これは、キューブ内のポイントのXYZ座標を表します。制約は、キューブのサイズ(lx)とポイント間の最小距離(d)です。だから私のコードは、nx3のランダムな行列を生成し、その要素の新しい点を生成しない場合は、距離が少なくとも1であるかどうかを確認するために各項目をチェックします。その後、それは戻って、その制限を維持するために前のすべての点をチェックします。いくつかのポイントの距離が1未満であるため失敗しました。 – Oppenheimer

+0

これはランダムな処理ですので、時々失敗すると思います。入力として渡している値は何ですか? [編集]をクリックして、元の質問に更新または説明(以前のコメントを含む)を追加してください。 – beaker

答えて

0

ポイントをする必要がありますどのようにランダム?可能な解決策があるとしても、すべての可能性のある状態に比べてそれらはほとんどありません。解決策を完全にランダムに当てるのは無限に長くかかることがあります。

私はアプローチのカップル提案することができます:グリッド内のポイントを設定し

  1. をした後、延長一部にそれらをランダム。ポイント単位で座標のランダム化を適用すると、ある距離が1未満になる場合に変更を元に戻すことができます。
  2. 許容されるスペースの中央に「初期」点から開始します「初期」点からランダムな角度と半径1を持つ極座標の手段によって点の層を追加します。レイヤーを追加したら、半径を2に増やして、「初期」ポイントを原点に保つことができます。または、最後に追加したレイヤーのポイントをループし、同様の方法で新しいレイヤーを追加しようとします。どちらの場合も、距離は以前のすべての点に対してチェックする必要があります。

どちらのアプローチでも、最終的な結果は全くランダムではありません。私がそれを見て、本当にランダムな解を得るためには、lxの箱に256個のボールを確率的に物理的にシミュレーションして、ちょっと動かす必要があります。

+0

それは良いquesitonです...私は確かにどのようにランダムになるはずです。 実行にはかなり時間がかかります。ボックスのサイズを小さくし、パーティクルを同じに保つことによって、時間がほぼ指数関数的に増加します。私は、このコードをより効率的にするためにこのコードを最適化する方法を本当に理解する必要があると考えていました。 私は間違いなくあなたのアプローチを見て、あなたのアプローチを実装しようとします。 – Oppenheimer

0

この2Dの問題は、ポアソンディスク分布と呼ばれ、3Dポアソン球分布と呼ばれます。この問題に対する妥当な良い解決策は、paperを確認してください。Matlabのhere

たぶん動作するコードは、それは私が私のPython実装

+0

あなたの提案をありがとう。私はこのコードの3D版を試してしまい、矛盾した行列サイズを取得します。 256 X 3マトリックスの代わりに、私は200,207,216 x 3マトリックスを得て、それがなぜそれをしているのか理解できませんでした。 – Oppenheimer

関連する問題