鱼C论坛

 找回密码
 立即注册
查看: 5591|回复: 32

想咨询一下,如何设计一个排课表的软件

[复制链接]
发表于 2020-5-6 17:59:08 | 显示全部楼层 |阅读模式
10鱼币
想通过python设计一个排课表的软件
班级要求至少30个班

我初步尝试 使用random
通过一个周的固定课,产生一个二维列表

然后通过检查 是否同一老师在不同班在同一时间有重课
有的话 则重新随机
没有的话 则输出列表

通过for 遍历 和  if函数 检查
再随机列表 如果班级太多的话 随机时间太长,可能几个小时都无法输出满足条件的列表
请高人指点下 如何更快 更好的检查二维列表是否满足

如何更快的生成二维列表

我现在是使用
random.shuffle(list1)和 random.samp()方法

检查是把老师的带课班级 存在元组中,通过遍历元组,计算这个同时班级的课程,如果课程相同,则重新随机课程表


形容的可能不是很清楚,有哪里不清楚点的请提示下,我定尽量再详细的描述

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-6 20:02:17 | 显示全部楼层
仔细描述输入,输出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-6 20:22:21 | 显示全部楼层
我说一下我看了你的描述之后的想法,不一定对

现在你的想法是用二维数组记录,那么肯定是班级和时间的关系
而你已经拥有了一个老师的带课班级的元组

那么你只需要遍历这个元组,将一个老师一周的课同时安排完之后再安排下一个老师的课(在安排一个老师的课的时候就可以进行判断是否有同时在两个班上课的情况并进行排除即可)
在一个老师安排完之后,将已经安排过的位置从课程表中去掉(不参与下一个老师的遍历)

我也不知道我讲清楚没,我自己讲着讲着都有点晕
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-7 11:14:03 | 显示全部楼层
March2615 发表于 2020-5-6 20:22
我说一下我看了你的描述之后的想法,不一定对

现在你的想法是用二维数组记录,那么肯定是班级和时间的关 ...

你的描述基本没问题 就是这种重新随机 然后再核对 太慢了
现在20个班级 都得好长时间才能排出来

百度也没有合适的可以采取的例子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-7 11:16:30 | 显示全部楼层

暂时没有手动的输入

已经给的是20-30个班级的二维列表
不同科目老师代课的班级
比如
语文=((1,3),(5,7),(9,10),(2,4),(6,8),(11,12),(13,14),(15,16),(17,18),(19,20))

然后遍历二维列表 和 课程 如果 同一时间 如果 1班和3班都是语文 则重新随机课表 直到
都不重复之后
输出 全部课表
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-7 15:22:19 | 显示全部楼层
zhaoximeng 发表于 2020-5-7 11:16
暂时没有手动的输入

已经给的是20-30个班级的二维列表

我是没有看懂你这个输入
比如 语文的((1,3),(5,7))是什么意思呢

你可以先给一个小一点的例子 比如就五个班,然后老师代课班级是怎么样,我们可以从小一点的情况开始改进

不然我们只知道数据很大但是不知道具体是什么样的是没办法帮着解决的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-7 16:25:29 | 显示全部楼层
March2615 发表于 2020-5-7 15:22
我是没有看懂你这个输入
比如 语文的((1,3),(5,7))是什么意思呢

语文=((1,3),(5,7),(9,10),(2,4),(6,8),(11,12),(13,14),(15,16),(17,18),(19,20))
代表  1,3班的语文老师 是一个 不能重复
5,7班的是一个 不同能重复
其他的也是
代表一个老师带哪几个班的语文课
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-11 11:48:31 | 显示全部楼层
抽象一下,不就是八皇后问题吗,还是一个简化版的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-13 13:42:29 | 显示全部楼层
赚小钱 发表于 2020-5-11 11:48
抽象一下,不就是八皇后问题吗,还是一个简化版的

