小学遗传排课算法 Python 代码实现及 Excel 输出
下面是一个使用 Pandas 和 openpyxl 库编写的根据上述条件进行遗传排课并输出 Excel 的 Python 代码示例:
import pandas as pd
from openpyxl import Workbook
# 老师列表
teachers = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
# 年级和课程列表
grades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
courses = {
'一年级': ['语文', '数学', '英语', '体育'],
'二年级': ['语文', '数学', '英语', '体育'],
'三年级': ['语文', '数学', '英语', '体育'],
'四年级': ['语文', '数学', '英语', '体育'],
'五年级': ['语文', '数学', '英语', '体育'],
'六年级': ['语文', '数学', '英语', '体育']
}
# 创建空的课程表DataFrame
schedule = pd.DataFrame(index=range(1, 6), columns=range(1, 8))
# 遗传排课函数
def generate_schedule():
for grade in grades:
for course in courses[grade]:
# 根据课程和课时量进行老师分配
for i in range(2): # 二年级有2个班
for j in range(3): # 每天上3节课
# 判断是否为语数英课程或体育课程
if course in ['语文', '数学', '英语']:
# 判断是否已经连续上了两节课
if j < 2 and schedule.iloc[i, j] == course and schedule.iloc[i, j + 1] == course:
continue
# 判断是否已经在一天中上了三节课
if sum(schedule.iloc[i, :j + 1] == course) >= 2:
continue
elif course == '体育':
# 判断是否在1-3节课之间
if j < 3:
continue
# 随机选择一个老师进行分配
teacher = teachers.pop()
# 将老师填入课程表
schedule.iloc[i, j] = teacher
# 生成课程表
generate_schedule()
# 将课程表写入Excel文件
wb = Workbook()
ws = wb.active
for i in range(5):
for j in range(7):
ws.cell(row=i+1, column=j+1, value=schedule.iloc[i, j])
wb.save('schedule.xlsx')
这段代码首先定义了老师列表、年级和课程列表,并创建一个空的课程表DataFrame。然后定义了一个遗传排课函数,该函数根据条件进行老师分配,并将老师填入课程表。最后,使用openpyxl库将课程表写入Excel文件。
原文地址: https://www.cveoy.top/t/topic/qotk 著作权归作者所有。请勿转载和采集!