需要帮助找到启发式序列的逻辑

Need help for find the logic of a heuristic sequence

我正在开发一个系统,可以完全探索这种性别的简单启发式地图(可以有不同数量的分支和不同深度):

Simple heuristic map

因此,我将探索的位置保存在地图深度大小的 int 数组中。目标是探索地图的所有节点,所以得到这个输出:0 2 6, 0 2 7, 0 3 8, 0 3 9, 1 4 10 etc.. 但实际上我的代码(需要调用多次,因为它只能更新数组一次),我有这个: 0 2 6, 0 2 7, 0 3 8, **1** 3 9, 1 4 10 etc..

这是我的代码,我不知道如何解决这个问题..

void get_next_branch(int *s, int nbr_branch, int size)
{
    int a;

    a = 0;

    while (a < size)
    {
        condition = (size - a)/(nbr_branch - 1);
        if (condition)
        {
            if (s[size - 1] % (condition) + 1 == condition)
                s[a]++;
        }
        a++;
    }
}

这是调用这个函数的主要例子

int main(void)
{
    int id[3] = {0, 2, 6};

    while (id[2] < 13)
    {
        printf("%d %d %d\n", id[0], id[1], id[2]);
        get_next_branch(id, 2, 3);
    }

    return (0);
}

先谢谢你了!

你可能想对这个问题使用闭合公式

  • b为分支数
  • d 你想要在 (d >= 0)
  • 中查找数字的深度

我们马上得到

Number of nodes at depth d = bd+1

(因为在深度 0 处我们已经有两个节点,所以没有使用“根”节点)。

深度d第一个节点的个数是下层节点个数的总和。基本上,

first node number at depth 0 = 0

first node number at depth d > 0 = b1 + b2 + b3 + ... + bd

这是比值为b的几何级数之和。感谢公式(Wolfram)

first node number at depth d = b * (1 - bd) / (1 - b)

例如b == 2 和 d == 2(3rd 级别)

Number of nodes: 2 ^ 3 = 8

Starting at number: 2 * (1 - 2^2) / (1 - 2) = 6

可以根据上面的公式来显示任何级别的树的程序。

要打印具有 b 个分支的树的多个级别:

效用函数

int power(int n, int e) {
   if (e < 1) return 1;
   int p=n;
   while (--e) p *= n;
   return p;
}

以上两个公式

int nodes_at_depth(int branches, int depth) {
   return power(branches, depth+1);
}

int first_at_depth(int branches, int depth) {
    return (branches * (1 - power(branches, depth))) / (1 - branches);
}

示例主程序,待调用

./heuristic  nb_of_branches  nb_of_levels

即调用两个函数

int main(int argc, char **argv)
{
   if (argc != 3) return 1;

   int b = atoi(*++argv);
   int d = atoi(*++argv);

   if (b < 2) return 2;

   int i,j;
   for (i=0 ; i<d ; i++) {
      int n = nodes_at_depth(b, i);  // number of nodes at level i
      int s = first_at_depth(b, i);  // first number at that level
      for (j=0 ; j<n ; j++) printf(" %d", s+j);
      printf("\n");
   }

   return 0;
}

通话中

./heuristic 2 4

给予

 0 1
 2 3 4 5
 6 7 8 9 10 11 12 13
 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29