嗯 这个确实 是个好建议
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-13 13:43:05 | 显示全部楼层
赚小钱 发表于 2020-5-11 11:48
抽象一下,不就是八皇后问题吗,还是一个简化版的

关键课表随机的时候怎么写了 有好的建议吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-13 13:48:32 | 显示全部楼层
zhaoximeng 发表于 2020-5-13 13:43
关键课表随机的时候怎么写了 有好的建议吗?

每次选定一个课程,按照你的规则,比如说,同一门课程,每天最多可以上几节课,一共有多少节课,先把一门课程排好。
然后重复这个过程,在随机的时候,只需要注意如果位置被占用了,就重新随机一次
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-13 16:12:22 | 显示全部楼层
赚小钱 发表于 2020-5-13 13:48
每次选定一个课程,按照你的规则,比如说,同一门课程,每天最多可以上几节课,一共有多少节课,先把一门 ...

关键这个随机不好处理啊
我也想过这个问题的
随机的话 只能随机一个班级一个周的课程
但是验证的话 需要验证的是每个时间段 也就是每列的课程安排
二维数列的话 随机是行  验证是 每列验证
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-13 16:29:52 | 显示全部楼层
zhaoximeng 发表于 2020-5-13 16:12
关键这个随机不好处理啊
我也想过这个问题的
随机的话 只能随机一个班级一个周的课程

为什么要随机呢,这是一个深度遍历的过程,理论是可以计算出所有排课的情况。
随机挑选一门课,从第一天的第一节课开始,先把这个班的这门课程排完,之后,有两个选择,
1. 可以选择安排其他班级这门课程,此时需要注意,不要与前几个班的时间有冲突,
2. 可以选择安排当前班级的其他课程,此时需要注意,不要与当前班级的其他课程冲突。
根本不需要随机,遍历完所有课程,所有班级,所有时间三个维度,你的课表就出来了,并且,是可以得到所有的排列情况。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-14 16:28:29 | 显示全部楼层
赚小钱 发表于 2020-5-13 16:29
为什么要随机呢,这是一个深度遍历的过程,理论是可以计算出所有排课的情况。
随机挑选一门课,从第一天 ...

能帮忙写个简单的入门吗?
头有点点转不过来了
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-14 19:52:27 | 显示全部楼层
zhaoximeng 发表于 2020-5-14 16:28
能帮忙写个简单的入门吗?
头有点点转不过来了
谢谢

我由想了一下,可以抽象成一个数独的模型。
sudoku
找一下灵感吧。

PS: 以后我就作弊玩数独了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-17 16:28:40 | 显示全部楼层
赚小钱 发表于 2020-5-14 19:52
我由想了一下,可以抽象成一个数独的模型。
sudoku
找一下灵感吧。

用的GO语言?
我 还没学过go语言啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-17 17:41:59 | 显示全部楼层
本帖最后由 咸鱼c1 于 2020-5-17 17:44 编辑

判断是否同一老师在不同班在同一时间有重课
可以建立三维数组用 check[老师编号][班级号1][时间]==check[老师编号][班级号2][时间]判断
或者直接排课的时候 check[老师编号][时间]==1 就可以避免冲突了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-17 18:25:46 | 显示全部楼层
zhaoximeng 发表于 2020-5-17 16:28
用的GO语言?
我 还没学过go语言啊

语法简单,不存在看不懂语法的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-18 10:20:50 | 显示全部楼层
咸鱼c1 发表于 2020-5-17 17:41
判断是否同一老师在不同班在同一时间有重课
可以建立三维数组用 check[老师编号][班级号1][时间]==check[ ...

我是这样检查的 但是我是用的随机课表
检查不通过则重新随机课表 这样的话 班级多了的话 时间就比较长
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-18 10:21:39 | 显示全部楼层
赚小钱 发表于 2020-5-17 18:25
语法简单,不存在看不懂语法的。

安装哪个软件打开比较好啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 18:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表