예제 #1
0
    pair<bool,long long int> test2(state_t n, int depth, int v, comparador c,bool turn){
        pair<bool,long long int> test_generados;
        long long int numSuc = 0;
        if(n.terminal() || depth == 0) {
            return make_pair(n.value() > v,0);
        }
        vector<state_t> sucesores = n.succ(turn);
        numSuc += sucesores.size();
        for(int i=0; i < sucesores.size(); i++) {

            if(turn == true){
                test_generados =  test2(sucesores[i],depth-1,v,c,!turn);
                numSuc += test_generados.second;
                if(test_generados.first) return make_pair(true, numSuc);
                
            }
            if(turn == false ){
                test_generados = test2(sucesores[i],depth-1,v,c,!turn);
                numSuc += test_generados.second;
                if(!test_generados.first) return make_pair(false, numSuc);
            }
        }
        if(turn == true){
            return make_pair(false,numSuc);
        }
        if(turn == false){
            return make_pair(true,numSuc);
        }
    }
예제 #2
0
    pair<int,long long int> busqueda(state_t n, int depth,bool turn){
        hash_table_t::iterator it;
        pair<int,long long int> valor_generados;
        pair<bool,long long int> test_generados;
        long long int numSuc = 0;
        it = tabla.find(n);
        if(it != tabla.end()) return make_pair((*it).second,0);
        if(n.terminal() || depth == 0) {
            return make_pair(n.value(),0);

        }

        vector<state_t> sucesores = n.succ(turn);
        numSuc += sucesores.size();
        valor_generados = busqueda(sucesores[0],depth-1,!turn);
        numSuc += valor_generados.second;
        for(int i=1; i < sucesores.size(); i++) {
            if(turn == true){
                test_generados = test2(sucesores[i],depth-1,valor_generados.first,comparador(true),!turn);
                numSuc += test_generados.second;
                if( test_generados.first){
                    valor_generados = busqueda(sucesores[i],depth-1,!turn);
                    numSuc += valor_generados.second;
                }
            }
            
            if(turn == false){
                test_generados = test(sucesores[i],depth-1,valor_generados.first,comparador(false),!turn);
                numSuc += test_generados.second;
                if(test_generados.first){
                    valor_generados = busqueda(sucesores[i],depth-1,!turn);    
                    numSuc+= valor_generados.second;
                }
                
            }
        }

        tabla.insert(make_pair(n, valor_generados.first));

        return make_pair(valor_generados.first,numSuc);

    }
int F_(state_t n, int alpha, int beta, bool color) {
    cout << "soy F" << endl;
    if (n.terminal()) {
        cout << " soy terminal y valgo: " << n.value() << endl;
        return n.value() ;//* (color ? 1 : -1);
    }

    int m = numeric_limits<signed int>::min();
    vector<int> succ_ = n.succ(color);
    if (succ_.size() != 0) {
        cout << " voy a jugar: " << succ_.front() << endl;
        state_t jugada = n.move(color, succ_.front());
        cout << " hice jugada " << endl;
        succ_.erase(succ_.begin());
        int valor = G_(jugada, alpha, beta, !color);
        m = MAX(m, valor);
        if ( m >= beta) {
            return m;
        }

        for(vector<int>::const_iterator iter=succ_.begin(),limit=succ_.end(); iter!=limit; ++iter) {
            jugada = n.move(color, *iter);
            int t = G_(jugada,m,m + 1, !color);
            if(t > m) {
                if(t >= beta) {
                    m = t;
                }
                else {
                    m = G_(jugada, t, beta, !color);
                }
            }
            if(m >= beta) {
                return beta;
            }
        }
    } else {
        return G_(n.move(color, 36), alpha, beta, !color);
    }
    return m;
}
int G_(state_t n, int alpha, int beta, bool color) {
    cout << "soy G" << endl;
    if (n.terminal()) {
        cout << " soy terminal y valgo: " << n.value() << endl;
        return n.value() ;//* (color ? 1 : -1);;
    }

    int m = numeric_limits<signed int>::max();
    vector<int> succ_ = n.succ(color);
    if (succ_.size() != 0) {
        state_t jugada = n.move(color, succ_.front());
        succ_.erase(succ_.begin());
        int valor = F_(jugada, alpha, beta, !color);
        m = MIN(m, valor);
        if ( m <= alpha) {
            return m;
        }

        for(vector<int>::const_iterator iter=succ_.begin(),limit=succ_.end(); iter!=limit; ++iter) {
            cout << " expando: " << *iter << endl;
            jugada = n.move(color, *iter);
            int t = F_(jugada,m,m + 1,!color);
            if(t <= m) {
                if(t <= alpha) {
                    m = t;
                }
                else {
                    m = F_(jugada,alpha,t,!color);
                }
            }
            if(m <= alpha) {
                return alpha;
            }
        }
    } else {
        return F_(n.move(color, 36), alpha, beta, !color);
    }
    return m;
}