Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 枚举具有固定行和列和的矩阵组合_Algorithm_Matrix_Combinations_Enumeration_Counting - Fatal编程技术网

Algorithm 枚举具有固定行和列和的矩阵组合

Algorithm 枚举具有固定行和列和的矩阵组合,algorithm,matrix,combinations,enumeration,counting,Algorithm,Matrix,Combinations,Enumeration,Counting,我试图找到一种算法(不是matlab命令)来枚举所有可能的NxM矩阵,其约束条件是每个单元格中只有正整数(或0)以及每行和每列的固定和(这些是算法的参数) 例如: 枚举行总计2、1和列总计0、1、2的所有2x3矩阵: | 0 0 2 | = 2 | 0 1 0 | = 1 0 1 2 | 0 1 1 | = 2 | 0 0 1 | = 1 0 1 2 这是一个相当简单的例子,但随着N和M的增加,以及总和的增加,可能会有很多可能性 编辑1 我可能有一个有效的安排来启动算法: matr

我试图找到一种算法(不是matlab命令)来枚举所有可能的NxM矩阵,其约束条件是每个单元格中只有正整数(或0)以及每行和每列的固定和(这些是算法的参数)

例如: 枚举行总计2、1和列总计0、1、2的所有2x3矩阵:

| 0 0 2 | = 2
| 0 1 0 | = 1
  0 1 2

| 0 1 1 | = 2
| 0 0 1 | = 1
  0 1 2
这是一个相当简单的例子,但随着N和M的增加,以及总和的增加,可能会有很多可能性


编辑1

我可能有一个有效的安排来启动算法:

matrix = new Matrix(N, M) // NxM matrix filled with 0s
FOR i FROM 0 TO matrix.rows().count()
  FOR j FROM 0 TO matrix.columns().count()
    a = target_row_sum[i] - matrix.rows[i].sum()
    b = target_column_sum[j] - matrix.columns[j].sum()
    matrix[i, j] = min(a, b)
  END FOR
END FOR
target_row_sum[i]是第i行的预期总和

在上面的例子中,它给出了第二种安排


编辑2: (基于)

设M为验证给定条件的任意矩阵(行和列和固定、正或空单元格值)。 设(a,b,c,d)为M中的4个单元格值,其中(a,b)和(c,d)在同一行上,(a,c)和(b,d)在同一列上。 设Xa为包含a的单元格的行号,Ya为其列号

例如:

| 1 a b |
| 1 2 3 |
| 1 c d |
-> Xa = 0, Ya = 1
-> Xb = 0, Yb = 2
-> Xc = 2, Yc = 1
-> Xd = 2, Yd = 2
以下是一个算法,用于获得所有组合,验证初始条件并仅使a、b、c和d变化:

// A matrix array containing a single element, M
// It will be filled with all possible combinations
matrices = [M]

I = min(a, d)
J = min(b, c)
FOR i FROM 1 TO I
    tmp_matrix = M
    tmp_matrix[Xa, Ya] = a - i
    tmp_matrix[Xb, Yb] = b + i
    tmp_matrix[Xc, Yc] = c - i
    tmp_matrix[Xd, Yd] = d + i
    matrices.add(tmp_matrix)
END FOR
FOR j FROM 1 TO J
    tmp_matrix = M
    tmp_matrix[Xa, Ya] = a + j
    tmp_matrix[Xb, Yb] = b - j
    tmp_matrix[Xc, Yc] = c + j
    tmp_matrix[Xd, Yd] = d - j
    matrices.add(tmp_matrix)
END FOR
然后应能找到矩阵值的所有可能组合:

  • 对每个可能的4个单元组的第一个矩阵应用该算法
  • 递归地将算法应用于通过上一次迭代获得的每个子矩阵,用于除已在父执行中使用的任何组之外的每个可能的4个单元组
    递归深度应为
    (N*(N-1)/2)*(M*(M-1)/2)
    ,每次执行产生
    ((N*(N-1)/2)*(M*(M-1)/2)-深度)*(I+J+1)
    子矩阵。但这会产生大量重复矩阵,因此可能会对其进行优化。

    对于NXM矩阵,您有NXM未知数和N+M方程。将随机数放在左上角(N-1)X(M-1)子矩阵上,除了(N-1,M-1)元素。现在,您可以轻松地找到其余N+M元素的闭合形式

    更多细节:共有T=N*M个元素

    有R=(N-1)+(M-1)-1个随机填写的元素


    剩余未知数:T-S=N*M-(N-1)*(M-1)+1=N+M

    你需要这个来计算吗?因为这需要您所做的,并且基于该页面,看起来通常会有大量的解决方案,所以如果您想要每个解决方案,那么您可能无法做得比蛮力递归枚举更好。有些软件似乎成功地使用了蒙特卡罗近似法,而不是全面的枚举法

    我问了一个问题,可能会有帮助。虽然这个问题涉及的是保持每行和每列中字母的频率,而不是求和,但有些结果可以跨行翻译。例如,如果您找到任何带有数字的子矩阵(一对不一定相邻的行和一对不一定相邻的列)

    xy
    yx
    
    然后你可以把这些重新排列成

    yx
    xy
    
    不更改任何行或列和。然而:

    • 证明了在一般情况下,存在任何2x2交换序列都无法达到的有效矩阵。这可以从他的3x3矩阵和映射
      A->1
      B->2
      C->4
      中看出,并注意到,因为没有元素在一行或一列中出现超过一次,所以原始矩阵中的频率保持等同于新矩阵中的和保持。然而
    • 链接到数学证明,它实际上适用于条目仅为0或1的矩阵
    更一般地说,如果你有任何子矩阵

    ab
    cd
    
    如果(不一定是唯一的)最小值是d,那么您可以用任何d+1矩阵替换它

    ef
    gh
    

    其中h=d-i,g=c+i,f=b+i和e=a-i,对于任何整数0,我刚刚编辑了这个问题,以包含一个附加约束:单元格值必须是正整数或空整数,否则将有无限多的排列,您的命题确实是唯一有效的答案。的确,我需要这个算法在大数据样本上应用Fisher精确检验(但单元值相对较低,因此排除了任何渐近检验,如Chi²检验)。我还需要另一个更实用的问题的算法,涉及许多卖家(每个卖家都有一组数量可变的可用物品)和买家,他们试图找到一组数量不同的物品的最佳配置(最低成本,包括每个卖家和每种物品的固定和可变费用…)-但我还是要看一看蒙特卡罗测试。如果行和列的总和较低,那么可以通过依次决定如何将不可区分的“大理石”分配到“料仓”来列举所有可能性,其中行中的每个单元格都是一个料仓,行和告诉您有多少大理石。有
    (n+r-1)选择(r-1)
    方法将r个弹珠分布在n个箱子中,用于一行;将每行的结果相乘,得到配置数量的松散上限(松散,因为某些分布将被列和禁止)。