小学6个年级每个年级2个班有11个老师不同年级有不同科目和指定科目的课时量不同教师有指定课时量一周上5天课每天7节课语数英只排每天前3节里体育不排每天前3节里遗传算法排输出每天每节课课程表到Excel Python代码
以下是一个使用遗传算法来排课的示例Python代码:
import random
import numpy as np
import pandas as pd
# 定义班级和老师信息
grades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
classrooms = ['班级1', '班级2']
teachers = ['老师1', '老师2', '老师3', '老师4', '老师5', '老师6', '老师7', '老师8', '老师9', '老师10', '老师11']
# 定义每个年级的科目和指定科目的课时量
subjects = {
'一年级': {'语文': 5, '数学': 4, '英语': 3, '体育': 2},
'二年级': {'语文': 4, '数学': 5, '英语': 3, '体育': 2},
'三年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2},
'四年级': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'五年级': {'语文': 3, '数学': 3, '英语': 4, '体育': 2},
'六年级': {'语文': 3, '数学': 3, '英语': 3, '体育': 2}
}
# 定义不同教师的指定课时量
teacher_hours = {
'老师1': {'语文': 5, '数学': 4, '英语': 3, '体育': 2},
'老师2': {'语文': 4, '数学': 5, '英语': 3, '体育': 2},
'老师3': {'语文': 4, '数学': 4, '英语': 4, '体育': 2},
'老师4': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'老师5': {'语文': 3, '数学': 3, '英语': 4, '体育': 2},
'老师6': {'语文': 3, '数学': 3, '英语': 3, '体育': 2},
'老师7': {'语文': 4, '数学': 3, '英语': 3, '体育': 2},
'老师8': {'语文': 4, '数学': 4, '英语': 3, '体育': 2},
'老师9': {'语文': 3, '数学': 3, '英语': 4, '体育': 2},
'老师10': {'语文': 4, '数学': 3, '英语': 3, '体育': 2},
'老师11': {'语文': 3, '数学': 4, '英语': 4, '体育': 2}
}
# 定义遗传算法参数
population_size = 100
mutation_rate = 0.1
num_generations = 50
# 随机生成初始种群
def generate_population():
population = []
for _ in range(population_size):
schedule = np.zeros((6, 2, 5, 7)) # 6个年级,每个年级2个班,一周5天,每天7节课
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
subject = random.choice(list(subjects[grades[grade]]))
schedule[grade][classroom][day][period] = subject
population.append(schedule)
return population
# 计算适应度函数
def fitness(schedule):
total_fitness = 0
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
subject = schedule[grade][classroom][day][period]
if subject in ['语文', '数学', '英语']:
total_fitness += 1
return total_fitness
# 选择操作
def selection(population):
fitness_scores = [fitness(schedule) for schedule in population]
total_fitness = sum(fitness_scores)
probabilities = [fitness_score / total_fitness for fitness_score in fitness_scores]
selected_population = random.choices(population, probabilities, k=population_size)
return selected_population
# 交叉操作
def crossover(population):
offspring_population = []
for _ in range(population_size):
parent1, parent2 = random.sample(population, 2)
offspring = np.copy(parent1)
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
if random.random() < 0.5:
offspring[grade][classroom][day][period] = parent2[grade][classroom][day][period]
offspring_population.append(offspring)
return offspring_population
# 变异操作
def mutation(population):
mutated_population = []
for schedule in population:
if random.random() < mutation_rate:
grade = random.randint(0, 5)
classroom = random.randint(0, 1)
day = random.randint(0, 4)
period = random.randint(0, 6)
subject = random.choice(list(subjects[grades[grade]]))
schedule[grade][classroom][day][period] = subject
mutated_population.append(schedule)
return mutated_population
# 主函数
def main():
population = generate_population()
for generation in range(num_generations):
print("Generation:", generation+1)
population = selection(population)
population = crossover(population)
population = mutation(population)
best_schedule = max(population, key=lambda schedule: fitness(schedule))
# 输出到Excel
df = pd.DataFrame()
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
subject = best_schedule[grade][classroom][day][period]
teacher = random.choice(teachers)
df.at[f'{grades[grade]}-{classrooms[classroom]}', f'周{day+1}-{period+1}'] = f'{subject}({teacher})'
df.to_excel('class_schedule.xlsx', index=True)
if __name__ == '__main__':
main()
这段代码使用遗传算法来生成一个6个年级、每个年级2个班级的课程表,并将结果输出到Excel文件中。每个种群都是一个4维数组,表示了每个年级、班级、每天和每节课的科目安排。在每一代中,通过选择、交叉和变异操作来更新种群,并最终得到最优的课程表。在输出到Excel时,随机从老师列表中选择一个老师来进行教学
原文地址: https://www.cveoy.top/t/topic/iHZo 著作权归作者所有。请勿转载和采集!