以下是使用 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。

使用方法:

  1. 确保已安装 Pandas 库。
  2. 将代码保存为 Python 文件。
  3. 运行代码。
  4. 最优的排课表将以 Excel 文件形式输出到当前目录下,名为 schedule.xlsx

代码优势:

  • 使用遗传算法,可以快速找到较优的排课方案。
  • 代码结构清晰,易于理解和修改。
  • 输出 Excel 文件,方便查看和使用。

代码局限性:

  • 遗传算法可能无法找到最优解,但可以找到较优解。
  • 代码中的参数需要根据实际情况进行调整。
  • 代码只考虑了基本的排课规则,并未考虑其他特殊需求。

建议:

  • 可以根据实际需求对代码进行扩展和改进,例如添加更多限制条件或增加老师信息。
  • 可以使用其他优化算法,例如模拟退火算法或粒子群算法,来提高解的质量。
  • 可以使用图形化界面来展示排课方案,使结果更加直观易懂。
小学老师排课遗传算法 Python 代码实现及 Excel 输出

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

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