以下是使用遗传算法和 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文件中。

使用方法:

  1. 确保已安装 Pandas 库,如果没有,请使用 pip install pandas 命令安装。
  2. 将代码保存为 Python 文件(例如,schedule_generator.py)。
  3. 运行代码 python schedule_generator.py
  4. 代码会自动生成一个名为 课程表.xlsx 的 Excel 文件,其中包含生成的课程表。

注意事项:

  • 代码中的参数(例如,population_sizegeneration_countmutation_rate)可以根据实际情况进行调整,以获得更好的结果。
  • 代码中的约束条件可以根据实际需求进行修改。
  • 生成的课程表仅供参考,实际课程安排可能需要根据实际情况进行调整。

代码解释:

  1. 定义数据: 代码首先定义了班级、老师、科目和课时量等信息,用于生成课程表。
  2. 遗传算法: 代码使用遗传算法生成课程表。遗传算法是一种启发式搜索算法,通过模拟自然进化的过程来寻找问题的最优解。
  3. 适应度函数: 代码定义了一个适应度函数,用于评估每个课程表的优劣程度。适应度越高表示课程表越符合要求。
  4. 交叉操作: 代码使用交叉操作来生成新的课程表。交叉操作将两个父代课程表的部分信息结合起来,生成新的子代课程表。
  5. 变异操作: 代码使用变异操作来增加种群的多样性。变异操作会随机修改某个课程表的个别信息。
  6. 输出结果: 代码使用 Pandas 库将生成的课程表输出到 Excel 文件中。

该代码示例展示了使用遗传算法和 Pandas 库来生成小学课程表的基本流程,并提供了一些可供参考的代码片段。使用者可以根据实际情况进行调整和修改,以满足不同的需求。

示例结果:

生成的 Excel 文件包含一个名为“年级”的列和多个名为“星期一”、“星期二”等列。每个年级对应一行,每个星期对应一列。每个单元格中包含该年级该星期该节课的课程名称。

示例:

| 年级 | 星期一 | 星期二 | 星期三 | 星期四 | 星期五 | |---|---|---|---|---|---| | 一年级 | 语文, 数学, 英语, 科学, 音乐, 美术, 信息技术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | | 二年级 | 语文, 数学, 英语, 科学, 音乐, 美术, 信息技术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | 语文, 数学, 英语, 体育, 科学, 音乐, 信息技术 | 语文, 数学, 英语, 历史, 地理, 音乐, 美术 | | ... | ... | ... | ... | ... | ... |

注意:

生成的课程表仅供参考,实际课程安排可能需要根据实际情况进行调整。

小学课程表生成器:使用遗传算法和 Pandas 自动生成高效课程表

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

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