以下是一个使用遗传算法生成每天每节课课程表并输出到Excel的Python代码示例:\n\npython\nimport random\nimport numpy as np\nimport pandas as pd\n\n# 定义问题参数\nnum_grades = 6 # 年级数量\nnum_teachers = 11 # 老师数量\nnum_days = 5 # 每周上课天数\nnum_periods = 7 # 每天上课节数\nnum_courses = 5 # 科目数量(不包括语数英和体育)\n\n# 定义每个年级的科目和指定科目的课时量\ngrade_subjects = {\n 1: {'语文': 5, '数学': 4, '英语': 3, '科学': 2, '社会': 2},\n 2: {'语文': 5, '数学': 4, '英语': 3, '科学': 2, '社会': 2},\n 3: {'语文': 5, '数学': 4, '英语': 3, '科学': 2, '社会': 2},\n 4: {'语文': 5, '数学': 4, '英语': 3, '科学': 2, '社会': 2},\n 5: {'语文': 5, '数学': 4, '英语': 3, '科学': 2, '社会': 2},\n 6: {'语文': 5, '数学': 4, '英语': 3, '科学': 2, '社会': 2}\n}\n\n# 定义每个老师的指定课时量\nteacher_courses = {\n 1: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 2: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 3: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 4: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 5: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 6: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 7: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 8: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 9: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 10: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2},\n 11: {'语文': 4, '数学': 3, '英语': 3, '科学': 2, '社会': 2}\n}\n\n# 定义遗传算法参数\npopulation_size = 100 # 种群大小\nmutation_rate = 0.01 # 变异率\nnum_generations = 100 # 迭代次数\n\n# 生成初始种群\ndef generate_population():\n population = []\n for _ in range(population_size):\n chromosome = []\n for _ in range(num_days * num_periods):\n gene = random.randint(0, num_courses + 1) # 0表示休息,1-5表示科目\n chromosome.append(gene)\n population.append(chromosome)\n return population\n\n# 计算适应度\ndef calculate_fitness(chromosome):\n conflicts = 0\n schedule = np.array(chromosome).reshape(num_days, num_periods)\n \n # 检查每天每节课的冲突\n for day in range(num_days):\n for period in range(num_periods):\n course = schedule[day][period]\n \n # 检查是否在前3节课里排了语数英\n if period < 3 and (course == 1 or course == 2 or course == 3):\n conflicts += 1\n \n # 检查是否在前3节课里排了体育\n if period < 3 and course == num_courses + 1:\n conflicts += 1\n \n # 检查每个年级各科目的课时量是否满足要求\n for grade in range(1, num_grades + 1):\n grade_schedule = schedule[:, grade-1]\n grade_subject_hours = sum([grade_subjects[grade][subject] for subject in grade_subjects[grade]])\n for subject in grade_subjects[grade]:\n subject_hours = sum(grade_schedule == subject)\n if subject_hours != grade_subjects[grade][subject]:\n conflicts += abs(subject_hours - grade_subjects[grade][subject])\n \n # 检查每个老师的指定课时量是否满足要求\n for teacher in range(1, num_teachers + 1):\n teacher_schedule = schedule[:, teacher-1]\n for subject in teacher_courses[teacher]:\n subject_hours = sum(teacher_schedule == subject)\n if subject_hours != teacher_courses[teacher][subject]:\n conflicts += abs(subject_hours - teacher_courses[teacher][subject])\n \n fitness = 1 / (conflicts + 1)\n return fitness\n\n# 选择操作\ndef selection(population, fitness_scores):\n selected_indices = np.random.choice(range(population_size), size=population_size, p=fitness_scores/sum(fitness_scores))\n selected_population = [population[i] for i in selected_indices]\n return selected_population\n\n# 交叉操作\ndef crossover(parent1, parent2):\n crossover_point = random.randint(1, num_days * num_periods - 1)\n child1 = parent1[:crossover_point] + parent2[crossover_point:]\n child2 = parent2[:crossover_point] + parent1[crossover_point:]\n return child1, child2\n\n# 变异操作\ndef mutate(chromosome):\n for i in range(num_days * num_periods):\n if random.random() < mutation_rate:\n chromosome[i] = random.randint(0, num_courses + 1)\n return chromosome\n\n# 创建课程表\ndef create_schedule():\n population = generate_population()\n \n for generation in range(num_generations):\n fitness_scores = [calculate_fitness(chromosome) for chromosome in population]\n selected_population = selection(population, fitness_scores)\n \n next_population = []\n while len(next_population) < population_size:\n parent1, parent2 = random.choices(selected_population, k=2)\n child1, child2 = crossover(parent1, parent2)\n next_population.extend([mutate(child1), mutate(child2)])\n \n population = next_population\n \n best_chromosome = max(population, key=calculate_fitness)\n best_schedule = np.array(best_chromosome).reshape(num_days, num_periods)\n \n return best_schedule\n\n# 输出课程表到Excel\ndef output_schedule(schedule):\n days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']\n periods = [f'Period {i+1}' for i in range(num_periods)]\n \n df = pd.DataFrame(schedule, index=days, columns=periods)\n writer = pd.ExcelWriter('schedule.xlsx')\n df.to_excel(writer, sheet_name='Schedule')\n writer.save()\n\n# 主函数\ndef main():\n schedule = create_schedule()\n output_schedule(schedule)\n\nif __name__ == '__main__':\n main()\n\n\n请注意,这只是一个示例代码,可能需要根据实际需求进行进一步修改和完善。\n

遗传算法生成小学课程表并输出到Excel - Python代码示例

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

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