遗传算法排课:Python代码自动生成小学课程表
以下是一个使用遗传算法来排课的示例Python代码,用于自动生成小学6个年级、每个年级2个班的课程表,并将结果输出到Excel文件中。
import random
import numpy as np
import pandas as pd
# 定义班级和老师信息
grades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
classrooms = ['班级1', '班级2']
teachers = ['老师1', '老师2', '老师3', '老师4', '老师5', '老师6', '老师7', '老师8', '老师9', '老师10', '老师11']
# 定义每个年级的科目和指定科目的课时量
subjects = {
'一年级': {'语文': 5, '数学': 4, '英语': 3, '体育': 2},
'二年级': {'语文': 4, '数学': 5, '英语': 3, '体育': 2},
'三年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2},
'四年级': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'五年级': {'语文': 3, '数学': 3, '英语': 4, '体育': 2},
'六年级': {'语文': 3, '数学': 3, '英语': 3, '体育': 2}
}
# 定义不同教师的指定课时量
teacher_hours = {
'老师1': {'语文': 5, '数学': 4, '英语': 3, '体育': 2},
'老师2': {'语文': 4, '数学': 5, '英语': 3, '体育': 2},
'老师3': {'语文': 4, '数学': 4, '英语': 4, '体育': 2},
'老师4': {'语文': 3, '数学': 4, '英语': 4, '体育': 2},
'老师5': {'语文': 3, '数学': 3, '英语': 4, '体育': 2},
'老师6': {'语文': 3, '数学': 3, '英语': 3, '体育': 2},
'老师7': {'语文': 4, '数学': 3, '英语': 3, '体育': 2},
'老师8': {'语文': 4, '数学': 4, '英语': 3, '体育': 2},
'老师9': {'语文': 3, '数学': 3, '英语': 4, '体育': 2},
'老师10': {'语文': 4, '数学': 3, '英语': 3, '体育': 2},
'老师11': {'语文': 3, '数学': 4, '英语': 4, '体育': 2}
}
# 定义遗传算法参数
population_size = 100
mutation_rate = 0.1
num_generations = 50
# 随机生成初始种群
def generate_population():
population = []
for _ in range(population_size):
schedule = np.zeros((6, 2, 5, 7)) # 6个年级,每个年级2个班,一周5天,每天7节课
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
subject = random.choice(list(subjects[grades[grade]]))
schedule[grade][classroom][day][period] = subject
population.append(schedule)
return population
# 计算适应度函数
def fitness(schedule):
total_fitness = 0
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
subject = schedule[grade][classroom][day][period]
if subject in ['语文', '数学', '英语']:
total_fitness += 1
return total_fitness
# 选择操作
def selection(population):
fitness_scores = [fitness(schedule) for schedule in population]
total_fitness = sum(fitness_scores)
probabilities = [fitness_score / total_fitness for fitness_score in fitness_scores]
selected_population = random.choices(population, probabilities, k=population_size)
return selected_population
# 交叉操作
def crossover(population):
offspring_population = []
for _ in range(population_size):
parent1, parent2 = random.sample(population, 2)
offspring = np.copy(parent1)
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
if random.random() < 0.5:
offspring[grade][classroom][day][period] = parent2[grade][classroom][day][period]
offspring_population.append(offspring)
return offspring_population
# 变异操作
def mutation(population):
mutated_population = []
for schedule in population:
if random.random() < mutation_rate:
grade = random.randint(0, 5)
classroom = random.randint(0, 1)
day = random.randint(0, 4)
period = random.randint(0, 6)
subject = random.choice(list(subjects[grades[grade]]))
schedule[grade][classroom][day][period] = subject
mutated_population.append(schedule)
return mutated_population
# 主函数
def main():
population = generate_population()
for generation in range(num_generations):
print("Generation:", generation+1)
population = selection(population)
population = crossover(population)
population = mutation(population)
best_schedule = max(population, key=lambda schedule: fitness(schedule))
# 输出到Excel
df = pd.DataFrame()
for grade in range(6):
for classroom in range(2):
for day in range(5):
for period in range(7):
subject = best_schedule[grade][classroom][day][period]
teacher = random.choice(teachers)
df.at[f'{grades[grade]}-{classrooms[classroom]}', f'周{day+1}-{period+1}'] = f'{subject}({teacher})'
df.to_excel('class_schedule.xlsx', index=True)
if __name__ == '__main__':
main()
这段代码使用遗传算法来生成一个6个年级、每个年级2个班级的课程表,并将结果输出到Excel文件中。每个种群都是一个4维数组,表示了每个年级、班级、每天和每节课的科目安排。在每一代中,通过选择、交叉和变异操作来更新种群,并最终得到最优的课程表。在输出到Excel时,随机从老师列表中选择一个老师来进行教学。
使用方法:
- 确保你已经安装了NumPy、Pandas库。
- 复制粘贴代码到Python文件中并保存。
- 运行代码,代码会生成一个名为“class_schedule.xlsx”的Excel文件,其中包含生成的课程表。
代码解释:
grades: 表示年级列表classrooms: 表示班级列表teachers: 表示教师列表subjects: 表示每个年级的科目和指定科目的课时量teacher_hours: 表示不同教师的指定课时量population_size: 表示种群规模mutation_rate: 表示变异率num_generations: 表示迭代次数generate_population(): 用于生成初始种群fitness(): 计算适应度函数,用于评估课程表的优劣selection(): 选择操作,选择适应度高的个体crossover(): 交叉操作,将两个个体进行交叉,生成新的个体mutation(): 变异操作,随机改变个体的一部分main(): 主函数,运行遗传算法并输出结果
原文地址: https://www.cveoy.top/t/topic/qor3 著作权归作者所有。请勿转载和采集!