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