Algorithm for creating a school timetable

后端 未结 16 1659
暖寄归人
暖寄归人 2020-12-04 04:57

I\'ve been wondering if there are known solutions for algorithm of creating a school timetable. Basically, it\'s about optimizing \"hour-dispersion\" (both in teachers and

相关标签:
16条回答
  • 2020-12-04 05:24

    You can takle it with genetic algorithms, yes. But you shouldn't :). It can be too slow and parameter tuning can be too timeconsuming etc.

    There are successful other approaches. All implemented in open source projects:

    • Constraint based approach
      • Implemented in UniTime (not really for schools)
      • You could also go further and use Integer programming. Successfully done at Udine university and also at University Bayreuth (I was involved there) using the commercial software (ILOG CPLEX)
      • Rule based approach with heuristisc - See Drools planner
    • Different heuristics - FET and my own

    See here for a timetabling software list

    0 讨论(0)
  • 2020-12-04 05:28

    I don't know any one will agree with this code but i developed this code with the help of my own algorithm and is working for me in ruby.Hope it will help them who are searching for it in the following code the periodflag ,dayflag subjectflag and the teacherflag are the hash with the corresponding id and the flag value which is Boolean. Any issue contact me.......(-_-)

    periodflag.each do |k2,v2|

                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
    
    0 讨论(0)
  • 2020-12-04 05:30

    I work on a widely-used scheduling engine which does exactly this. Yes, it is NP-Complete; the best approaches seek to approximate an optimal solution. And, of course there are a lot of different ways to say which one is the "best" solution - is it more important that your teachers are happy with their schedules, or that students get into all their classes, for instance?

    The absolute most important question you need to resolve early on is what makes one way of scheduling this system better than another? That is, if I have a schedule with Mrs Jones teaching Math at 8 and Mr Smith teaching Math at 9, is that better or worse than one with both of them teaching Math at 10? Is it better or worse than one with Mrs Jones teaching at 8 and Mr Jones teaching at 2? Why?

    The main advice I'd give here is to divide the problem up as much as possible - maybe course by course, maybe teacher by teacher, maybe room by room - and work on solving the sub-problem first. There you should end up with multiple solutions to choose from, and need to pick one as the most likely optimal. Then, work on making the "earlier" sub-problems take into account the needs of later sub-problems in scoring their potential solutions. Then, maybe work on how to get yourself out of painted-into-the-corner situations (assuming you can't anticipate those situations in earlier sub-problems) when you get to a "no valid solutions" state.

    A local-search optimization pass is often used to "polish" the end answer for better results.

    Note that typically we are dealing with highly resource-constrained systems in school scheduling. Schools don't go through the year with a lot of empty rooms or teachers sitting in the lounge 75% of the day. Approaches which work best in solution-rich environments aren't necessarily applicable in school scheduling.

    0 讨论(0)
  • 2020-12-04 05:31

    I think you should use genetic algorithm because:

    • It is best suited for large problem instances.
    • It yields reduced time complexity on the price of inaccurate answer(Not the ultimate best)
    • You can specify constraints & preferences easily by adjusting fitness punishments for not met ones.
    • You can specify time limit for program execution.
    • The quality of solution depends on how much time you intend to spend solving the program..

      Genetic Algorithms Definition

      Genetic Algorithms Tutorial

      Class scheduling project with GA

    Also take a look at :a similar question and another one

    0 讨论(0)
提交回复
热议问题