What happens is that classes cannot be allocated. The idea would be for them to be positioned based on the teachers’ available schedules, but I’m not able to do that.
def verificar_disponibilidade(professor, dia, slots, aulas_semanais):
horarios_disponiveis = professores_horario[professor].get(dia, [])
return all(horarios_disponiveis[slot] in slots for slot in range(aulas_semanais))
def alocar_aulas(aulas_distribuidas, labs_ocupados, disciplina, professor, lab, lab_tipo, aulas_semanais, periodo, carga_horaria):
alocado = False
tentativas = 0
while not alocado and tentativas < 20:
tentativas += 1
dia = random.choice(dias_da_semana)
slots_disponiveis_manha = []
slots_disponiveis_tarde = []
for slot_inicio in range(len(horarios_manha) - aulas_semanais + 1):
slots = [horarios_manha[slot_inicio + i] for i in range(aulas_semanais)]
if verificar_disponibilidade(professor, dia, slots, aulas_semanais) and all(len(aulas_distribuidas[dia][slot_inicio + i]) == 0 and (not lab or not labs_ocupados[dia][slot_inicio + i][lab_tipo]) for i in range(aulas_semanais)):
slots_disponiveis_manha.append(slot_inicio)
for slot_inicio in range(len(horarios_manha), len(horarios_manha) + len(horarios_tarde) - aulas_semanais + 1):
slots = [horarios_tarde[slot_inicio - len(horarios_manha) + i] for i in range(aulas_semanais)]
if verificar_disponibilidade(professor, dia, slots, aulas_semanais) and all(len(aulas_distribuidas[dia][slot_inicio + i]) == 0 and (not lab or not labs_ocupados[dia][slot_inicio + i][lab_tipo]) for i in range(aulas_semanais)):
slots_disponiveis_tarde.append(slot_inicio)
if slots_disponiveis_manha:
slot_escolhido = random.choice(slots_disponiveis_manha)
for i in range(aulas_semanais):
aulas_distribuidas[dia][slot_escolhido + i].append((disciplina, professor, lab_tipo))
if lab:
labs_ocupados[dia][slot_escolhido + i][lab_tipo] = True
alocado = True
elif slots_disponiveis_tarde:
slot_escolhido = random.choice(slots_disponiveis_tarde)
for i in range(aulas_semanais):
aulas_distribuidas[dia][slot_escolhido + i].append((disciplina, professor, lab_tipo))
if lab:
labs_ocupados[dia][slot_escolhido + i][lab_tipo] = True
alocado = True
if not alocado:
raise ValueError(f"Não foi possível alocar {aulas_semanais} aulas de {disciplina} para o professor {professor}")
def distribuir_aulas_por_periodo(periodo, disciplinas_periodo, carga_horaria_periodo, labs_ocupados):
aulas_distribuidas = {dia: [[] for _ in range(len(horarios_manha + horarios_tarde))] for dia in dias_da_semana}
for disciplina_info, carga_horaria in zip(disciplinas_periodo, carga_horaria_periodo):
disciplina = disciplina_info['nome']
lab = disciplina_info['lab']
lab_tipo = escolher_lab_tipo() if lab else None
if disciplina in responsabilidade_professores:
professores_disponiveis = responsabilidade_professores[disciplina]
professor_escolhido = random.choice(professores_disponiveis)
if carga_horaria == 90:
aulas_semanais_dia1 = 4
aulas_semanais_dia2 = 2
alocar_aulas(aulas_distribuidas, labs_ocupados, disciplina, professor_escolhido, lab, lab_tipo, aulas_semanais_dia1, periodo, carga_horaria)
alocar_aulas(aulas_distribuidas, labs_ocupados, disciplina, professor_escolhido, lab, lab_tipo, aulas_semanais_dia2, periodo, carga_horaria)
else:
aulas_semanais = carga_horaria // 15
alocar_aulas(aulas_distribuidas, labs_ocupados, disciplina, professor_escolhido, lab, lab_tipo, aulas_semanais, periodo, carga_horaria)
return aulas_distribuidas
def criar_cromossomo(caso):
if caso == 1:
periodos = [1, 3, 5, 7]
elif caso == 2:
periodos = [2, 4, 6, 8]
else:
raise ValueError("Caso deve ser 1 ou 2")
while True:
try:
aulas_distribuidas_por_periodo = {}
labs_ocupados = {dia: {slot: {'windows': False, 'linux': False} for slot in range(len(horarios_manha + horarios_tarde))} for dia in dias_da_semana}
for periodo in periodos:
disciplinas_periodo = disciplina_por_periodo[periodo]
carga_horaria_periodo = carga_horaria_por_periodo[periodo]
# Chama a função para distribuir aulas para o período atual
aulas_distribuidas = distribuir_aulas_por_periodo(periodo, disciplinas_periodo, carga_horaria_periodo, labs_ocupados)
aulas_distribuidas_por_periodo[periodo] = aulas_distribuidas
return aulas_distribuidas_por_periodo
except ValueError as e:
print(f"Erro durante a geração do cromossomo: {e}")
print("Gerando um novo cromossomo...")
continue
This is my dictionary:
professores_horario = {
"Adauto Trigueiro": {
"Segunda": ["7h30", "8h20", "9h10", "10h00", "10h50", "11h40", "13h30", "14h30", "15h30", "16h30"],
"Terça": ["7h30", "8h20", "9h10", "10h00", "10h50", "11h40", "13h30", "14h30", "15h30", "16h30"],
"Quarta": [],
"Quinta": [],
"Sexta": []
}
}
Just one example
I don’t know how to get around this
I need to allocate these times from the teachers’ available times. I was managing to do this well, but this Teacher Availability rule is making my activity very difficult. I don’t have many ideas of what to do here… I would like ideas for solutions so I can fix this
New contributor