예제 #1
0
파일: uctagent.cpp 프로젝트: zahybnaya/mnk
/**
 * 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;
}
예제 #2
0
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;	
	}
}
예제 #3
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);
	
}