在PHP中编写课程时间表系统的最有效方法是什么?

时间:2011-11-06 20:23:26

标签: php scheduling np-complete

问题: 鉴于一套强制性和选修课程,每个课程仅在某些时段(有7个时段)可用,生成所有可能的时间表。

示例:

对于必修课程:

  • MAT101 - 1,2,5
  • HIS102 - 2,4,6
  • ENG105 - 3,6,7

可选课程:

  • LIT103 - 3,4,6
  • CHE101 - 7,1,2
  • BIO101 - 5,4,7
  • MAT201 - 6,5,1
  • ANT201 - 1

(并非每个选修课程都必须包含在时间表中)

可能的解决方案之一是:

  1. MAT101 [强制性]
  2. HIS102 [强制性]
  3. LIT103
  4. BIO101
  5. MAT201
  6. ENG105 [必须]
  7. CHE101
  8. 用PHP编写它的最有效方法是什么?

    我目前正在尝试开发一种强力解决方案,但这是一项非常繁琐的工作,我正在寻找更有效的方法。我发现它是一个NP完全问题并且搜索了有助于解决这些问题的PHP课程,但是我担心目前没有这样的课程。

2 个答案:

答案 0 :(得分:0)

首先,我同意布莱恩你首先需要对这个问题有充分的了解,然后对于算法来说,互联网对它们有所了解。

你说不是每个选修课程都必须包括在内,这意味着这种模式是唯一被接受的模式:

  

obc x x x x x x

其中obc是必修课,x是强制性或选择性的。顺序无关紧要。

如果您有N个强制性和M个选修课程(显然N + M> 7或N + M = 7)那么您只能拥有N个上述类型的模式。

然后你必须找到这种不同的时间表:

X X X X X X(6道菜)

这里的顺序并不重要,不允许重复,所以你需要6个(N + M)的组合,这将使得:

(N+M)!/[6!(N+M-6)!] = K different such timetables.

然后,7个课程的所有不同时间表将是:

  

K + K + ... + K(N次)= N * K

(仔细检查这是否正确,今天真的很累,否则会建议一些代码)。

我希望这可以提供一些帮助。

答案 1 :(得分:0)

问题:

  

问题:给出一套强制性和可选择的课程   仅在某些时隙(有7个时隙)生成   所有可能的时间表。

此处的关键是生成所有可能时间表。这样做很简单,但是无论如何都需要指数时间,因为你基本上列出了整个搜索空间(可能性)。

将是递归的并且获取对的列表,该对中的第一个是时隙,并且该对的第二个元素是可以填充时隙的可能类的列表。数据结构如下所示:

对于必修课程:

  • 1 - MAT101 ,CHE101,MAT201,ANT201
  • 2 - MAT101,HIS102 ,CHE101
  • 3 - ENG105,LIT103

等。需要加粗课程的地方。 它还需要一个已经通过该方法的先前递归调用选择的课程列表。

该功能

  • 检查可能性列表(如上所述)是否包含已选择的课程列表,包含所有必修课程。如果没有,请返回。
  • 选择第一个可用时段(称之为myPick),然后选择
  • 为每个可能填充该时间段的类(称之为currentClass),
    • 如果此方法在其第一个参数中仅被赋予1个时隙,
      • 打印已经选择的类列表(作为参数给出)。
      • print“$ currentClass $ myPick \ n”,
      • 打印一个额外的换行符以分隔列表。回报率。
    • 否则以递归方式调用方法,在其中为您提供尚未选择的时间列表(作为参数给出的时隙列表减去您在步骤2中选择的时间列表),除了每种可能性时间列表的列表具有从中删除的类。递归调用的第二个参数应该是添加到列表中的(<currentClass,myPick>)赋予此调用实例的已选择类的列表。

这应该让你开始。