diff --git a/GerarHorario/Gerador/Restricoes.cs b/GerarHorario/Gerador/Restricoes.cs index 1ba97ca7..bff059a3 100644 --- a/GerarHorario/Gerador/Restricoes.cs +++ b/GerarHorario/Gerador/Restricoes.cs @@ -213,7 +213,7 @@ public static void HorarioAlmocoProfessor(GerarHorarioContext contexto) } } - /// + /// /// RESTRIÇÃO: O professor não pode trabalhar 3 turnos. /// public static bool[] arrayVerificacao = new bool[3]; @@ -233,15 +233,12 @@ static bool VerificarTurnosProfessores(PropostaDeAula carro, GerarHorarioContext if (carro.IntervaloIndex >= 0 && carro.IntervaloIndex <= 4)//MANHA { arrayVerificacao[0] = true; - arrayVerificacao[1] = false; } if (carro.IntervaloIndex >= 5 && carro.IntervaloIndex <= 9)//TARDE { arrayVerificacao[1] = true; - arrayVerificacao[2] = false; - } @@ -252,16 +249,28 @@ static bool VerificarTurnosProfessores(PropostaDeAula carro, GerarHorarioContext if (arrayVerificacao[0] == true)//MANHA { + if (arrayVerificacao[0] == true && arrayVerificacao[2] == true && arrayVerificacao[1] == false)//TRABALHA MANHA E NOITE + { + System.Console.WriteLine("TRABALHA MANHA E NOITE\nO intervalo " + contexto.Options.HorariosDeAula[carro.IntervaloIndex] + " do dia " + carro.DiaSemanaIso + " do professor " + carro.ProfessorId + " foi removido!"); + validar = true; + + + } if (arrayVerificacao[1] == true)//TARDE { + if (arrayVerificacao[2] == true)//NOITE { + + System.Console.WriteLine("O intervalo " + contexto.Options.HorariosDeAula[carro.IntervaloIndex] + " do dia " + carro.DiaSemanaIso + " do professor " + carro.ProfessorId + " foi removido!"); validar = true; } } } + + return validar; } @@ -271,15 +280,61 @@ public static void ProfessorNaoPodeTrabalharEmTresTurnosDiferentes(GerarHorarioC { foreach (var diaSemanaIso in Enumerable.Range(contexto.Options.DiaSemanaInicio, contexto.Options.DiaSemanaFim)) { - var proposta = from propostas in contexto.TodasAsPropostasDeAula - where - propostas.ProfessorId == professor.Id - && - propostas.DiaSemanaIso == diaSemanaIso - && - VerificarTurnosProfessores(propostas, contexto) - select propostas.ModelBoolVar; - contexto.Model.AddAtMostOne(proposta); + var propostasManha = from proposta in contexto.TodasAsPropostasDeAula + where + proposta.ProfessorId == professor.Id + && + proposta.DiaSemanaIso == diaSemanaIso + && + proposta.IntervaloIndex >= 0 && proposta.IntervaloIndex <= 4 + select proposta.ModelBoolVar; + + var propostasTarde = from proposta in contexto.TodasAsPropostasDeAula + where + proposta.ProfessorId == professor.Id + && + proposta.DiaSemanaIso == diaSemanaIso + && + proposta.IntervaloIndex >= 5 && proposta.IntervaloIndex <= 9 + select proposta.ModelBoolVar; + + var propostasNoite = from proposta in contexto.TodasAsPropostasDeAula + where + proposta.ProfessorId == professor.Id + && + proposta.DiaSemanaIso == diaSemanaIso + && + proposta.IntervaloIndex >= 10 && proposta.IntervaloIndex <= 14 + select proposta.ModelBoolVar; + + /* + Possibilidades + + | descricao | manha | tarde | noite | + | -------------------- | ----- | ----- | ----- | + | nao dar aula no dia | false | false | false | + | dar aula so de MANHA | true | false | false | + | dar aula so a tarde | false | true | false | + | dar aula so a noite | false | false | true | + | manha e tarde | true | true | false | + | tarde e noite | false | true | true | + */ + + long[,] possibilidadesPermitidas = { + { 0, 0, 0 }, // nao dar aula no dia + { 1, 0, 0 }, //dar aula so de MANHA + { 0, 1, 0 }, //dar aula so a tarde + { 0, 0, 1 }, //dar aula so a noite + { 1, 1, 0 }, //manha e tarde + { 0, 1, 1 } //tarde e noite + }; + + var aulaAtivaManha = LinearExpr.Sum(propostasManha) > 0; + var aulaAtivaTarde = LinearExpr.Sum(propostasTarde) > 0; + var aulaAtivaNoite = LinearExpr.Sum(propostasNoite) > 0; + + contexto.Model.AddAllowedAssignments(new IntVar[] { aulaAtivaManha, aulaAtivaTarde, aulaAtivaNoite }).AddTuples(possibilidadesPermitidas); + } } }