Free Correctly MCTS in C in the iChess.io

Habari, today I would like to show you issue I faced for a long timeI wanted to use Monte Carlo Tree Search with classic select, expand, back propagate and so onthe problem I faced was the memory leak, and I was looking for some time to good solution to reduce memory by one level and efficnet free memory. To make it correclty you have to calculate max depth and reecude from deeper to less deeper in order the tree. Rest is explain below in the code example. Thanks and Enjoy! :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;
}

Acha Jibu

Barua pepe yako haitachapishwa. Sehemu zinazohitajika zimetiwa alama *

*

Tovuti hii hutumia Akismet kupunguza barua taka. Jifunze jinsi data yako ya maoni inavyochakatwa.