Documentação do Programa PROUESSE
1) Características Importantes
1) As aulas vão de segunda a sexta-Feira.
2) A quantidade de aulas assistidas por dia pelas turmas é m5 = 5.
3) Se um prof. tem mais de uma aula numa turma num mesmo dia, então essas aulas são em horários seguidos e a quantidade dessas aulas é no máximo 2.
4) A única forma de evitar quantidade excessiva de horários vagos é informando horários não disponíveis no início ou fim do turno para alguns profs. Ver Seção “procurando eliminar horários vagos” do Manual de Instruções do Prouesse.
5) Se um professor atua em duas disciplinas diferentes para uma mesma turma, então deve-se considerar as duas disciplinas como se fosse uma só, somando-se as cargas horárias. Porém, isso tem algumas consequências decorrentes do fato de o programa não lançar mais de 2 aulas por dia para um mesmo professor, numa mesma turma; por exemplo, a quantidade máxima de dias de trabalho informada não poderá ser muito pequena.
2) Classes do Programa Prouesse
A classe Probl é a super-classe das classes: Fase1, Fase2, Fase4 e Fase4_. A principal finalidade da classe Probl é encapsular as variáveis "static" que são compartilhadas pelas sub-classes. Estas variáveis compartilhadas podem ser variáveis contendo dados de um problema (variáveis de dados: ver Seção 3 abaixo) ou variáveis auxiliares. A classe Probl disponibiliza também um método para ordenação (método ordena).
A classe Editor_ é a super-classe da classe Horar_, que por sua vez é a super-classe da classe Prouesse. A finalidade da classe Editor_ é fornecer a interface com abas e botões do Prouesse. A finalidade da classe Horar_ é fornecer os principais métodos chamados pela classe Prouesse, como os métodos testaDistribuicao, exibeHorarios, testesDeConsistencia e entradaDeDados (este último é responsável pela entrada de dados a partir das abas)
A finalidade da classe Prouesse é gerenciar o funcionamento de todas as classes; assim, o método executaProcessar da classe Prouesse é ativado quando o botão PROCESSAR é clicado.
Na Seção 3 adiante, temos a lista das variáveis responsáveis pelo armazenamento dos dados do problema a ser resolvido (variáveis de dados). Estas variáveis de dados estão presentes na classe Probl (que as compartilha com suas subclasses) e na classe Horar_ (com os mesmos nomes. Por exemplo, a variável maxP está presente na classe Probl e, com o mesmo nome, na classe Horar_)
Estas variáveis de dados são inicializadas (comando new) pelo método entradaDeDados da classe Horar_; em seguida, são preenchidas com os dados do problema a ser resolvido; a seguir, a classe Prouesse chama o método inicializacao da classe Probl para transferir os dados armazenados nas diversas variáveis de dados da classe Horar_ para as variáveis de dados da classe Probl (na verdade as referências a arrays de dados contidas nas variáveis da classe Horar_ são transferidas para as variáveis da classe Probl).
A seguir, apresentamos para cada sub-classe da classe Probl, a fase correspondente no processo de elaboração de horários
A seguir, indicamos qual sub-classe da classe Probl é responsável pela execução de cada uma das 5 fases do processo de elaboração de horários (Veja Seção 4 do Manual de Instruções sobre a divisão do processo de elaboração de horários em 5 fases):
Fase0 : esta classe não é sub-classe da classe Probl e tem como finalidade fazer a verificação do conjunto de horários não disponíveis informados na aba MÁXIMOS DE AULAS (ver a Seção 6.2 do Manual de Instruções). Caso Fase0 indicar que o conjunto de horários não disponíveis informados é viável, dizemos que Fase0 obteve solução; caso contrário, dizemos que Fase0 não obteve solução. A classe Fase0 constrói uma solução analogamente a uma árvore genealógica (o que explica os nomes das variáveis desta classe) e ela não gera um resultado a ser trabalhado pelas fases seguintes, pois sua finalidade é apenas de verificação. Por conveniência, consideramos que esta verificação está incluída na 1a Fase.
Fase1 : Depois da verificação mencionada acima (Fase0), a "continuação da 1a Fase" é de responsabilidade da classe Fase1, que gera um resultado a ser trabalhado na 2a Fase.
Fase2 : Executa a 2a e a 3a Fases.
Fase4 e Fase4_ : Executam conjuntamente a 4a e a 5a Fases.
Sobre as classes Fase1, Fase2, Fase4 e Fase4_ é válido afirmar:
- Os métodos preliminares e determinaZ são executados antes do método principal.
- Os métodos maximo, atualiza2 e atualiza3 são chamados pelo método principal.
- Os comentários apresentados no método preliminares elucidam a estratégia de busca utilizada em cada Fase. Maiores informações podem ser encontradas no arquivo busca.pdf. A Seção 4 deste arquivo descreve detalhadamente o tipo de processamento que é executado pela classe Fase4_, embora a notação utilizada nessa Seção seja muito diferente da utilizada na classe Fase4_.
A estratégia de busca utilizada em todas as fases é a mesma e está explicada detalhadamente no arquivo busca.pdf.
OBS.: 1) As variáveis comGeminadasP e sequenciaProf da classe Probl têm como finalidade serem utilizadas em recursos a serem introduzidos no programa Prouesse.
2) Maiores informações podem ser solicitadas ao e-mail rstosleite@gmail.com
3) Variáveis contendo os dados de um Problema:
Os dados lidos no início de uma execução do Prouesse são armazenados nas seguintes variáveis:
m5: quantidade de aulas assistidas pelas turmas em cada dia.
qP: quantidade de prof.
qA: quantidade de turmas
nTurmasP[p]: quantidade de turmas do prof. p
A variável listaP contém a relação de turmas de cada prof.:
listaP[p][j]: número da j-ésima turma do prof. p
ch[p][j]: quantidade de aulas por semana do prof. p na j-ésima turma (turma listaP[p][j]).
maxP[p][d]: quantidade máx. de aulas do prof. p no dia d (os dias são representados por 0 1 2 3 4). Se forem informados horários não disponíveis para um certo prof. p (ver horariosND abaixo) num certo dia d, então isto deve ser levado em consideração em maxP[p][d]. Por exemplo, se forem 2 horários não disponíveis, então maxP[p][d] é no máximo 3.
maxDiasP[p]: quantidade máxima de dias da semana em trabalho do prof. p.
horariosND[p][d][k]: Arranjo booleano. Para cada prof. p, para cada dia d, para cada horário k (representado por 1 2 3 4 5), especifica se prof. p, no dia d, no horário k, está disponível para trabalhar (false) ou não está disponível (true).
semGeminadasP[p]: indica se prof. p não pretende ter aulas geminadas nas suas turmas (variável booleana).