【问题标题】:Random points with minimum distance [Octave]最小距离的随机点 [八度]
【发布时间】:2017-01-02 10:39:06
【问题描述】:

我正在尝试生成一个带有n 随机点的立方体,所有点的最小距离阈值为1。我正在使用矩阵来执行此操作,因此每列将是立方体中的(x,y,z) 点。我的代码有时有效,有时无效。我真的不知道为什么会这样......任何帮助或建议都值得赞赏 代码的输入是立方体一侧的长度和我想要使用的点数。

更新: 代码说明:
所以它应该创建一个带有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,[]);

【问题讨论】:

  • “有时有效,有时无效”相当模糊。你的代码应该做什么,它到底是怎么做到的?
  • 所以应该创建一个3列N行的随机矩阵。这表示立方体中点的 XYZ 坐标。约束是立方体的大小 (lx) 和点之间的最小距离 (d)。所以我的代码生成一个 nx3 随机矩阵并检查每个条目以查看它们的距离是否至少为 1,如果不是,它会为该元素生成一个新点。然后它返回并检查所有先前的点以保持该限制。它失败了,因为有些点的距离小于 1。
  • 这是一个随机过程,所以我预计它有时会失败。您将哪些值作为输入传递?请点击edit,为原始问题添加任何更新或说明(包括您之前的评论)。
  • 感谢您的回复。尽管这是一个随机过程,但我认为它根本不应该失败,因为在代码中它应该检查所有点。如果点有问题,应该用一个新点替换它并重新检查所有点。我不知道是我没有做足够的检查还是其他原因。
  • 我正在尝试了解您的算法。看起来,对于每个点,您都将其与其他每个点进行比较。如果距离低于阈值,则移动该点。然后检查下。如果距离太小,请再次移动它,但在下一个大循环之前,您不会使用新位置检查先前检查的点。外部while 循环似乎等同于0:n+1 上的for 循环。差不多了吗?

标签: matlab octave distribution


【解决方案1】:

这些点需要有多随机?尽管有可能的解决方案,但与所有可能的状态相比,它们很少。完全随机地找到一个解决方案可能需要无限长的时间。

我可以建议几种方法:

  1. 在网格中设置点,然后将它们随机化到一定程度。如果您逐点应用坐标的随机化,如果它导致某个距离低于 1,您可以“撤消”更改。
  2. 从允许空间中心的“初始”点开始,并使用从“初始”点开始的具有随机角度和半径 1 的极坐标添加点层。添加图层后,您只需将半径增加到 2 并保持“初始”点为原点。或者,循环上一个添加层的点,并尝试以类似的方式添加新的点。无论哪种情况,都必须对照所有较早的点检查距离。

在这两种方法中,最终结果都不会很随机。在我看来,要获得真正随机的解决方案,您需要在一个侧面为 lx 的盒子中对 256 个球进行随机物理模拟,然后稍微摇晃它们。

【讨论】:

  • 这是一个很好的问题...我不确定它应该是多么随机。你是完全正确的,它需要相当长的时间来运行。通过减小盒子大小并保持粒子相同,所花费的时间几乎呈指数增长。我在想我真的需要想办法优化这段代码以提高效率。不过,我一定会考虑并尝试实施您的方法。
【解决方案2】:

这个问题在 2D 中称为泊松盘分布,在 3D 中称为泊松球分布。对于这个问题,有已知合理的好解决方案,请查看paper

据说在 Matlab here 中工作的代码,如果它不起作用,我可能会挖掘出我的 Python 实现

【讨论】:

  • 感谢您的建议。我已经尝试过这段代码的 3D 版本,但会得到不一致的矩阵大小。我会得到一个 200、207,216 x 3 的矩阵,而不是 256 X 3 矩阵,但不知道为什么会这样。
猜你喜欢
  • 2013-01-24
  • 2021-04-15
  • 2018-04-12
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
相关资源
最近更新 更多