一道严蔚敏<数据结构>习题集里的相关于拓扑排序的习题,我连一点思路都找不到,怎么办?求救!

wgz2100 2003-09-11 09:59:49
问题描述:
大学的每个专业都要制定教学计划。假设任何专业都有固定的学习年限,每学年各含两个学期,每学期的时间长度和学分上限值均相等。每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。每门课程有那些先修课程是确定的,可以有任意多门,也可以没有。每门课恰好占一个学期。试在这样的前提下设计一个教学计划编制程序。

基本要求:
1)输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号;2)允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀,二是使课程尽可能地集中在前几个学期中;若根据给定的条件问题无解,则报告适当的信息,否则将教学计划输出到用户指定的文件中,格式自行设计。

其实我剩下的只是编排策略中策略一的实现,我一点思路都没有。如果说是个拓扑排序的问题,但也没有办法啊,拓扑排序只能找出一个序列,不能找出所有的序列,就算找出,又如何给各个学期赋以哪几门课,以使学生的负担均匀(平均学分平衡)。总之我实在是没有办法了,究竟用什么算法呢?有谁做过或者哪位高手请给以指教。谢谢。
...全文
359 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyff8neo 2003-09-13
  • 打赏
  • 举报
回复
我大概10月份做这道题目,所以先mark一下
iamfred 2003-09-13
  • 打赏
  • 举报
回复
学习中~~
wgz2100 2003-09-13
  • 打赏
  • 举报
回复
BlueSky2008() 说得对,是应该要找到一个最优化函数又或是评判的标准。方差估计是不行的,因为我希望这个标准不单可以评判,而且可有利于我的课程在各学期中的分配(学期课程数组第一维的递增)。我尝试了把各课程的总学分,除以学期总数,得到每学期平均学分。以这个值代替第二种方式中的每学期最高学分这个标准。然后用同样的算法去做。实现起来也比较简单,但总觉不是很好,不知各位是否有更好的数学评判标准。
wgz2100 2003-09-12
  • 打赏
  • 举报
回复
zzwu(未名) 所说的图我可以画到,甚至用拓扑排序法找出一个可行的序列也没问题的。问题是我只能找出一个序列,而无法列出全部的序列从而进行比较得出最优。就算得出了全部的可行序列,那又怎么样实现这样的过程:把序列中的一个个的课程号,放到学期数组中。也就是课程号的分配问题,既要不超过学期的学分上限,又要进行所有的可能的比较(所有的可能的分配)。我觉得好难啊。完全没办法了。

至于模拟退火算法,我也不了解,可以解决这样的问题吗?
zzwu 2003-09-12
  • 打赏
  • 举报
回复
在参与论坛的人中,没有人做过这道题,是完全可能的.

但,没有做过这道题的人,也完全有可能来解决此问题,至少可以提出一些想法.

我觉得,第一步,你应现将所有课程按先修-后修的关系,画出一个图. 由于每门课可以有多门先修课,所以,这个图应是一个偏序图. 有了这一图, 排课程表就有了依据.



BlueSky2008 2003-09-12
  • 打赏
  • 举报
回复
其实你可以参照下面的拓扑排序算法:
1:找出图中一个没有直接前驱的顶点,并输出。
2:删除这个顶点,和从这个顶点出发的边。
3:如果图中还有顶点,返回第一步。

所以,第一学期可供选择的课程就是图中所有没有直接前驱的顶点。
当你选定一些课程后,删除这些课程对应的顶点,和从其出发的边。
第二学期的问题同第一学期类似。

使课程尽可能地集中在前几个学期中:就是要在开始几学期尽量多选择课程。
各学期中的学习负担尽量均匀:你首先要定义一个最优化函数,如各学期总学分的方差,然后才好定量比较。
另外还有一些约束条件:如一学期的学分上、下限,每次作选择时都要满足这些条件。可以作一些剪枝,缩小搜索范围。
SoftWare1999 2003-09-12
  • 打赏
  • 举报
回复
尽量均匀,这是一个模糊概念。

要寻优,可以用模拟退火算法,或遗传算法吧。基础当然还是拓扑。
wgz2100 2003-09-12
  • 打赏
  • 举报
