/** * UCT expand * */ double UCTAgent::expand(Node* n){ bool is_root=false; if (n->visits==0/*root*/) { is_root=true; n->val=h.evaluate(n->m_board); n->visits=1; } double ret; std::vector<zet> zets; h.self=get_playing_color(); h.get_moves(n->m_board,n->player,false,zets); unsigned int actual_branching_factor = get_actual_branching_factor(zets,is_root); Node* new_node = NULL; for (unsigned int i=0;i<actual_branching_factor;++i){ zet z = zets[i]; uint64 move = z.zet_id; new_node = TreeAgent::connect(move,n,0,0); double eval = evaulate(new_node, n, move); new_node->val=eval; new_node->visits=1; int vir_rollouts = get_virtual_rollouts(); if (vir_rollouts >0){ double zval = value_for_new_node_uct(n,z); double normalized_h_value = (1/(1+exp(-zval))); assert(normalized_h_value>=0 && normalized_h_value<=1); new_node->val+=vir_rollouts* normalized_h_value; new_node->visits+=vir_rollouts; } if(i==0){ ret = eval; } } return ret; }
double evaulate (TNODE_p_t root) { if (root->type == TYPE_OPERAND) return atof(root->data); else if (root->type == TYPE_OPERATOR) { char ch = *(root->data); if (ch == '+') return (evaulate(root->left) + evaulate(root->right)); else if (ch == '-') return (evaulate(root->left) - evaulate(root->right)); else if (ch == '*') return (evaulate(root->left) * evaulate(root->right)); else if (ch == '/') return (evaulate(root->left) / evaulate(root->right)); else if (ch == '$' || ch == '^') return pow(evaulate(root->left), evaulate(root->right)); else return 0; } }
double postfix (String exp) { int i, l = strlen(exp); TSNODE_p_t stack = NULL; TNODE_p_t root = NULL; for (i = 0; i < l; ++i) { char z = *(exp + i); if (isNumber(z)) { String str = initString; snprintf(str, SIZE, "%d", numericValue(z)); root = initTNode(str); root->type = TYPE_OPERAND; push(&stack, root); } else if (isAlphabet(z)) { double numz; printf("\n\tEnter the value of '%c': ", z); scanf(" %lf", &numz); String str = initString; snprintf(str, SIZE, "%lf", numz); root = initTNode(str); root->type = TYPE_OPERAND; push(&stack, root); } else if (isOperator(z)) { TNODE_p_t b = pop(&stack); TNODE_p_t a = pop(&stack); String str = initString; snprintf(str, SIZE, "%c", z); root = initTNode(str); root->right = b; root->left = a; root->type = TYPE_OPERATOR; push(&stack, root); } } root = pop(&stack); return evaulate(root); }