小学6个年级每个年级2个班有11个老师不同年级有不同科目和指定科目的课时量不同教师有指定课时量一周上5天课每天7节课遗传算法排输出每天每节课课程表到Excel 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文件中。你可以根据实际需求对代码进行修改和调整
原文地址: https://www.cveoy.top/t/topic/iHZn 著作权归作者所有。请勿转载和采集!