以下是一个使用遗传算法排课的简单示例代码,使用Pandas将每天每节课的课程表输出到Excel中:\n\npython\nimport pandas as pd\nimport random\n\n# 定义年级、科目和老师等信息\ngrades = ['一年级', '二年级', '三年级', '四年级', '五年级', '六年级']\nsubjects = ['语文', '数学', '英语', '体育', '科学', '音乐', '美术', '社会', '品德']\nteachers = ['Teacher1', 'Teacher2', 'Teacher3', 'Teacher4', 'Teacher5', 'Teacher6', 'Teacher7', 'Teacher8', 'Teacher9', 'Teacher10', 'Teacher11']\n\n# 定义每个年级的科目和指定科目的课时量\ngrade_subjects = {'一年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},\n '二年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},\n '三年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},\n '四年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},\n '五年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1},\n '六年级': {'语文': 4, '数学': 4, '英语': 4, '体育': 2, '科学': 2, '音乐': 1, '美术': 1, '社会': 1, '品德': 1}}\n\n# 定义每个老师的指定课时量\nteacher_hours = {'Teacher1': 20, 'Teacher2': 20, 'Teacher3': 20, 'Teacher4': 20, 'Teacher5': 20, 'Teacher6': 20,\n 'Teacher7': 20, 'Teacher8': 20, 'Teacher9': 20, 'Teacher10': 20, 'Teacher11': 20}\n\n# 定义每天每节课的时间段\ntime_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']\n\n# 定义遗传算法参数\npopulation_size = 100\nmutation_rate = 0.01\ngenerations = 100\n\n# 初始化种群\ndef initialize_population():\n population = []\n for _ in range(population_size):\n schedule = generate_schedule()\n population.append(schedule)\n return population\n\n# 生成一个随机的课程表\ndef generate_schedule():\n schedule = []\n for _ in range(6): # 六个年级\n grade_schedule = []\n for _ in range(5): # 五天课\n day_schedule = []\n for _ in range(7): # 七节课\n day_schedule.append(None)\n grade_schedule.append(day_schedule)\n schedule.append(grade_schedule)\n return schedule\n\n# 评估课程表的适应度\ndef evaluate_fitness(schedule):\n fitness = 0\n for grade in range(6):\n for day in range(5):\n for slot in range(7):\n subject = schedule[grade][day][slot]\n if subject is not None:\n teacher = subject[1]\n # 检查每个老师每天课时量是否超过平均数\n if count_teacher_hours(schedule, teacher) > teacher_hours[teacher] / 5:\n fitness -= 1\n # 检查语数英是否排在每天前三节里\n if subject[0] in ['语文', '数学', '英语'] and slot > 2:\n fitness -= 1\n # 检查体育是否排在每天前三节里\n if subject[0] == '体育' and slot < 3:\n fitness -= 1\n # 检查是否有连排科目\n if check_consecutive_subjects(schedule, grade, day, slot):\n fitness -= 1\n return fitness\n\n# 计算每个老师每天的课时量\ndef count_teacher_hours(schedule, teacher):\n count = 0\n for grade in range(6):\n for day in range(5):\n for slot in range(7):\n subject = schedule[grade][day][slot]\n if subject is not None and subject[1] == teacher:\n count += 1\n return count\n\n# 检查是否有连排科目\ndef check_consecutive_subjects(schedule, grade, day, slot):\n subject = schedule[grade][day][slot]\n if subject is None:\n return False\n if slot > 0:\n prev_subject = schedule[grade][day][slot-1]\n if prev_subject is not None and prev_subject[0] == subject[0]:\n return True\n if slot < 6:\n next_subject = schedule[grade][day][slot+1]\n if next_subject is not None and next_subject[0] == subject[0]:\n return True\n return False\n\n# 交叉产生新的课程表\ndef crossover(parent1, parent2):\n child = generate_schedule()\n for grade in range(6):\n for day in range(5):\n for slot in range(7):\n if random.random() < 0.5:\n child[grade][day][slot] = parent1[grade][day][slot]\n else:\n child[grade][day][slot] = parent2[grade][day][slot]\n return child\n\n# 变异产生新的课程表\ndef mutate(schedule):\n mutated_schedule = schedule\n for grade in range(6):\n for day in range(5):\n for slot in range(7):\n if random.random() < mutation_rate:\n mutated_schedule[grade][day][slot] = None\n return mutated_schedule\n\n# 选择下一代种群\ndef select_next_generation(population):\n next_generation = []\n sorted_population = sorted(population, key=lambda x: evaluate_fitness(x), reverse=True)\n next_generation.extend(sorted_population[:population_size // 2])\n for _ in range(population_size - population_size // 2):\n parent1 = random.choice(sorted_population[:population_size // 2])\n parent2 = random.choice(sorted_population[:population_size // 2])\n child = crossover(parent1, parent2)\n next_generation.append(child)\n return next_generation\n\n# 执行遗传算法\ndef run_genetic_algorithm():\n population = initialize_population()\n for generation in range(generations):\n population = select_next_generation(population)\n for i in range(population_size // 2, population_size):\n population[i] = mutate(population[i])\n best_schedule = max(population, key=lambda x: evaluate_fitness(x))\n return best_schedule\n\n# 将课程表输出到Excel\ndef output_schedule_to_excel(schedule):\n data = []\n for grade in range(6):\n for day in range(5):\n for slot in range(7):\n subject = schedule[grade][day][slot]\n if subject is not None:\n data.append([grades[grade], day+1, time_slots[slot], subject[0], subject[1]])\n df = pd.DataFrame(data, columns=['年级', '星期', '时间', '科目', '老师'])\n df.to_excel('课程表.xlsx', index=False)\n\n# 运行遗传算法并输出课程表到Excel\nbest_schedule = run_genetic_algorithm()\noutput_schedule_to_excel(best_schedule)\n\n\n这段代码使用遗传算法生成一个符合要求的课程表,并将课程表输出到名为"课程表.xlsx"的Excel文件中。每个年级每天每节课的科目和老师信息都被记录在DataFrame中,然后通过to_excel方法输出到Excel中。


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

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