[英]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.