Algorithm 避免矩阵算法中的位置冲突

Algorithm 避免矩阵算法中的位置冲突,algorithm,matrix,nearest-neighbor,neighbours,Algorithm,Matrix,Nearest Neighbor,Neighbours,假设你有一个nxm矩阵。在此矩阵中,您将随机定位四个不同的对象,例如a、b、c、d。每一个都会有很多 现在最好的算法是什么,这样当它们被随机放置时,它们的位置不会发生冲突 我的做法是: 随机放置 检查所有对象的位置,如果它们发生碰撞,请继续移动,直到找到一个空的空间 我只是想知道是否还有其他有效的解决方案。如果最终目标是填充电路板,您可以为矩阵上的每个空格选择其中的类型(选择是随机的) 要添加空白选项,请添加第五个NO_类型的选项 如果已知外观的数量,请尝试以下操作: 创建一个大小为n X m(

假设你有一个nxm矩阵。在此矩阵中,您将随机定位四个不同的对象,例如abcd。每一个都会有很多

现在最好的算法是什么,这样当它们被随机放置时,它们的位置不会发生冲突

我的做法是:

  • 随机放置
  • 检查所有对象的位置,如果它们发生碰撞,请继续移动,直到找到一个空的空间

  • 我只是想知道是否还有其他有效的解决方案。

    如果最终目标是填充电路板,您可以为矩阵上的每个空格选择其中的类型(选择是随机的)

    要添加空白选项,请添加第五个NO_类型的选项

    如果已知外观的数量,请尝试以下操作:

  • 创建一个大小为n X m(称为L)的列表,其值为1..L

  • 对于每个外观,从列表中随机选择(类似于
    pos=rand(L)
    ,并从列表中删除该值(不要忘记减少L)

  • 根据需要多次这样做


  • 另一个答案的变体,无需创建额外的结构(且具有更好的时间复杂性):


    假设你有对象a_1,…,a_K(在你的例子中K=4)每一个都必须出现n_k次,使用n_1+…+n_k如果你有一个算法可以生成一系列随机位置,这些位置在你的数组中不会发生冲突,那么你可以很容易地生成你需要的任意多个位置a然后b然后c然后d等等

    您可以使用以下算法完成此操作:

    Generate a random prime number p that is greater than n * m
    Generate a random number r in the range [0, n * m)
    while(need more numbers)
    {
        // output a position:
        yield x = r % n, y = r / n
    
        // generate the next position:
        r = (r + p) % (n * m)
    }
    
    位置永远不会重叠,因为p和n*m之间没有公共因子。它将产生一个大于n*m的值

    有关如何生成随机素数,请参见此问题:

    如果p是素数,那么它将是n*m的相对素数

    另见这个问题:


    如果一个人有一个固定的数量,比如说a必须出现五次,那该怎么办?
    Generate a random prime number p that is greater than n * m
    Generate a random number r in the range [0, n * m)
    while(need more numbers)
    {
        // output a position:
        yield x = r % n, y = r / n
    
        // generate the next position:
        r = (r + p) % (n * m)
    }