小学老师排课遗传算法 Python 代码实现及 Excel 输出
以下是使用 pandas 输出 Excel 的 Python 代码,实现小学老师排课的遗传算法:
import pandas as pd
import random
# 定义班级和课程信息
grades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
courses = ['语文', '数学', '英语', '体育']
# 定义每个年级的课程和课时量
grade_courses = {
'一年级': {'语文': 3, '数学': 3, '英语': 3, '体育': 2},
'二年级': {'语文': 3, '数学': 3, '英语': 3, '体育': 2},
'三年级': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'四年级': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'五年级': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'六年级': {'语文': 3, '数学': 4, '英语': 4, '体育': 2}
}
# 定义遗传算法相关参数
population_size = 20 # 种群数量
generations = 100 # 迭代次数
elite_size = 2 # 精英个体数量,保留最优解
mutation_rate = 0.01 # 突变率
# 定义一个个体类
class Individual:
def __init__(self, schedule):
self.schedule = schedule
self.fitness = self.calculate_fitness()
# 计算适应度函数,评估个体的优劣程度
def calculate_fitness(self):
fitness = 0
# 检查同一课程是否连续上课,每天是否超过3节课程
for i in range(5): # 一周5天
daily_schedule = self.schedule[i]
courses_count = {}
for j in range(7): # 一天7节课
course = daily_schedule[j]
if course not in courses_count:
courses_count[course] = 1
else:
courses_count[course] += 1
if j <= 2 and course in ['语文', '数学', '英语']:
if j > 0 and daily_schedule[j-1] == course:
fitness -= 1 # 同一课程连续上课
if j > 1 and daily_schedule[j-2] == course:
fitness -= 1 # 同一课程连续上课
if j <= 2 and course == '体育':
fitness -= 1 # 体育课排在1-3节
for count in courses_count.values():
if count > 3:
fitness -= 1 # 一天超过3节课程
return fitness
# 创建初始种群
def create_population():
population = []
for _ in range(population_size):
schedule = []
for _ in range(5): # 一周5天
daily_schedule = []
for _ in range(7): # 一天7节课
daily_schedule.append(random.choice(courses))
schedule.append(daily_schedule)
population.append(Individual(schedule))
return population
# 选择精英个体
def select_elite(population):
population.sort(key=lambda x: x.fitness, reverse=True)
return population[:elite_size]
# 交叉繁殖
def crossover(parent1, parent2):
child_schedule = []
for i in range(5): # 一周5天
child_daily_schedule = []
for j in range(7): # 一天7节课
if random.random() < 0.5:
child_daily_schedule.append(parent1.schedule[i][j])
else:
child_daily_schedule.append(parent2.schedule[i][j])
child_schedule.append(child_daily_schedule)
return Individual(child_schedule)
# 突变
def mutate(individual):
for i in range(5): # 一周5天
for j in range(7): # 一天7节课
if random.random() < mutation_rate:
individual.schedule[i][j] = random.choice(courses)
return individual
# 运行遗传算法
def genetic_algorithm():
population = create_population()
elite = select_elite(population)
for _ in range(generations):
new_population = elite.copy()
while len(new_population) < population_size:
parent1 = random.choice(elite)
parent2 = random.choice(elite)
child = crossover(parent1, parent2)
child = mutate(child)
new_population.append(child)
elite = select_elite(new_population)
return elite[0]
# 生成排课表
def generate_schedule(individual):
schedule = pd.DataFrame(columns=['星期一', '星期二', '星期三', '星期四', '星期五'])
for i in range(5): # 一周5天
schedule_day = individual.schedule[i]
schedule.loc[i] = schedule_day
return schedule
# 运行遗传算法
best_individual = genetic_algorithm()
# 生成排课表Excel文件
schedule = generate_schedule(best_individual)
schedule.to_excel('schedule.xlsx', index=False)
这段代码使用遗传算法实现了小学老师排课的问题,最终输出一个 Excel 文件,其中包含了最优的排课表。
该代码首先定义了班级、课程和每个年级的课程课时量,并定义了遗传算法相关参数。接着,代码定义了一个个体类,用于存储个体的排课方案和适应度,并定义了适应度函数,用于评估个体的优劣程度。
随后,代码创建了初始种群,并使用选择、交叉和突变操作进行遗传算法的迭代,最终选出适应度最高的个体,即最优的排课方案。最后,代码将最优排课方案输出到 Excel 文件中。
本代码可以帮助解决小学老师排课的难题,提高排课效率和合理性。
代码说明:
grades: 定义了小学的年级列表。courses: 定义了小学的课程列表。grade_courses: 定义了每个年级的课程和课时量。population_size: 定义了种群数量。generations: 定义了迭代次数。elite_size: 定义了精英个体数量。mutation_rate: 定义了突变率。Individual类: 代表一个个体,存储了排课方案和适应度。calculate_fitness方法: 计算个体的适应度。create_population函数: 创建初始种群。select_elite函数: 选择精英个体。crossover函数: 进行交叉操作。mutate函数: 进行突变操作。genetic_algorithm函数: 运行遗传算法。generate_schedule函数: 将最优排课方案转换为 Pandas DataFrame。
使用方法:
- 确保已安装 Pandas 库。
- 将代码保存为 Python 文件。
- 运行代码。
- 最优的排课表将以 Excel 文件形式输出到当前目录下,名为
schedule.xlsx。
代码优势:
- 使用遗传算法,可以快速找到较优的排课方案。
- 代码结构清晰,易于理解和修改。
- 输出 Excel 文件,方便查看和使用。
代码局限性:
- 遗传算法可能无法找到最优解,但可以找到较优解。
- 代码中的参数需要根据实际情况进行调整。
- 代码只考虑了基本的排课规则,并未考虑其他特殊需求。
建议:
- 可以根据实际需求对代码进行扩展和改进,例如添加更多限制条件或增加老师信息。
- 可以使用其他优化算法,例如模拟退火算法或粒子群算法,来提高解的质量。
- 可以使用图形化界面来展示排课方案,使结果更加直观易懂。
原文地址: https://www.cveoy.top/t/topic/qotp 著作权归作者所有。请勿转载和采集!