Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 一种相距至少D的圆的随机放置算法_Algorithm_Random - Fatal编程技术网

Algorithm 一种相距至少D的圆的随机放置算法

Algorithm 一种相距至少D的圆的随机放置算法,algorithm,random,Algorithm,Random,我正在研究如何编写一个算法,在任意尺寸的2d矩形中随机放置半径为R的圆,这样每个放置的圆与矩形中的其他圆至少有D距离 矩形不需要填充,更具体地说,旧的圆可能会被破坏,所以我需要能够放置一个新的圆,它尊重我已经放置的最后N个圆的位置(例如5个),如果它不能满足这些条件,那么我可以单独处理它 有谁能帮我推断出这样一个算法,或者指出一些可能涉及这个问题的研究吗?1。选择随机起始点。 1. Pick random startingspot. 2. Place circle 3. Move in rand

我正在研究如何编写一个算法,在任意尺寸的2d矩形中随机放置半径为R的圆,这样每个放置的圆与矩形中的其他圆至少有D距离


矩形不需要填充,更具体地说,旧的圆可能会被破坏,所以我需要能够放置一个新的圆,它尊重我已经放置的最后N个圆的位置(例如5个),如果它不能满足这些条件,那么我可以单独处理它

有谁能帮我推断出这样一个算法,或者指出一些可能涉及这个问题的研究吗?

1。选择随机起始点。
1. Pick random startingspot.
2. Place circle
3. Move in random direction at least D
4. Goto 2 until distance to edge is < D or the distance to another circles center is < 2D
2.放置圆 3.沿随机方向移动至少D 4.转到2,直到到边的距离
1。选择随机起始点。
2.放置圆
3.沿随机方向移动至少D
4.转到2,直到到边的距离
确定是否有空间

Choose resolution required, say delta = D/100
for( x = 0; x < rectangle_size x += delta )
   for( y = 0; y < rectangle_size y += delta )
      unset failed
      loop over circles
           if x,y less than 2D from circle
              set failed
              break from circle loop
       if not failed
            return 'yes there is room'
return 'no, there is no room'
选择所需的分辨率,例如delta=D/100
对于(x=0;x<矩形_尺寸x+=delta)
对于(y=0;y<矩形_尺寸y+=三角形)
取消设置失败
绕圈子
如果x,y距离圆小于2D
设置失败
从循环中中断
如果没有失败
返回“是的,还有空间”
返回“没有,没有空间”
如果你希望有这么多的圆,以至于只剩下几个孔来容纳新的圆,那么你可以这样做

clear candidates
Choose resolution required, say delta = D/100
for( x = 0; x < rectangle_size x += delta )
   for( y = 0; y < rectangle_size y += delta )
      unset failed
      loop over circles
           if x,y less than 2D from circle
              set failed
              break from circle loop
       if not failed
            add x,y to candidates
if no candidates
    return 'there is no room'
randomly choose location for new circle from candidates
清除候选项
选择所需的分辨率,例如delta=D/100
对于(x=0;x<矩形_尺寸x+=delta)
对于(y=0;y<矩形_尺寸y+=三角形)
取消设置失败
绕圈子
如果x,y距离圆小于2D
设置失败
从循环中中断
如果没有失败
将x,y添加到候选对象
如果没有候选人
返回“没有空间”
从候选人中随机选择新圆圈的位置
确定是否有空间

Choose resolution required, say delta = D/100
for( x = 0; x < rectangle_size x += delta )
   for( y = 0; y < rectangle_size y += delta )
      unset failed
      loop over circles
           if x,y less than 2D from circle
              set failed
              break from circle loop
       if not failed
            return 'yes there is room'
return 'no, there is no room'
选择所需的分辨率,例如delta=D/100
对于(x=0;x<矩形_尺寸x+=delta)
对于(y=0;y<矩形_尺寸y+=三角形)
取消设置失败
绕圈子
如果x,y距离圆小于2D
设置失败
从循环中中断
如果没有失败
返回“是的,还有空间”
返回“没有,没有空间”
如果你希望有这么多的圆,以至于只剩下几个孔来容纳新的圆,那么你可以这样做

clear candidates
Choose resolution required, say delta = D/100
for( x = 0; x < rectangle_size x += delta )
   for( y = 0; y < rectangle_size y += delta )
      unset failed
      loop over circles
           if x,y less than 2D from circle
              set failed
              break from circle loop
       if not failed
            add x,y to candidates
if no candidates
    return 'there is no room'
randomly choose location for new circle from candidates
清除候选项
选择所需的分辨率,例如delta=D/100
对于(x=0;x<矩形_尺寸x+=delta)
对于(y=0;y<矩形_尺寸y+=三角形)
取消设置失败
绕圈子
如果x,y距离圆小于2D
设置失败
从循环中中断
如果没有失败
将x,y添加到候选对象
如果没有候选人
返回“没有空间”
从候选人中随机选择新圆圈的位置

首先想到的算法是。基本上,你从最简单的解决方案开始,可能只是一个网格,然后你以随机的方式“摇动盒子”,看看你是否能得到更好的答案。首先你做大的震动,然后逐渐地使它们变小。这听起来有点混乱,并不总是产生绝对最佳的解决方案,但当某件事情是计算密集型的,它通常会在更短的时间内非常接近。

首先想到的算法是。基本上,你从最简单的解决方案开始,可能只是一个网格,然后你以随机的方式“摇动盒子”,看看你是否能得到更好的答案。首先你做大的震动,然后逐渐地使它们变小。这听起来有点混乱,并不总是产生绝对最佳的解决方案,但当某个问题是计算密集型的时,它通常会在更短的时间内变得非常接近。

这取决于你所说的“随机”是什么意思。假设您希望尽可能接近均匀分布,您可能需要使用RavenPoint建议的迭代解决方案。随机放置所有圆,然后开始替换不符合距离条件的圆可能会稍微快一点


如果随机性不是那么重要——也就是说,如果它只是“看起来”随机的(如果你没有做一些科学的事情,这可能很好),那么网格化你的空间,并通过在网格中选择N个索引来放置N个圆。通过在网格内放置圆的位置添加一些噪波,可以使其稍微“随机”。这对于稀疏布局非常有效。

这取决于“随机”的含义。假设您希望尽可能接近均匀分布,您可能需要使用RavenPoint建议的迭代解决方案。随机放置所有圆,然后开始替换不符合距离条件的圆可能会稍微快一点


如果随机性不是那么重要——也就是说,如果它只是“看起来”随机的(如果你没有做一些科学的事情,这可能很好),那么网格化你的空间,并通过在网格中选择N个索引来放置N个圆。通过在网格内放置圆的位置添加一些噪波,可以使其稍微“随机”。这对于稀疏放置非常有效。

是否必须“填充”矩形?你的问题没有被很好地描述。您可以在任意位置放置一个圆,这将满足要求。似乎暗示了最大化圆数的目标。矩形不需要填充,更具体地说,旧的圆可能会被破坏,因此,我需要能够放置一个新的圆圈,该圆圈尊重我已经放置的最后N个圆圈的位置(例如,eg为5),