// Can pass root as an argument, but will not affect performance much double DESPOT::WEU(VNode* vnode, double xi) { VNode* root = vnode; while (root->parent() != NULL) { root = root->parent()->parent(); } return Gap(vnode) - xi * vnode->Weight() * Gap(root); }
VNode* DESPOT::FindBlocker(VNode* vnode) { VNode* cur = vnode; int count = 1; while (cur != NULL) { if (cur->utility_upper_bound - count * Globals::config.pruning_constant <= cur->default_move().value) { break; } count++; if (cur->parent() == NULL) { cur = NULL; } else { cur = cur->parent()->parent(); } } return cur; }
void DESPOT::ExploitBlockers(VNode* vnode) { if (Globals::config.pruning_constant <= 0) { return; } VNode* cur = vnode; while (cur != NULL) { VNode* blocker = FindBlocker(cur); if (blocker != NULL) { if (cur->parent() == NULL || blocker == cur) { double value = cur->default_move().value; cur->lower_bound(value); cur->upper_bound(value); cur->utility_upper_bound = value; } else { const map<OBS_TYPE, VNode*>& siblings = cur->parent()->children(); for (map<OBS_TYPE, VNode*>::const_iterator it = siblings.begin(); it != siblings.end(); it++) { VNode* node = it->second; double value = node->default_move().value; node->lower_bound(value); node->upper_bound(value); node->utility_upper_bound = value; } } Backup(cur); if (cur->parent() == NULL) { cur = NULL; } else { cur = cur->parent()->parent(); } } else { break; } } }