Algorithm 创建我的个人学校时间表的算法

Algorithm 创建我的个人学校时间表的算法,algorithm,Algorithm,每个人都熟悉计算机科学中的时间表问题。我不是在问这个问题的算法。 我只想为我在学校的一个学期制定个人时间表 您可以这样假设: 我所在的大学已经有人开设了课程、指定了教师、教室等。因此,课程已经在那里,随时可以选择。 只有一小部分课程对我有用。比如说25节课。 我每学期要上5节课(可以多多少少,但让我们保持简单) 我想要的只是一些关于如何创建有效时间表的提示/线索,更重要的是,最佳时间表 想想看,什么是最佳时间表 就我个人而言,这些课程来自两个不同的学院,但我已经能够创建一个包含以下信息的csv文

每个人都熟悉计算机科学中的时间表问题。
我不是在问这个问题的算法。

我只想为我在学校的一个学期制定个人时间表

您可以这样假设:
  • 我所在的大学已经有人开设了课程、指定了教师、教室等。因此,课程已经在那里,随时可以选择。
  • 只有一小部分课程对我有用。比如说25节课。
  • 我每学期要上5节课(可以多多少少,但让我们保持简单)

    我想要的只是一些关于如何创建有效时间表的提示/线索,更重要的是,最佳时间表
    想想看,什么是最佳时间表
    就我个人而言,这些课程来自两个不同的学院,但我已经能够创建一个包含以下信息的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 M 16:35:00 17:25:00存在主义。 14:35:00 15:55:00 COMP 350数值计算。 14:35:00 15:55:00 COMP 208工程计算机。 14:35:00 15:25:00菲尔306心灵哲学。 14:35:00 15:25:00菲尔200哲学导论 等 正如您所看到的,一切都是按开始时间排序的(倒序),但存在冲突。一周中其他所有的日子都是一样的
    如何创建有效/最优的计划?我应该考虑什么?br>

    更多信息:

    这是我最初对我应该考虑的事情的想法:
  • 对我来说,当务之急是尽可能晚上课。所以我会选择周一、周三和周五最新的3节课,以及周二、周四的2节课。[我认为我可以如何实现此目标,请参见评论]
  • 另一个解决方案是在类之间(或相反)获得最少的“中断”
  • 另一种可能是最早的课程
  • 另一个优先事项是在同一天为1名教员安排所有课程,另外一个是交替为A教员安排1节课,然后为B教员安排1节课,以此类推。

    缺少一些东西?

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

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

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

    伪代码:

    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

    这看起来像是一个作业,首先分享你已经尝试过的内容,然后论坛可以帮助你解决你面临的问题。不是作业(我下周开始上课)我只想完成一个我一直在编写的脚本,该脚本从大学获取html页面并生成csv。到目前为止,我唯一的想法是:检查每节课的开始时间和下一节课的结束时间。如果有冲突,请标记它,继续。一旦没有发现冲突,请中断。对其余的课也这样做。因为我想唤醒你p迟到一个可能的时间表是这样的:你总是选择最新的课程,然后是最接近的课程,没有冲突,然后是下一个。3个星期一/星期三/星期五的课程和2个星期二/星期四的课程你可能的意思是:“对照上一节课的结束时间检查每节课的开始时间”它从一个最晚的类到另一个最早的类,因此第一个类具有最晚的可能开始时间。此外,如果顺序是从最早到最晚的,则无法保证一旦发现冲突,就可以停止(在这种情况下,下一个类仍可能生成冲突)例如:从phil 375开始,一旦你达到350,你知道你不会有更多的冲突。从phil 210开始,306会有冲突,但208+1也会有冲突。我喜欢你对自己的教育采取如此傲慢的态度!你有没有考虑过根据兴趣来选择课程?:-d感谢维基百科ar的链接提克。我看到这似乎是一个简单的问题,但从实践的角度来看,它对我来说非常有用。我想我可以从现在开始处理它,我只需要考虑拒绝什么和不拒绝什么,从执行“评估(候选)”时的冲突开始,对吗?@user968420:是的-
    评估(候选)
    是一个函数-为每个候选人打分,在上面的伪代码中-分数越高-越好。因此,你应该给符合大多数标准的候选人打好分数,而给不符合标准的候选人打低分数。记住给无效候选人打负分-这样他们就永远不会被选中。哦!所以你使用分数based系统实现优先级…天啊,太简单了。谢谢!@user968420:注意,原来的伪代码缺少一个stop子句,我现在添加了它。