iChess.io에서 C로 MCTS를 정확하게 무료로 풀어보세요

안녕, 오늘은 내가 오랫동안 직면했던 문제를 보여드리고 싶습니다.… 클래식 선택과 함께 Monte Carlo Tree Search를 사용하고 싶었습니다., 확장하다, 역전파 등… 내가 직면한 문제는 메모리 누수였습니다, 그리고 나는 메모리를 한 단계 줄이고 효율적으로 메모리를 비우는 좋은 솔루션을 찾고 있었습니다.. 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! :디.

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;
}

답장을 남겨주세요

귀하의 이메일 주소는 공개되지 않습니다. 필요 입력 사항은 표시되어 있습니다 *

*

이 사이트는 스팸을 줄이기 위해 Akismet을 사용합니다.. 댓글 데이터가 처리되는 방법 알아보기.