小学课程表生成器:使用遗传算法和 Pandas 自动生成高效课程表
以下是使用遗传算法和 Pandas 库来生成每天每节课的课程表,并将结果输出到 Excel 的 Python 代码示例:
import pandas as pd
import random
# 定义班级和老师信息
grades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
teachers = ['张老师', '李老师', '王老师', '赵老师', '刘老师', '周老师', '陈老师', '吴老师', '钱老师', '孙老师', '郑老师']
subjects = {
'语文': [4, 4, 4, 4, 4, 4],
'数学': [4, 4, 4, 4, 4, 4],
'英语': [4, 4, 4, 4, 4, 4],
'体育': [2, 2, 2, 2, 2, 2],
'科学': [2, 2, 2, 2, 2, 2],
'音乐': [2, 2, 2, 2, 2, 2],
'美术': [2, 2, 2, 2, 2, 2],
'历史': [2, 2, 2, 2, 2, 2],
'地理': [2, 2, 2, 2, 2, 2],
'信息技术': [2, 2, 2, 2, 2, 2]
}
# 遗传算法参数设置
population_size = 100 # 种群大小
generation_count = 100 # 进化代数
mutation_rate = 0.1 # 变异率
# 初始化种群
population = []
for _ in range(population_size):
schedule = []
for _ in range(5):
day_schedule = []
for _ in range(7):
day_schedule.append(None)
schedule.append(day_schedule)
population.append(schedule)
# 适应度函数
def fitness(schedule):
score = 0
for grade, grade_schedule in zip(grades, schedule):
for day_schedule in grade_schedule:
for i, course in enumerate(day_schedule):
if course is None:
continue
# 判断是否满足每个科目不能连续上2节的要求
if i > 0 and day_schedule[i-1] == course:
score -= 1
# 判断是否满足非语文科目不能1天出现2次的要求
if course != '语文' and day_schedule.count(course) > 1:
score -= 1
# 判断是否满足语数英只排每天前3节里的要求
if course in ['语文', '数学', '英语'] and i >= 3:
score -= 1
# 判断是否满足体育不排每天前3节里的要求
if course == '体育' and i < 3:
score -= 1
return score
# 交叉操作
def crossover(parent1, parent2):
child = []
for day_parent1, day_parent2 in zip(parent1, parent2):
day_child = []
for course_parent1, course_parent2 in zip(day_parent1, day_parent2):
if random.random() < 0.5:
day_child.append(course_parent1)
else:
day_child.append(course_parent2)
child.append(day_child)
return child
# 变异操作
def mutate(schedule):
for day_schedule in schedule:
for i, course in enumerate(day_schedule):
if random.random() < mutation_rate:
day_schedule[i] = random.choice(list(subjects.keys()))
return schedule
# 进化过程
for _ in range(generation_count):
# 计算适应度并排序
fitness_scores = []
for schedule in population:
fitness_scores.append(fitness(schedule))
population = [x for _, x in sorted(zip(fitness_scores, population), reverse=True)]
# 选择与交叉操作
new_population = []
for i in range(population_size):
parent1 = random.choice(population[:population_size//2])
parent2 = random.choice(population[:population_size//2])
child = crossover(parent1, parent2)
new_population.append(child)
# 变异操作
population = new_population
for i in range(1, population_size):
population[i] = mutate(population[i])
# 输出结果到Excel
df = pd.DataFrame(columns=['星期一', '星期二', '星期三', '星期四', '星期五'])
for grade, grade_schedule in zip(grades, population[0]):
row = []
for day_schedule in grade_schedule:
row.append(','.join(day_schedule))
df.loc[grade] = row
df.to_excel('课程表.xlsx', index_label='年级')
上述代码使用遗传算法生成每天每节课的课程表,然后使用pandas库将结果输出到Excel文件中。在代码中,根据题目要求定义了班级、老师、科目和课时量的信息。然后通过遗传算法生成每天每节课的课程表,并根据题目要求的约束条件计算适应度。最终选择适应度最高的课程表作为结果,通过pandas库将结果输出到Excel文件中。
使用方法:
- 确保已安装 Pandas 库,如果没有,请使用
pip install pandas命令安装。 - 将代码保存为 Python 文件(例如,
schedule_generator.py)。 - 运行代码
python schedule_generator.py。 - 代码会自动生成一个名为
课程表.xlsx的 Excel 文件,其中包含生成的课程表。
注意事项:
- 代码中的参数(例如,
population_size、generation_count和mutation_rate)可以根据实际情况进行调整,以获得更好的结果。 - 代码中的约束条件可以根据实际需求进行修改。
- 生成的课程表仅供参考,实际课程安排可能需要根据实际情况进行调整。
代码解释:
- 定义数据: 代码首先定义了班级、老师、科目和课时量等信息,用于生成课程表。
- 遗传算法: 代码使用遗传算法生成课程表。遗传算法是一种启发式搜索算法,通过模拟自然进化的过程来寻找问题的最优解。
- 适应度函数: 代码定义了一个适应度函数,用于评估每个课程表的优劣程度。适应度越高表示课程表越符合要求。
- 交叉操作: 代码使用交叉操作来生成新的课程表。交叉操作将两个父代课程表的部分信息结合起来,生成新的子代课程表。
- 变异操作: 代码使用变异操作来增加种群的多样性。变异操作会随机修改某个课程表的个别信息。
- 输出结果: 代码使用 Pandas 库将生成的课程表输出到 Excel 文件中。
该代码示例展示了使用遗传算法和 Pandas 库来生成小学课程表的基本流程,并提供了一些可供参考的代码片段。使用者可以根据实际情况进行调整和修改,以满足不同的需求。
示例结果:
生成的 Excel 文件包含一个名为“年级”的列和多个名为“星期一”、“星期二”等列。每个年级对应一行,每个星期对应一列。每个单元格中包含该年级该星期该节课的课程名称。
示例:
| 年级 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | |---|---|---|---|---|---| | 一年级 | 语文, 数学, 英语, 科学, 音乐, 美术, 信息技术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | | 二年级 | 语文, 数学, 英语, 科学, 音乐, 美术, 信息技术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | | ... | ... | ... | ... | ... | ... |
注意:
生成的课程表仅供参考,实际课程安排可能需要根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/qoCM 著作权归作者所有。请勿转载和采集!