【问题标题】:Generating N random points with certain predefined distance between them生成 N 个随机点,它们之间具有一定的预定义距离
【发布时间】:2015-12-24 22:22:50
【问题描述】:

我必须在 MATLAB 中创建高速公路场景。我必须在高速公路上生成随机点(即车辆)。通过使用 randn() 命令,随机点相互重叠。我想生成随机点,以保持随机点之间的最小距离。

谁能帮我生成这种场景..

【问题讨论】:

  • 对于 R²,如果您想保持纯均匀分布,我不知道有什么方法比 rejection sampling 更好。是否需要均匀分布?你的场景有多大?对于大型场景,拒绝采样可能会很慢。
  • 场景:一条长度为 L 的公路(L 值可以从 3000 米到 10,000 米不等)。高速公路可以有多条车道。我必须在高速公路上随机生成车辆,以保持两辆车之间的最小距离。车辆数量可以从 10 到 500 不等。我认为车辆将均匀分布。如果我们可以为车辆使用其他发行版,请告诉我。

标签: matlab random


【解决方案1】:

您可以考虑泊松圆盘(又名圆盘)采样。基本上,泊松圆盘采样会产生紧密排列的点,但彼此之间的距离不会超过指定的最小距离,从而产生更自然的模式。

我的matlab生锈了,抱歉,没有代码,但是链接

http://www.cs.sandia.gov/~samitch/papers/cccg-present.pdf

https://www.jasondavies.com/poisson-disc/

【讨论】:

  • 这可能是解决非常大问题的方法。
  • @severin:Danial 是对的。泊松磁盘适用于大问题。我尝试了链接cusacklabcomputing.blogspot.ca/2013/07/… 上给出的泊松磁盘。它产生大量我不需要的数字。我需要改变车辆数量以保持模拟区域不变。
【解决方案2】:

这不是一个优雅的解决方案,但它满足您的最小距离限制。

% Highway dimensions
lx = 1000;
ly = 1000;

% Minimum distance
d = 100;

% Number of points to generate
n = 50;

points = [rand(1, 2) .* [lx ly]];
d2 = d ^ 2;

% Keep adding points until we have n points.
while (size(points, 1) < n)

    % Randomly generate a new point
    point = rand(1, 2) .* [lx ly];

    % Calculate squared distances to all other points
    dist2 = sum((points - repmat(point, size(points, 1), 1)) .^ 2, 2);

    % Only add this point if it is far enough away from all others.
    if (all(dist2 > d2))
        points = [points; point];
    end
end

plot(points(:,1), points(:,2), 'o')

【讨论】:

  • 这不是拒绝方法,它不会以相同的概率生成所有可能的事件,但它可能非常接近它。拒绝方法将拒绝并重新生成所有点,直到一组符合要求。
  • @Danial 感谢您的澄清。如果我错了,请纠正我,但真正的拒绝抽样会比我的方法慢得多。
  • 特别是当被拒绝的概率很高时,它会慢得多。
  • @Jeff Irwin:如果 lx 和 ly 相等,此代码将完美运行。如果我给出 lx=1000 和 ly=10,则代码没有给出预期的结果。
  • dn 的值是多少?根据输入,可能无法将一定数量的车辆打包到给定区域。我确实使用lx = 1000; ly = 700; d = 100; n = 50; 测试了我的代码,它按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-10
  • 2013-01-24
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多