TNode* ConstructTree(LNode** head){ if(!(*head)){ return NULL; } LNode* mid=GetMid(head); if(mid){ TNode* root=(TNode*)malloc(sizeof(TNode)); LNode* tmpNode; if(mid->next==NULL){ tmpNode=mid; root->left=NULL; root->right=NULL; }else{ tmpNode=mid->next; mid->next=NULL; root->right=ConstructTree(&tmpNode->next); tmpNode->next=NULL; root->left=ConstructTree(head); } root->data=tmpNode->data; return root; }else{ return NULL; } }
ValuedAction DESPOT::Search() { if (logging::level() >= logging::INFO) { model_->PrintBelief(*belief_); } if (Globals::config.time_per_move <= 0) // Return a random action if no time is allocated for planning return ValuedAction(Random::RANDOM.NextInt(model_->NumActions()), Globals::NEG_INFTY); double start = get_time_second(); vector<State*> particles = belief_->Sample(Globals::config.num_scenarios); logi << "[DESPOT::Search] Time for sampling " << particles.size() << " particles: " << (get_time_second() - start) << "s" << endl; statistics_ = SearchStatistics(); start = get_time_second(); static RandomStreams streams = RandomStreams(Globals::config.num_scenarios, Globals::config.search_depth); LookaheadUpperBound* ub = dynamic_cast<LookaheadUpperBound*>(upper_bound_); if (ub != NULL) { // Avoid using new streams for LookaheadUpperBound static bool initialized = false; if (!initialized ) { lower_bound_->Init(streams); upper_bound_->Init(streams); initialized = true; } } else { streams = RandomStreams(Globals::config.num_scenarios, Globals::config.search_depth); lower_bound_->Init(streams); upper_bound_->Init(streams); } root_ = ConstructTree(particles, streams, lower_bound_, upper_bound_, model_, history_, Globals::config.time_per_move, &statistics_); logi << "[DESPOT::Search] Time for tree construction: " << (get_time_second() - start) << "s" << endl; start = get_time_second(); root_->Free(*model_); logi << "[DESPOT::Search] Time for freeing particles in search tree: " << (get_time_second() - start) << "s" << endl; ValuedAction astar = OptimalAction(root_); start = get_time_second(); delete root_; logi << "[DESPOT::Search] Time for deleting tree: " << (get_time_second() - start) << "s" << endl; logi << "[DESPOT::Search] Search statistics:" << endl << statistics_ << endl; return astar; }
void DESPOT::Compare() { vector<State*> particles = belief_->Sample(Globals::config.num_scenarios); SearchStatistics statistics; RandomStreams streams = RandomStreams(Globals::config.num_scenarios, Globals::config.search_depth); VNode* root = ConstructTree(particles, streams, lower_bound_, upper_bound_, model_, history_, Globals::config.time_per_move, &statistics); CheckDESPOT(root, root->lower_bound()); CheckDESPOTSTAR(root, root->lower_bound()); delete root; }