在从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代码中从未见过类似的东西。它是多维数组的一种形式吗?
答案 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
中。