Skip to content

Commit

Permalink
feat: Restricoes: ProfessorNaoPodeTrabalharEmTresTurnosDiferentes: us…
Browse files Browse the repository at this point in the history
…e allowed assignment groups
  • Loading branch information
procopiouriel committed Apr 29, 2024
1 parent c4fcfbb commit a68ba27
Showing 1 changed file with 68 additions and 13 deletions.
81 changes: 68 additions & 13 deletions GerarHorario/Gerador/Restricoes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public static void HorarioAlmocoProfessor(GerarHorarioContext contexto)
}
}

///<summary>
///<summary>
/// RESTRIÇÃO: O professor não pode trabalhar 3 turnos.
///</summary>
public static bool[] arrayVerificacao = new bool[3];
Expand All @@ -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;

}


Expand All @@ -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;
}

Expand All @@ -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);

Check failure on line 336 in GerarHorario/Gerador/Restricoes.cs

View workflow job for this annotation

GitHub Actions / test

Cannot implicitly convert type 'Google.OrTools.Sat.BoundedLinearExpression' to 'Google.OrTools.Sat.IntVar'

Check failure on line 336 in GerarHorario/Gerador/Restricoes.cs

View workflow job for this annotation

GitHub Actions / test

Cannot implicitly convert type 'Google.OrTools.Sat.BoundedLinearExpression' to 'Google.OrTools.Sat.IntVar'

Check failure on line 336 in GerarHorario/Gerador/Restricoes.cs

View workflow job for this annotation

GitHub Actions / test

Cannot implicitly convert type 'Google.OrTools.Sat.BoundedLinearExpression' to 'Google.OrTools.Sat.IntVar'

}
}
}
Expand Down

0 comments on commit a68ba27

Please sign in to comment.