以下是一个使用遗传算法来排课的示例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时,随机从老师列表中选择一个老师来进行教学。

使用方法:

  1. 确保你已经安装了NumPy、Pandas库。
  2. 复制粘贴代码到Python文件中并保存。
  3. 运行代码,代码会生成一个名为“class_schedule.xlsx”的Excel文件,其中包含生成的课程表。

代码解释:

  • grades: 表示年级列表
  • classrooms: 表示班级列表
  • teachers: 表示教师列表
  • subjects: 表示每个年级的科目和指定科目的课时量
  • teacher_hours: 表示不同教师的指定课时量
  • population_size: 表示种群规模
  • mutation_rate: 表示变异率
  • num_generations: 表示迭代次数
  • generate_population(): 用于生成初始种群
  • fitness(): 计算适应度函数,用于评估课程表的优劣
  • selection(): 选择操作,选择适应度高的个体
  • crossover(): 交叉操作,将两个个体进行交叉,生成新的个体
  • mutation(): 变异操作,随机改变个体的一部分
  • main(): 主函数,运行遗传算法并输出结果
遗传算法排课:Python代码自动生成小学课程表

原文地址: https://www.cveoy.top/t/topic/qor3 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录