簡體   English   中英

如何使該算法更有效地利用內存?

[英]How can i make this algorithm more memory efficient?

我已經在這兩段代碼上工作了幾天,它似乎對於較小尺寸的搜索樹也可以正常工作,但是使用較高的代碼會產生分段錯誤。

我試圖通過使用打印標志來查找此類錯誤的具體出處,它似乎在is_goal()函數處中斷。 但是該函數的代碼可以假定為正確的。

因此,問題似乎是內存問題,這就是為什么在堆中有隊列以及正在創建的節點的原因。 但是它仍然崩潰。

是否還有其他可以不使用的內存節省技巧? 或者也許有更好的方法來保存此類節點?

重要的是要注意,我需要使用BFS(我不能使用A *來縮小搜索樹的大小)。

另外,如果您需要知道,該映射是一個哈希表,我在其中保存節點的顏色,因此在瀏覽時不會重復(這是因為哈希保存的取決於狀態信息,而不是Node信息)。

編輯:我被告知要指出要完成的目標,例如在搜索樹中找到目標狀態,目標是能夠迭代諸如rubik 3x3x3,n-puzzle 4x4 5x5,河內塔之類的大問題為此,由於此類問題的搜索樹很大,因此使用的內存必須最小,最終目標是將該算法與a *,dfid,ida *等其他算法進行比較。 我希望這是足夠的信息。

  Node* BFS(state_t start ){

    state_t state, child;  
    int d, ruleid;
    state_map_t *map = new_state_map();
    ruleid_iterator_t iter;
    std::queue<Node*> *open = new std::queue<Node*>();

    state_map_add( map, &start, 1); 

    Node* n = new Node(start);
    open->push(n);

    while( !open->empty() ) {
        n = open->front();
        state = n->get_state();
        open->pop();

        if (is_goal(&state) == 1) return n;

        init_fwd_iter( &iter, &state ); 

        while( ( ruleid = next_ruleid( &iter ) ) >= 0 ) {
            apply_fwd_rule( ruleid, &state, &child );


            const int *old_child_c = state_map_get( map, &child );
            if ( old_child_c == NULL ) {
                state_map_add( map, &child, 1 );
                Node* nchild = new Node(child); 
                open->push(nchild);
            }

        }

    }

    return NULL;
}  

我看到許多內存泄漏。

open不會被刪除,但是可能會分配在堆棧中而不是堆中。

std::queue<Node*> open;

更重要的是,沒有任何要推送到隊列中的節點被刪除,這可能是很大的內存消耗的根源。

刪除從隊列中刪除並且不打算重復使用的節點。 刪除隊列之前,請刪除隊列中的節點。

Node* BFS(state_t start ){

    state_t state, child;  
    int d, ruleid;
    state_map_t *map = new_state_map();
    ruleid_iterator_t iter;
    std::queue<Node*> open;

    state_map_add( map, &start, 1); 

    Node* n = new Node(start);
    open.push(n);

    while( !open.empty() ) {
        n = open.front();
        state = n->get_state();
        open.pop();

        if (is_goal(&state) == 1) {
            for (std::queue<Node*>::iterator it = open.begin(); it != open.end(); ++it)
                delete *it;

            return n;
        }
        else {
            delete n;
        }

        init_fwd_iter( &iter, &state ); 

        while( ( ruleid = next_ruleid( &iter ) ) >= 0 ) {
            apply_fwd_rule( ruleid, &state, &child );


            const int *old_child_c = state_map_get( map, &child );
            if ( old_child_c == NULL ) {
                state_map_add( map, &child, 1 );
                Node* nchild = new Node(child); 
                open.push(nchild);
            }

        }

    }

    return NULL;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM