public override IComponente EscolheMelhorComponente(List<IComponente> Componentes)
        {
            Alocacao alocar = new Alocacao();
            int pos = 0;
            int memPos = -1;
            int numRestricoes = -1;

            foreach (Alocacao aloc in Componentes)
            {
                // para selecionar a lista de prof
                if (aloc.professor.Restricoes.Count() > numRestricoes && CargaHorariaIncompleta(aloc.professor))
                {
                    numRestricoes = aloc.professor.Restricoes.Count();
                    memPos = pos;
                }
                pos++;
            }

            if (memPos > -1)
            {
                alocar = (Alocacao)Componentes[memPos];
            }
            else
            {
                // chama a função para realocar o prof
                alocar = Realocacao();
                if (alocar == null)
                {
                    System.Console.Write("Infelismente não foi possível gerar uma solução .\n\n");
                }
            }

            return alocar;
        }
        Alocacao Realocacao()
        {
            Alocacao al = new Alocacao();
            List<Professor> cargaInc = new List<Professor>();

            for (int i = 0; i < professores.Count(); i++)
            {
                // para adicionar a lista dos professores
                if (CargaHorariaIncompleta(professores[i]))
                {
                    cargaInc.Add(professores[i]);
                }
            }
            for (int i = 0; i < Solucao.Componentes.Count(); i++)
            {
                Alocacao aloc = (Alocacao)Solucao.Componentes[i];
                System.Console.Write(cargaInc.Count + "    " );

                for (int j = 0; j < cargaInc.Count(); j++)
                {
                   // tenta trocar um professor alocado por um disponivel na lista de componentes da solução
                    if (!aloc.horario.restHorario.Contains(cargaInc[j]))
                    {
                        Solucao.Componentes.Remove(Solucao.Componentes[i]);
                        Solucao.Componentes.Insert(i, new Alocacao(cargaInc[j], aloc.horario));
                        return (new Alocacao(aloc.professor, horarios[Solucao.Componentes.Count()]));
                    }
                }
            }
            return al;
        }