回复
找出所有的可行序列应该还不是最难的。 怎样从序列中把序列的课程号分到各个学期,以得到学分负担最均匀的分配,就有点问题了。
我给出第二种方式我的实现方法:在能找到所有可行的序列的算法支持下,用一个Term[][]的二维数组存储各个学期的课程号。第一维表学期,第二维表第几门课。学期从1开始,把课程放到第1学期中,当学分累积多于10(学期最高学分数)时,第一维++,就下跳到下一个学期继续存储。每一次序列分配完后,判断是否比上一次序列的学期数少,若是,则作为最优解存储。直至把所有的可行序列试完。
给出上述第二种方式的分配和判断的算法主要给大家也提供一点思路,实际上第一种方式是比第二种要难多了,也就是分配的算法和判断的算法无法想到,所以我感觉很有些无助。
SoftWare1999 2003-09-12
  • 打赏
  • 举报
回复
就是 如果只是理解拓扑排序的话,穷举也就好了。

楼上说不会超过20课,那穷举也不慢了,呵呵
SoftWare1999 2003-09-12
  • 打赏
  • 举报
回复
你既然已经采取了,回溯和递归解决第二问了。
第一问不是也可以这样的用个穷举解决了,虽然时间复杂度较高。

proc 拓扑

if 所有课程排序完毕

检查是否最优
退出 过程

each 所有课程
if x未排 且 无先修课程 then

解除 以 x为先修课程 限制
记录 x
拓扑
恢复 以 x为先修课程 限制

zzwu 2003-09-12
  • 打赏
  • 举报
回复
找出一个可行的序列自然不够,而必须用某种方法来考察一切可行的序列.由于课程数目并不多(不过20多门),且有上述约束条件,可行序列数不会很多,我认为用简单的穷举法就可以.
findawork 2003-09-12
  • 打赏
  • 举报
回复
关注
wgz2100 2003-09-12
  • 打赏
  • 举报
回复
至于模拟退火算法,我粗看了一下(因为无法找到比较详细介绍的网站)。感觉也没有底,可能是小弟浸淫得不多,仍然是找不到思路啊。
wgz2100 2003-09-12
  • 打赏
  • 举报
回复
其实这个问题,虽然出现在那本书的拓扑排序板块,我个人却认为用拓扑排序并非是最好的方法,也正是因为书上的算法无法穷举所有可能的序列。
实际上,对于这道题的第二种排课方式,我已经写出程序,用的是回溯法,用递归结构实现的。
剩下那第一种排课方式,我就是不知道该如何往各学期分配课程或者说如何判断最优的排课。第二种方式好实现之处在于:我只要把课程尽量往前挤就是了,一但学分超了就新添学期。而第一种就没有办法了,说什么学分负担均匀,那纯粹是个玩弄人的概念,没有一个一定的量化的标准,也就很难找到判断最优,程序也很难写了。
wgz2100 2003-09-12
  • 打赏
  • 举报
回复
我想问题倒是不必考虑得如此复杂的,只要在同一学期内,则可算是满足先修关系了。因为这毕竟只是个练习题,条件也说明得不是很充分。
wgz2100 2003-09-12
  • 打赏
  • 举报
回复
天啊,难道就没有人做过这道题吗?难道就没人有一点点的思路和算法吗?跟我讲一下实现算法或过程就好了。
SoftWare1999 2003-09-12
  • 打赏
  • 举报
回复
这个题目是不是,还要假设,A是B的先修课,所以B不可能与A在同一个学期呢?
还是
A 20课时
B 30课时
总课时>50课时时,可以先安排全部上A,然后再上B呢?

这两种假设,对数学推导还是有用的,对模拟退火也就不是太大了。
SoftWare1999 2003-09-12
  • 打赏
  • 举报
回复
至于模拟退火算法,能不能很好解决这个问题。我也不知道,要程序做出来才行。

不过你这个问题和某年的数模的题目类似,就是灾情巡视。其中有一问也是要求,各组巡视路线时间尽量平均,且总路程时间也较短。
我用模拟退火做了下,效果还好,在当年的最佳答案范围内。

我的思路是:
先随机产生,每个学期的排课计划。当然是满足拓扑的。
然后,就是随机调动某门课的时间。当然一改变一门课,必然会有很多改变。仍然满足拓扑
接下来,就是退火算法了。

不过这个问题,如果可以找到其他数学理论支持,可以直接做是最好的。
请数学强人来了。
klbt 2003-09-11
  • 打赏
  • 举报
回复
帮你顶。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