我一直在想是否有已知的算法来创建学校课程表。基本上,它是关于优化给定班级-科目-教师关联下的“时间分散”(教师和班级均适用)。我们可以假设在输入时,我们有班级、课程主题和与之相关联的教师集合,并且课程表应该在早上8点到下午4点之间。
我猜可能没有精确的算法,但也许有人知道一个良好的近似值或开发它的提示。
我一直在想是否有已知的算法来创建学校课程表。基本上,它是关于优化给定班级-科目-教师关联下的“时间分散”(教师和班级均适用)。我们可以假设在输入时,我们有班级、课程主题和与之相关联的教师集合,并且课程表应该在早上8点到下午4点之间。
我猜可能没有精确的算法,但也许有人知道一个良好的近似值或开发它的提示。
通常,约束编程是解决这类调度问题的好方法。在stackoverflow和Google上搜索“约束编程”和“调度”或“基于约束的调度”将产生一些好的参考资料。使用传统的优化方法如线性或整数优化时,思考这个问题可能有些困难,但这并非不可能。其中一个输出结果是:是否存在一个满足所有要求的时间表?这本身就是很有帮助的。
祝好运!
if(TimetableDefinition.find(k2).period.to_i != 0)
subjectflag.each do |k3,v3|
if (v3 == 0)
if(getflag_period(periodflag,k2))
@teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
@teacherlists=Employee.find(@teachers)
teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle]
teacherflag.each do |k4,v4|
if(v4 == 0)
if(getflag_subject(subjectflag,k3))
subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
if subjectperiod.blank?
issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
if issubjectpresent.blank?
isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
if isteacherpresent.blank?
@finaltt=TimetableAssign.new
@finaltt.timetable_struct_id=@timetable_struct.id
@finaltt.employee_id=k4
@finaltt.section_id=section.id
@finaltt.standard_id=standard.id
@finaltt.division_id=division.id
@finaltt.subject_id=k3
@finaltt.timetable_definition_id=k2
@finaltt.timetable_day_id=k1
set_school_id(@finaltt,current_user)
if(@finaltt.save)
setflag_sub(subjectflag,k3,1)
setflag_period(periodflag,k2,1)
setflag_teacher(teacherflag,k4,1)
end
end
else
@subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
@finaltt=TimetableAssign.new
@finaltt.timetable_struct_id=@subjectdetail.timetable_struct_id
@finaltt.employee_id=@subjectdetail.employee_id
@finaltt.section_id=section.id
@finaltt.standard_id=standard.id
@finaltt.division_id=division.id
@finaltt.subject_id=@subjectdetail.subject_id
@finaltt.timetable_definition_id=k2
@finaltt.timetable_day_id=k1
set_school_id(@finaltt,current_user)
if(@finaltt.save)
setflag_sub(subjectflag,k3,1)
setflag_period(periodflag,k2,1)
setflag_teacher(teacherflag,k4,1)
end
end
end
end
end
end
end
end
end
end
end
我尝试使用两阶段最大流和巧妙构建图来创建一个。
你可以在这里看到它: https://github.com/Kemsekov/SchoolScheduleCreator
它允许: