小学课程表自动生成:使用遗传算法和 Python 代码实现
为了实现小学课程表自动生成,我们可以使用遗传算法来进行排课,并使用 Python 的 pandas 库来将课程表输出到 Excel 文件中。下面是一个实现该任务的代码示例:
import random
import pandas as pd
# 定义班级和老师的相关信息
grades = ['Grade 1', 'Grade 2', 'Grade 3', 'Grade 4', 'Grade 5', 'Grade 6']
classrooms_per_grade = 2
teachers = ['Teacher A', 'Teacher B', 'Teacher C', 'Teacher D', 'Teacher E', 'Teacher F', 'Teacher G', 'Teacher H', 'Teacher I', 'Teacher J', 'Teacher K']
subjects = ['Math', 'English', 'Science', 'History', 'Art', 'Music', 'PE']
# 定义每个年级的科目和课时量
grade_subjects = {
'Grade 1': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Grade 2': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Grade 3': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Grade 4': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Grade 5': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Grade 6': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1}
}
# 定义每个老师的课时量
teacher_hours = {
'Teacher A': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher B': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher C': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher D': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher E': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher F': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher G': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher H': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher I': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher J': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1},
'Teacher K': {'Math': 4, 'English': 3, 'Science': 2, 'History': 1, 'Art': 1, 'Music': 1, 'PE': 1}
}
# 定义课程表的基因编码
def create_schedule():
schedule = []
for grade in grades:
for classroom in range(classrooms_per_grade):
for day in range(5):
for period in range(7):
schedule.append({'Grade': grade, 'Classroom': classroom, 'Day': day, 'Period': period, 'Subject': None, 'Teacher': None})
return schedule
# 计算适应度函数,评估课程表的质量
def calculate_fitness(schedule):
fitness = 0
for subject in subjects:
for teacher in teachers:
subject_hours = sum(1 for lesson in schedule if lesson['Subject'] == subject and lesson['Teacher'] == teacher)
teacher_hours = sum(1 for lesson in schedule if lesson['Teacher'] == teacher)
fitness += abs(subject_hours - teacher_hours)
return fitness
# 交叉操作,生成新的课程表
def crossover(schedule1, schedule2):
crossover_point = random.randint(1, len(schedule1) - 1)
new_schedule = schedule1[:crossover_point] + schedule2[crossover_point:]
return new_schedule
# 变异操作,对课程表进行变异
def mutation(schedule):
mutation_point = random.randint(0, len(schedule) - 1)
new_schedule = schedule.copy()
new_schedule[mutation_point]['Subject'] = random.choice(subjects)
new_schedule[mutation_point]['Teacher'] = random.choice(teachers)
return new_schedule
# 初始化种群
def initialize_population(population_size):
population = []
for _ in range(population_size):
schedule = create_schedule()
population.append(schedule)
return population
# 遗传算法主程序
def genetic_algorithm(population_size, num_generations):
population = initialize_population(population_size)
for generation in range(num_generations):
print(f'Generation {generation+1}')
# 计算适应度函数
fitness_scores = []
for schedule in population:
fitness = calculate_fitness(schedule)
fitness_scores.append(fitness)
# 选择操作
selected_population = random.choices(population, weights=fitness_scores, k=population_size)
# 交叉操作
new_population = []
for i in range(population_size):
schedule1 = random.choice(selected_population)
schedule2 = random.choice(selected_population)
new_schedule = crossover(schedule1, schedule2)
new_population.append(new_schedule)
# 变异操作
mutated_population = []
for schedule in new_population:
mutated_schedule = mutation(schedule)
mutated_population.append(mutated_schedule)
population = mutated_population
# 选择最佳课程表
best_schedule = min(population, key=calculate_fitness)
return best_schedule
# 输出最佳课程表到Excel文件
def output_schedule_to_excel(schedule):
schedule_df = pd.DataFrame(schedule)
schedule_df.to_excel('class_schedule.xlsx', index=False)
# 运行遗传算法并输出结果
best_schedule = genetic_algorithm(population_size=50, num_generations=100)
output_schedule_to_excel(best_schedule)
这段代码首先定义了班级、老师、科目以及课时量等相关信息。然后,通过遗传算法来生成并优化课程表。最后,使用 pandas 库将最佳课程表输出到 Excel 文件中。你可以根据实际需求对代码进行修改和调整。
代码的主要功能:
- 定义基本信息: 包含班级、老师、科目、每个年级的科目和课时量,以及每个老师的课时量等。
- 创建课程表: 使用
create_schedule()函数生成一个空的课程表,包含所有年级、教室、时间段的信息。 - 计算适应度: 使用
calculate_fitness()函数评估一个课程表的质量,通过计算每个科目和老师的实际授课时间与预设课时量的差值来衡量。 - 交叉操作: 使用
crossover()函数将两个课程表进行交叉,生成一个新的课程表。 - 变异操作: 使用
mutation()函数对一个课程表进行随机变异,改变某些课程的科目或老师。 - 初始化种群: 使用
initialize_population()函数生成一个包含多个随机生成的课程表的种群。 - 遗传算法主程序: 使用
genetic_algorithm()函数执行遗传算法,包含计算适应度、选择、交叉、变异等步骤,最终返回最佳课程表。 - 输出到Excel: 使用
output_schedule_to_excel()函数将最佳课程表输出到 Excel 文件中。
使用方法:
- 将代码保存为
.py文件,例如class_schedule.py。 - 运行代码,代码会自动生成一个名为
class_schedule.xlsx的 Excel 文件,其中包含生成的最佳课程表。
注意:
- 代码示例中的信息是假设的,你需要根据实际情况进行修改。
- 遗传算法的运行时间可能会比较长,你可以根据需要调整种群大小和迭代次数。
- 为了获得更好的课程表,你可能需要尝试不同的遗传算法参数和配置。
希望这个示例代码可以帮助你实现小学课程表自动生成的功能。
原文地址: https://www.cveoy.top/t/topic/qor2 著作权归作者所有。请勿转载和采集!