确定用于最佳优先搜索的评估器功能

时间:2011-09-08 14:59:30

标签: c search translation

在从Tim Jones的<人工智能:系统方法中运行最好的第一次搜索时,我们被要求确定如何生成下一个移动以及为什么选择解决方案。

为了做到这一点,两个代码部分正在困扰我们:

#define checkPiece( board, y )((board & (1 << (15-y))) ? 1 : 0)

#define MAX_TESTS   14
#define MAX_VECTOR  4

typedef struct {
    unsigned char len;
    unsigned char vector[MAX_VECTOR];
} test_t;

const test_t tests[MAX_TESTS]={
                            { 4, { 0,  4, 8,  12 } },
                            { 4, { 1,  5, 9,  13 } },
                            { 4, { 2,  6, 10, 14 } },
                            { 4, { 3,  7, 11, 15 } },
                            { 2, { 8, 13 } },
                            { 3, { 4,  9, 14 } },
                            { 4, { 0,  5, 10, 15 } },
                            { 3, { 1,  6, 11 } },
                            { 2, { 2,  7 } },
                            { 2, { 1,  4 } },
                            { 3, { 2,  5,  8 } },
                            { 4, { 3,  6,  9, 12 } },
                            { 3, { 7, 10, 13 } },
                            { 2, { 11, 14 } } 
                          };

这两个都用于EvaluateBoard函数

void evaluateBoard( node_t *node_p ) {
    int test, i, check;
    int cost = 0;

    for (test = 0 ; test < MAX_TESTS ; test++) {

        check = 0;

        for (i = 0 ; i < tests[test].len ; i++) {
            check += checkPiece( node_p->board, tests[test].vector[i] );
        }

        if (check > 1) cost+= (check-1);
    }

 node_p->g = cost;

  printf(" evaluateBoard %04x = (h %d, g %d)\n", 
       node_p->board, node_p->h, node_p->g);

  return;
}

下一步是由Cost int决定的,是checkPiece结果的结果。在这种情况下,董事会== 1288,但是如何从test_t tests中选择y值?

另外,结构test_t tests是什么?我们在C代码中从未见过类似的东西。它是多维数组的一种形式吗?

2 个答案:

答案 0 :(得分:1)

test_t是一个结构。代码的作者用一组初始化结构初始化tests数组。在C中,您可以初始化这样的结构;

struct t {
     int num1;
     double num2;
};

struct t my_struct = { 123, 3.141 };

如果我想初始化一个struct t的数组,那么我可以这样做:

struct t my_array[] = {
    {123, 3.141},
    {3245, 6.2156},
    {912, 5.3},
    {0, 1.0}
};

对于BFS的东西,最好的第一次搜索是纯粹的启发式组合搜索算法。这意味着在图表中的任何给定节点处,您将选择最佳的后继节点。最优可能是最低成本或最高成本。 node_t看起来像一个通用的C结构,以支持A *,BFS和Dijkstra搜索算法。这就是为什么忽略node_t结构的h成员变量 - 它没有在BFS中使用。

evaluateBoard()通过遍历整个测试列表来评估node_t位置的开销。不选择y值,您只是评估节点的成本,以便稍后您可以在算法中选择最优的后继移动。

答案 1 :(得分:1)

  

另外,结构test_t测试是什么?

tests被定义为struct test_t的数组。数组中包含的每个元素本身都包含char个数组。所以,是的,你可以说它是某种二维数组。

C(和C ++ 11)允许使用嵌套的大括号初始化结构体和结构数组,就像在示例中一样。

  

但是如何从test_t测试中选择y值?

y makro中所需的checkPiece值是vector数组的第n个值,它本身包含在当前struct test_t中。

相关问题