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