你好, 今天我想向你们展示我长期以来面临的问题… 我想使用蒙特卡洛树搜索和经典选择, 扩张, 反向传播等等… 我遇到的问题是内存泄漏, 我正在寻找一些时间来找到好的解决方案,以减少一个级别的内存并有效地释放内存. 为了确保正确,您必须计算最大深度,然后从较深到较浅的深度进行排序,以便树. 其余内容在下面的代码示例中解释. 谢谢并享受! :D.
typedef struct ch_mcts_tree { struct ch_mcts_tree **children; struct ch_mcts_tree *parent; float *board; int parents; int player; int total_count; int count; int index; int *visit_count; float *value; float *prob; } ch_mcts_tree; int ch_calculate_depth(ch_mcts_tree* node) { if (node == NULL) return 0; int max_depth = 0; for (int i = 0; i < node->count; ++i) { if (node->children[i] != NULL) { int child_depth = ch_calculate_depth(node->children[i]); if (child_depth > max_depth) { max_depth = child_depth; } } } return max_depth + 1; } ch_mcts_tree* ch_free_mcts(ch_mcts_tree* root, int exclude_index) { if (root == NULL) return NULL; int* depths = (int*)CALLOC(root->count, sizeof(int)); for (int i = 0; i < root->count; ++i) { depths[i] = (i == exclude_index || root->children[i] == NULL) ? -1 : ch_calculate_depth(root->children[i]); } for (int pass = 0; pass < root->count; ++pass) { int max_depth = -1, max_index = -1; for (int i = 0; i < root->count; ++i) { if (depths[i] > max_depth) { max_depth = depths[i]; max_index = i; } } if (max_index != -1 && root->children[max_index] != NULL) { root->children[max_index] = ch_free_mcts(root->children[max_index], -1); depths[max_index] = -1; } } FREE(depths); if (root->visit_count) { FREE(root->visit_count); root->visit_count = NULL; } if (root->value) { FREE(root->value); root->value = NULL; } if (root->board) { FREE(root->board); root->board = NULL; } if (root->prob) { FREE(root->prob); root->prob = NULL; } if (root->children) { FREE(root->children); root->children = NULL; } FREE(root); return NULL; }