Example #1
0
void Drainer::GenerateMicros()
{
    m_Micros.reserve(static_cast<size_t>(m_Mgr.m_Solver.m_TotalStates));

    auto &sets = m_Mgr.m_Solver.m_BlockSets;
    std::vector<BlockSet> indexes;
    indexes.reserve(sets.size());
    for (auto &set : sets)
    {
        indexes.emplace_back();
        auto &lst = indexes.back();
        for (auto blk : set)
            lst.push_back(m_BlocksLookup[blk]);
    }
    std::vector<std::map<int, std::vector<std::map<int, BlockStatus>>>> dicc(sets.size());
    for(auto solution : m_Mgr.m_Solver.m_Solutions)
    {
        std::vector<std::vector<std::map<int, BlockStatus>>*> ddic;
        for (auto i = 0; i < sets.size(); i++)
        {
            auto m = solution.Dist[i];
            auto &lst = dicc[i][m];
            if (lst.empty())
            {
                std::vector<std::vector<BlockStatus>> dists;
                Combinations(sets[i].size(), m, dists);
                for(auto l : dists)
                {
                    lst.emplace_back();
                    auto &d = lst.back();
                    for (auto j = 0; j < sets[i].size(); ++j)
                        d.insert(std::make_pair(indexes[i][j], l[j]));
                }
            }
            ddic.push_back(&lst);
        }

        std::vector<int> stack;
        stack.reserve(sets.size());
        stack.push_back(0);
        while (true)
            if (stack.size() == sets.size())
                if (stack.back() < ddic[stack.size() - 1]->size())
                {
                    m_Micros.emplace_back();
                    auto &lst = m_Micros.back();
                    lst.resize(m_Blocks.size(), BlockStatus::Blank);
                    for (auto i = 0; i < stack.size(); ++i)
                        for (auto kvp : ddic[i]->at(stack[i]))
                            lst[kvp.first] = kvp.second;
#ifdef _DEBUG
                    for (auto row = 0; row < m_Mgr.m_Solver.m_Matrix.GetHeight(); ++row)
                    {
                        auto v = 0;
                        auto nr = m_Mgr.m_Solver.m_Matrix.GetRowHead(row).Right;
                        ASSERT(nr != nullptr);
                        while (nr->Col != m_Mgr.m_Solver.m_BlockSets.size())
                        {
                            for (auto blk : m_Mgr.m_Solver.m_BlockSets[nr->Col])
                                if (lst[m_BlocksLookup[blk]] == BlockStatus::Mine)
                                    ++v;
                            nr = nr->Right;
                            ASSERT(nr != nullptr);
                        }
                        ASSERT(nr->Value == v);
                    }
#endif

                    ++stack.back();
                }
                else
                {
                    stack.pop_back();
                    if (stack.empty())
                        break;
                    ++stack.back();
                }
            else if (stack.back() < ddic[stack.size() - 1]->size())
                stack.push_back(0);
            else
            {
                stack.pop_back();
                if (stack.empty())
                    break;
                ++stack.back();
            }
    }
}
Example #2
0
campusSeguro::campusSeguro(campus c, Dicc<Agente,Posicion> d)
{
    campus camp = c;
    DiccPalabra<Posicion> estyHip;// creo un DiccTrie vacio.
    campusSeguro::DatosPos tup;
    tup.id = 4;
    tup.tag = "libre";
    tup.placa = 0;
    Nat cantidadFilas=c.Filas();
    Nat cantidadColumnas=c.Columnas();
    diccMatriz<campusSeguro::DatosPos> datosMatriz(cantidadFilas,cantidadColumnas,tup);
    diccHash<Agente,campusSeguro::Datos> dicc(d.CantClaves()); // creo dicchash de tamaño d.Claves().Cardinal()
    diccHash<Agente,campusSeguro::Datos>::Iterador itHashVacio = dicc.CrearIt();
    tup.datosAgente = itHashVacio;
    ConjsEqu<Agente>  equSan; // creo un EqusEqu vacio y lo guardo en la variable equSan.
    campusSeguro::DatosSanciones KSan;
    Nat i = 0;
    Nat j = 0;
      while( i < c.Filas() )
      {
            while( j< c.Columnas())
            {
              //Posicion pos(i,j); // creo una posicion (i,j).
                Posicion p;
                p.x = i;
                p.y = j;
                campusSeguro::DatosPos data;  // ESTA VARIABLE NO SE SI VA DENTRO DEL SCOPE DEL WHILE, xq SE BORRA.
                if( _campus.Posocupada(p))
                {
                    data.id = 0;
                    data.tag = "ocupada";
                    data.placa = 0;
                    data.datosAgente = itHashVacio;
                    datosMatriz.Definir(p, data);
                }
                j++;
            }// endwhile
            i++;
      }// endwhile

    Dicc<Agente,Posicion>::Iterador it;
    it = d.CrearIt();

  while( it.HaySiguiente() )
  {
        campusSeguro::DatosPos data;  // ESTA VARIABLE NO SE SI VA DENTRO DEL SCOPE DEL WHILE, xq SE BORRA.
        campusSeguro::Datos dataH;
        Posicion pos;
        Agente plak;
        ConjsEqu<Agente>::Iterador itEqu;

        plak = it.SiguienteClave();
        pos = it.SiguienteSignificado();
        itEqu = equSan.relacionar(0, plak);
        dataH.pos = pos;
        dataH.Sanciones = 0;
        dataH.hippiesAtrapados = 0;
        dataH.claseConMismasSanciones = itEqu;
        data.id = 3;
        data.tag = "agente";
        data.placa = plak;
        data.datosAgente = dicc.Definir(plak, dataH); // definir retorna un iterador de Dicc.
        datosMatriz.Definir(pos, data);
        it.Avanzar();
  }
    Arreglo<TuplaAgYSan> nuevoArreglo(1); // creo array de 1 posicion
    KSan.arreglo = nuevoArreglo; // meto el arreglo en el campo arreglo de KSan.
    KSan.buffer = false;
    KSan.itMenosSanciones = equSan.CrearIt();

     // el masvigilante al comienzo de la instancia campusSeguro es cualquier vigilante:
    campusSeguro::DatosAgentesyAtrapados elMas;
    Dicc<Agente,Posicion>::Iterador itAgts = d.CrearIt();
    elMas.agente = itAgts.SiguienteClave();// el primer agente que encuentre.
    elMas.cantAtrapados = 0;

     // incio la instancia:
    _campus = camp;
    _estudiantes = estyHip;
    _hippies = estyHip;
    Conj<Agente> conjuntoDeAgentes; // conjunto vacio que almacenará agentes
    Dicc<Agente,Posicion>::Iterador itDiccAgentes = d.CrearIt();

    while(itDiccAgentes.HaySiguiente()) // voy llenando el conjunto con los agentes del diccionario.
    {
        conjuntoDeAgentes.AgregarRapido(itDiccAgentes.SiguienteClave());
        itDiccAgentes.Avanzar();
    }

    _agentes = conjuntoDeAgentes;
    datosAgentes = dicc;
    grilla = datosMatriz;
    _masVigilante = elMas;
    equivalenciaSanciones = equSan;
    KSanciones = KSan;
    Dicc<Agente,Posicion>::Iterador it2;
    it2 = d.CrearIt();

} // fin funcion constructora (rastrillaje).