每个人都熟悉计算机科学中的日程安排问题。
我不是要求针对这个问题的算法。
我只是想在学校创建一个学期的个人时间表
这是你可以假设的:
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
如您所见,所有内容都按开始时间(倒置)排序,但存在冲突。一周的所有其他日子都一样。
如何创建有效/最佳时间表?我应该考虑什么?
更多信息:
这是我最初想的应该考虑的事情:
答案 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