Bezmaksas pareizi MCTS C valodā iChess.io

Sveiki, šodien es vēlos jums parādīt problēmu, ar kuru es saskāros ilgu laiku… Es gribēju izmantot Monte Carlo Tree Search ar klasisko atlasi, paplašināt, atpakaļ izplatīt un tā tālāk… problēma, ar kuru saskāros, bija atmiņas noplūde, un es kādu laiku meklēju labu risinājumu, lai samazinātu atmiņu par vienu līmeni un atbrīvotu atmiņu efficinet. Lai to izdarītu pareizi, ir jāaprēķina maksimālais dziļums un jāatgriežas no dziļāka uz mazāk dziļāku, lai koks. Pārējais ir izskaidrots tālāk koda piemērā. Paldies un izbaudi! :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;
}

Atstāj atbildi

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti *

*

Šī vietne izmanto Akismet, lai samazinātu surogātpastu. Uzziniet, kā tiek apstrādāti jūsu komentāru dati.