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); } }
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; }