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)
            {
                // seleciona na lista a alocação em que o professor tem maior numero de restições a outros horários
                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 que realoca um professor quando existe professores com alocação incompleta e restrição aos horarios disponiveis
                alocar = Realocacao();
                if (alocar == null)
                    System.Console.Write("Não foi possivel 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++)
            {
                // adciona na lista professores com a carga horaria incompleta
                if (CargaHorariaIncompleta(professores[i]))
                    cargaInc.Add(professores[i]);
            }

            for (int i = 0; i < Solucao.Componentes.Count(); i++ )
            {
                Alocacao aloc = (Alocacao)Solucao.Componentes[i];
                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;
        }