创建我个人学校日程的算法

时间:2012-08-30 05:41:59

标签: algorithm

每个人都熟悉计算机科学中的日程安排问题。
我不是要求针对这个问题的算法。

我只是想在学校创建一个学期的个人时间表

这是你可以假设的:

  • 我大学的某个人已经创建了课程,分配了教师,房间等。因此,课程已经在那里,随时可以选择。
  • 只有相对较小一部分课程可供我使用。说25节课
  • 每学期我必须上5节课(可能或多或少,但让我们保持这么简单)

    我想要的只是关于如何创建有效的时间表以及更重要的是最佳时间表的一些提示/线索。
    想一想,最佳时间表是什么?
    在我个人的情况下,这些类来自2个不同的院系,但我能够创建一个包含以下信息的csv文件:

    M               
    16:35:00    17:25:00    PHIL    375 Existentialism.
    14:35:00    15:55:00    COMP    350 Numerical Computing.
    14:35:00    15:55:00    COMP    208 Computers in Engineering.
    14:35:00    15:25:00    PHIL    306 Philosophy of Mind.
    14:35:00    15:25:00    PHIL    200 Introduction to Philosophy 
    ..etc
    

    如您所见,所有内容都按开始时间(倒置)排序,但存在冲突。一周的所有其他日子都一样。
    如何创建有效/最佳时间表?我应该考虑什么?

    更多信息:

    这是我最初想的应该考虑的事情:

  • 我的一个优先事项是尽可能晚地上课。所以我会选择星期一,星期三和星期五的3个最新课程和星期二,星期四的2个班级。 [请参阅我认为我可以实施的评论]
  • 另一种解决方案是在课间(或相反)中获得最少量的“休息”
  • 另一种可能是最早的课程
  • 另一个优先事项是在同一天获得1个教师的所有课程,而另一个课程为教师A和教师B等交替1个班级。
    想念什么?

  • 1 个答案:

    答案 0 :(得分:1)

    对于这种规模 - 我不会太努力避免简单编程强力解决方案。

    从25个列表中选择5个课程有25!/(20!*5!)=53130种不同的可能性。通过简单地检查所有这些课程并获得最佳 - 保证了最佳解决方案。对于任何现代机器来说,这种规模的运行时间也不是问题。

    backtracking解决方案很简单 - “猜测”要添加的课程,递归调用,直到列表已满,评估解决方案。当您从递归回来时 - 检查选择课程的不同可能性。

    伪代码:

    best = 0
    bestSol = nil
    findCalendar(courses,candidate,i):
      if (take.size() == 5):
          t = evaluate(candidate)
          if (t > best):
              best = t
              bestSol = copy(candidate)
          return
      else if (i == courses.size()):
          //another stop clause, for non-feasible solutions (less then 5 were selected)
          return 
      for each j in range(i,courses.size()):
          candidate.add(courses[j]) //add this course to the candidate
          fidnCalendar(courses,candidate,j+1) //recurse to find the next courses for this candidate
          candidate.removeLast() //cklean up environment before next candidates
    

    使用findCalendar(myCourses,[],0)调用,算法完成后,bestSol将保留最佳日历,其值为best