以下是一个使用遗传算法排课的简单示例代码,使用Pandas将每天每节课的课程表输出到Excel中:

import pandas as pd
import random

# 定义年级、科目和老师等信息
grades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']
subjects = ['语文', '数学', '英语', '体育', '科学', '音乐', '美术', '社会', '品德']
teachers = ['Teacher1', 'Teacher2', 'Teacher3', 'Teacher4', 'Teacher5', 'Teacher6', 'Teacher7', 'Teacher8', 'Teacher9', 'Teacher10', 'Teacher11']

# 定义每个年级的科目和指定科目的课时量
grade_subjects = {'一年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},
                  '二年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},
                  '三年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},
                  '四年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},
                  '五年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},
                  '六年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1}}

# 定义每个老师的指定课时量
teacher_hours = {'Teacher1': 20, 'Teacher2': 20, 'Teacher3': 20, 'Teacher4': 20, 'Teacher5': 20, 'Teacher6': 20,
                 'Teacher7': 20, 'Teacher8': 20, 'Teacher9': 20, 'Teacher10': 20, 'Teacher11': 20}

# 定义每天每节课的时间段
time_slots = ['8:00-8:40', '8:50-9:30', '9:40-10:20', '10:30-11:10', '11:20-12:00', '14:00-14:40', '14:50-15:30']

# 定义遗传算法参数
population_size = 100
mutation_rate = 0.01
generations = 100

# 初始化种群
def initialize_population():
    population = []
    for _ in range(population_size):
        schedule = generate_schedule()
        population.append(schedule)
    return population

# 生成一个随机的课程表
def generate_schedule():
    schedule = []
    for _ in range(6):  # 六个年级
        grade_schedule = []
        for _ in range(5):  # 五天课
            day_schedule = []
            for _ in range(7):  # 七节课
                day_schedule.append(None)
            grade_schedule.append(day_schedule)
        schedule.append(grade_schedule)
    return schedule

# 评估课程表的适应度
def evaluate_fitness(schedule):
    fitness = 0
    for grade in range(6):
        for day in range(5):
            for slot in range(7):
                subject = schedule[grade][day][slot]
                if subject is not None:
                    teacher = subject[1]
                    # 检查每个老师每天课时量是否超过平均数
                    if count_teacher_hours(schedule, teacher) > teacher_hours[teacher] / 5:
                        fitness -= 1
                    # 检查语数英是否排在每天前三节里
                    if subject[0] in ['语文', '数学', '英语'] and slot > 2:
                        fitness -= 1
                    # 检查体育是否排在每天前三节里
                    if subject[0] == '体育' and slot < 3:
                        fitness -= 1
                    # 检查是否有连排科目
                    if check_consecutive_subjects(schedule, grade, day, slot):
                        fitness -= 1
    return fitness

# 计算每个老师每天的课时量
def count_teacher_hours(schedule, teacher):
    count = 0
    for grade in range(6):
        for day in range(5):
            for slot in range(7):
                subject = schedule[grade][day][slot]
                if subject is not None and subject[1] == teacher:
                    count += 1
    return count

# 检查是否有连排科目
def check_consecutive_subjects(schedule, grade, day, slot):
    subject = schedule[grade][day][slot]
    if subject is None:
        return False
    if slot > 0:
        prev_subject = schedule[grade][day][slot-1]
        if prev_subject is not None and prev_subject[0] == subject[0]:
            return True
    if slot < 6:
        next_subject = schedule[grade][day][slot+1]
        if next_subject is not None and next_subject[0] == subject[0]:
            return True
    return False

# 交叉产生新的课程表
def crossover(parent1, parent2):
    child = generate_schedule()
    for grade in range(6):
        for day in range(5):
            for slot in range(7):
                if random.random() < 0.5:
                    child[grade][day][slot] = parent1[grade][day][slot]
                else:
                    child[grade][day][slot] = parent2[grade][day][slot]
    return child

# 变异产生新的课程表
def mutate(schedule):
    mutated_schedule = schedule
    for grade in range(6):
        for day in range(5):
            for slot in range(7):
                if random.random() < mutation_rate:
                    mutated_schedule[grade][day][slot] = None
    return mutated_schedule

# 选择下一代种群
def select_next_generation(population):
    next_generation = []
    sorted_population = sorted(population, key=lambda x: evaluate_fitness(x), reverse=True)
    next_generation.extend(sorted_population[:population_size // 2])
    for _ in range(population_size - population_size // 2):
        parent1 = random.choice(sorted_population[:population_size // 2])
        parent2 = random.choice(sorted_population[:population_size // 2])
        child = crossover(parent1, parent2)
        next_generation.append(child)
    return next_generation

# 执行遗传算法
def run_genetic_algorithm():
    population = initialize_population()
    for generation in range(generations):
        population = select_next_generation(population)
        for i in range(population_size // 2, population_size):
            population[i] = mutate(population[i])
    best_schedule = max(population, key=lambda x: evaluate_fitness(x))
    return best_schedule

# 将课程表输出到Excel
def output_schedule_to_excel(schedule):
    data = []
    for grade in range(6):
        for day in range(5):
            for slot in range(7):
                subject = schedule[grade][day][slot]
                if subject is not None:
                    data.append([grades[grade], day+1, time_slots[slot], subject[0], subject[1]])
    df = pd.DataFrame(data, columns=['年级', '星期', '时间', '科目', '老师'])
    df.to_excel('课程表.xlsx', index=False)

# 运行遗传算法并输出课程表到Excel
best_schedule = run_genetic_algorithm()
output_schedule_to_excel(best_schedule)

这段代码使用遗传算法生成一个符合要求的课程表,并将课程表输出到名为"课程表.xlsx"的Excel文件中。每个年级每天每节课的科目和老师信息都被记录在DataFrame中,然后通过to_excel方法输出到Excel中

小学有6个年级每个年级1个班有11个老师不同年级有不同科目和指定科目的课时量不同教师有指定课时量周上5天课每天7节课每个教师每天课时量不超过自己周课时数除以5的平均数语数英只排每天前3节里体育不排每天前3节里各个科目不能连排遗传算法排课pandas输出每天每节课课程表到Excel Python代码

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

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