public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();
            int classCounter;

            for (int day = 0; day < 6; day++)
            {
                classCounter = 0;
                if (sched[day].Count == 0)
                {
                    continue;
                }

                foreach (var group in Configuration.Instance.Groups)
                {
                    foreach (var classs in sched[day][group])
                    {
                        if (prof == classs.Course.Professor)
                        {
                            classCounter++;
                        }
                    }
                }

                if (classCounter > classLimit)
                {
                    pass = false;
                    string error = string.Format("Professor class per day count exceeds limit of {0}: professor {1} has {2} classes on day {3}",
                        classLimit, prof, classCounter, day);
                    errorContainer.AppendLine(error);
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString());
        }
        public ConstraintResult Check(Schedule sched)
        {

            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();
            
            foreach (var req in requirements)
            {
                int day = req.Day;

                if (sched[day].Count == 0)
                {
                    continue;
                }
                foreach (var group in Configuration.Instance.Groups)
                {
                    foreach (var classs in sched[day][group])
                    {
                        if (classs.Course.Professor == req.Professor)
                        {
                            TimeSpan classStart = sched.GetStartTimeForClass(day, group, classs);
                            TimeSpan classEnd = classStart + classs.Length;
                            if ((classStart >= req.Start && classStart <= req.End) || (classEnd >= req.Start && classEnd <= req.End))
                            {
                                pass = false;
                                string error = string.Format("Conflict: professor {0} does not want to work on {3} between {1:hh\\:mm}-{2:hh\\:mm}",
                                    req.Professor, classStart, classEnd, ConversionServices.GetDayNameFromDayNumber(req.Day));
                                errorContainer.AppendLine(error);
                            }
                        }
                    }
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString().Trim());
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();

            for (int day = 0; day < 6; day++)
            {
                if (sched[day].Count == 0)
                {
                    continue;
                }
                foreach (var group in Configuration.Instance.Groups)
                {
                    foreach (var classs in sched[day][group])
                    {
                        if (classs.Course.Professor == prof)
                        {
                            TimeSpan classStart = sched.GetStartTimeForClass(day, group, classs);
                            TimeSpan classEnd = classStart + classs.Length;
                            if( (classStart>=start && classStart<=end) || (classEnd>=start && classEnd<=end) ){
                                pass = false;
                                string error = string.Format("Professor Time Off conflict: professor {0} conflicts between {1}-{2}",
                                    prof, classStart, classEnd);
                                errorContainer.AppendLine(error);
                            }
                        }
                    }
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString());
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();
            int classCounter;
            
            for (int day = 0; day < 6; day++) 
            {
                classCounter = 0;
                if (sched[day].Count == 0)
                {
                    continue;
                }

                foreach (var group in Configuration.Instance.Groups)
                {
                    foreach (var classs in sched[day][group])
                    {
                        if (prof == classs.Course.Professor)
                        {
                            classCounter++;
                        }
                    }
                }

                if (classCounter > classLimit)
                {
                    pass = false;
                    string error = string.Format("Conflict: professor {0} has {1} classes on {2}, instead of {3}",
                        prof, classCounter, ConversionServices.GetDayNameFromDayNumber(day) , classLimit);
                    errorContainer.AppendLine(error);
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString().Trim());
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();

            foreach (int day in off)
            {
                if (sched[day].Count == 0)
                {
                    continue;
                }
                foreach(var group in Configuration.Instance.Groups)
                {
                    foreach (var classs in sched[day][group])
                    {
                        if (classs.Course.Professor == prof)
                        {
                            pass = false;
                            string error = string.Format("Professor Days Off conflict: professor {0} conflicts in day {1}",
                                prof, day);
                            errorContainer.AppendLine(error);
                        }
                    }
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString());
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();

            foreach (int day in off)
            {
                if (sched[day].Count == 0)
                {
                    continue;
                }
                foreach(var group in Configuration.Instance.Groups)
                {
                    foreach (var classs in sched[day][group])
                    {
                        if (classs.Course.Professor == prof)
                        {
                            pass = false;
                            string error = string.Format("Conflict: professor {0} does not want to work on {1}",
                                prof, ConversionServices.GetDayNameFromDayNumber(day));
                            errorContainer.AppendLine(error);
                        }
                    }
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString().Trim());
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();
            for (int day = 0; day < 6; day++)
            {
                if (sched[day].Count == 0)
                {
                    continue;
                }

                foreach (var group in Configuration.Instance.Groups)
                {
                    int ClassCount = sched[day][group].Count;
                    if (ClassCount > classLimit)
                    {
                        pass = false;
                        string error = string.Format("Class count exceeds limit of {0}: group {1} has {2} classes on day {3}",
                            classLimit, group.Name, ClassCount, day);
                        errorContainer.AppendLine(error);
                    }
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString());
        }
예제 #8
0
        public DaysModel()
        {
            Application.Current.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Current_DispatcherUnhandledException);
            CurrentSchedule = new Schedule();
            var conf = Configuration.Instance;

            InitializeSchedule();
            conf.Groups.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Groups_CollectionChanged);
            EvaluateConstraints();
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();
            for (int day = 0; day < 6; day++)
            {
                if (sched[day].Count == 0)
                {
                    continue;
                }
                for (int groupN = 0; groupN < Configuration.Instance.Groups.Count - 1; groupN++)
                {
                    var group = Configuration.Instance.Groups[groupN];

                    for (int classsN = 0; classsN < sched[day][group].Count; classsN++)
                    {
                        int groupN2 = groupN + 1;
                        while (groupN2 < Configuration.Instance.Groups.Count)
                        {
                            var group2 = Configuration.Instance.Groups[groupN2];
                            if (sched[day][group].Count != 0 && sched[day][group2].Count != 0)
                            {
                                var classs = sched[day][group][classsN];
                                var classs2 = sched[day][group2][classsN];

                                if (classs.Course.Professor == classs2.Course.Professor)
                                {
                                    var start1 = sched.GetStartTimeForClass(day, group, classs);
                                    var start2 = sched.GetStartTimeForClass(day, group2, classs2);
                                    var end1 = start1 + classs.Length;
                                    var end2 = start2 + classs2.Length;
                                    if (end1 >= start2 && start2 <= end1 && end1 <= end2)
                                    {
                                        pass = false;
                                        string error = string.Format("Professor conflict: professor {0} conflicts between group {1} and group {2} in day {3}",
                                            classs.Course.Professor, group, group2, day);
                                        errorContainer.AppendLine(error);
                                    }
                                }
                            }
                            groupN2++;
                        }

                    }
                }
            }
            return new ConstraintResult(pass, errorContainer.ToString());
        }
        public ConstraintResult Check(Schedule sched)
        {
            bool pass = true;
            StringBuilder errorContainer = new StringBuilder();
            for (int day = 0; day < 6; day++) 
            {
                if (sched[day].Count == 0)
                {
                    continue;
                }

                foreach (var group in Configuration.Instance.Groups)
                {
                    Dictionary<Course, int> courseCounter = new Dictionary<Course, int>();
                    
                    for (int classN=0 ; classN < sched[day][group].Count; classN++){
                        
                        var currentCourse = sched[day][group][classN].Course;

                        if (courseCounter.ContainsKey(currentCourse))
                        {
                            courseCounter[currentCourse]++;
                        }
                        else
                        {
                            courseCounter.Add(currentCourse, 1);
                        }
                    }
                    foreach (var aClass in courseCounter)
                    {
                        if (aClass.Value > classLimit && aClass.Key.Name != "Break")
                        {
                            pass = false;
                            string error = string.Format("Conflict: group {0} has {1} {2} classes on {3}, insted of <= {4}",
                                group.Name, aClass.Value, aClass.Key.Name ,ConversionServices.GetDayNameFromDayNumber(day), classLimit);
                            errorContainer.AppendLine(error);
                        }
                    }
                }
               
                
            }
            return new ConstraintResult(pass, errorContainer.ToString().Trim());
        }
 public ConstraintResult Check(Schedule aSchedule)
 {
     return new ConstraintResult(false, "Constraint not implemented yet. And not gonna");
 }
예제 #12
0
        private void TestRoomTimeOverlap3()
        {
            config.Clear();

            Stopwatch s = new Stopwatch();

            var mitov = new Professor("Kiril Mitov");
            var abrama = new Professor("Janet Abramowitch");

            var r12 = new Room("12", CourseType.NormalCourse);
            var r24 = new Room("24", CourseType.NormalCourse);
            var r32 = new Room("32", CourseType.ComputerCourse);

            var g11a = new StudentGroup("11A");
            var g11g = new StudentGroup("11G");

            var tp = new Course("TP", mitov, CourseType.ComputerCourse);
            var maths = new Course("Maths", abrama, CourseType.NormalCourse);

            var tp11a = new Class(g11a, tp, new TimeSpan(1, 20, 0), r32);
            var math11g = new Class(g11g, maths, new TimeSpan(2, 0, 0), r32);

            config.Rooms.Add(r12);
            config.Rooms.Add(r24);
            config.Rooms.Add(r32);

            config.Groups.Add(g11a);
            config.Groups.Add(g11g);

            config.Professors.Add(mitov);
            config.Professors.Add(abrama);

            config.Courses.Add(tp);
            config.Courses.Add(maths);

            Schedule sched = new Schedule();
            for (int i = 0; i < 7; i++)
            {
                sched.SetStartTime(i, g11a, new TimeSpan(8, 0, 0));
                sched.SetStartTime(i, g11g, new TimeSpan(10, 0, 0));
            }
            sched[0][g11a] = new ObservableCollection<Class>();
            sched[0][g11g] = new ObservableCollection<Class>();

            sched[0][g11a].Add(tp11a);//11A class has TP from 8AM to 9:20AM in room 32
            sched[0][g11g].Add(math11g);//11G class has Maths from 10AM to 12AM in room 32
            //result should be true, rooms do not conflict
            s.Start();
            IConstraint c = new RoomTimeOverlapConstraint();
            var result = c.Check(sched);
            s.Stop();

            string pass = result.ConstraintFulfilled == true ? "succeeded" : "failed";
            Console.WriteLine("TestRoomTimeOverlap3() " + pass);
            Console.WriteLine(result.ErrorMessage);
            Console.WriteLine("{0} ms.", s.ElapsedMilliseconds);
        }
예제 #13
0
        private void TestProfessorDayAndTimeOff()
        {
            config.Clear();

            Stopwatch s = new Stopwatch();

            var mitov = new Professor("Kiril Mitov");
            var abrama = new Professor("Janet Abramowitch");

            var r12 = new Room("12", CourseType.NormalCourse);
            var r24 = new Room("24", CourseType.NormalCourse);
            var r32 = new Room("32", CourseType.ComputerCourse);

            var g11a = new StudentGroup("11A");
            var g11g = new StudentGroup("11G");

            var tp = new Course("TP", mitov, CourseType.ComputerCourse);
            var maths = new Course("Maths", abrama, CourseType.NormalCourse);

            var tp11a = new Class(g11a, tp, new TimeSpan(1, 20, 0), r32);
            var tp11g = new Class(g11g, tp, new TimeSpan(1, 20, 0), r24);

            config.Rooms.Add(r12);
            config.Rooms.Add(r24);
            config.Rooms.Add(r32);

            config.Groups.Add(g11a);
            config.Groups.Add(g11g);

            config.Professors.Add(mitov);
            config.Professors.Add(abrama);

            config.Courses.Add(tp);
            config.Courses.Add(maths);

            Schedule sched = new Schedule();
            for (int i = 0; i < 7; i++)
            {
                sched.SetStartTime(i, g11a, new TimeSpan(8, 0, 0));
                sched.SetStartTime(i, g11g, new TimeSpan(9, 35, 0));
            }
            sched[0][g11a] = new ObservableCollection<Class>();
            sched[0][g11g] = new ObservableCollection<Class>();

            sched[0][g11a].Add(tp11a);//11A class has TP from 8AM to 9:20AM in room 32 on monday
            sched[0][g11g].Add(tp11g);//11G class has TP from 9:35AM to 10:55AM in room 24 on monday
            //result should be false as professor day conflict
            TimeSpan start = new TimeSpan(9, 30, 0);
            TimeSpan end = new TimeSpan(16, 20, 0);
            List<TimeDayRequirement> prevents = new List<TimeDayRequirement>();
            TimeDayRequirement aPrevent = new TimeDayRequirement(mitov, 0, start, end);
            prevents.Add(aPrevent);
            s.Start();
            IConstraint c = new ProfessorDayAndTimeConstraint(prevents);
            var result = c.Check(sched);
            s.Stop();

            string pass = result.ConstraintFulfilled == false ? "succeeded" : "failed";
            Console.WriteLine("TestProfessorDayAndTimeConstraint() " + pass);
            Console.WriteLine(result.ErrorMessage);
            Console.WriteLine("{0} ms.", s.ElapsedMilliseconds);
        }
 public ConstraintResult Check(Schedule aSchedule)
 {
     return new ConstraintResult(false, "Nothing to do here!");
 }
        void InitializeSchedule()
        {
            Conflicts = new ObservableCollection<ConstraintResult>();

            Configuration.Instance.Groups = new ObservableCollection<StudentGroup>();
            Configuration.Instance.Groups.Add(new StudentGroup("11A"));
            Configuration.Instance.Groups.Add(new StudentGroup("11B"));
            Configuration.Instance.Groups.Add(new StudentGroup("11V"));
            Configuration.Instance.Groups.Add(new StudentGroup("11G"));
            Configuration.Instance.Professors = new ObservableCollection<Professor>{new Professor("Abramowitch"),
                new Professor("Mitova"), new Professor("Mitov")};
            Configuration.Instance.Courses = new ObservableCollection<Course>
                {new Course("Maths", Configuration.Instance.Professors[0], CourseType.NormalCourse),
                new Course("BEL", Configuration.Instance.Professors[1], CourseType.NormalCourse), 
                new Course("TP", Configuration.Instance.Professors[2], CourseType.ComputerCourse),
                new Course("Break", Professor.Empty, CourseType.Break)};
            Configuration.Instance.Rooms = new ObservableCollection<Room>{new Room("42", CourseType.NormalCourse), new Room("21", CourseType.NormalCourse),
                new Room("34", CourseType.ComputerCourse)};

            Configuration.Instance.Constraints.Add(new AllProfessorsDayLimitConstraint("PREDEFINED", 9));
            Configuration.Instance.Constraints.Add(new ClassCountDayLimitConstraint("PREDEFINED", 3));
            Configuration.Instance.Constraints.Add(new ProfessorDayAndTimeConstraint("PREDEFINED", new List<TimeDayRequirement>
                {
                    new TimeDayRequirement(Configuration.Instance.Professors[0], 2, new TimeSpan(8,0,0), new TimeSpan(9,0,0)),
                    new TimeDayRequirement(Configuration.Instance.Professors[1], 3, new TimeSpan(9,0,0), new TimeSpan(10,0,0))
                }
            ));

            Configuration.Instance.Constraints.Add(new ProfessorDayConstraint("PREDEFINED", Configuration.Instance.Professors[0], new List<int> { 0, 1 }));
            Configuration.Instance.Constraints.Add(new ProfessorTimeConstraint("PREDEFINED", Configuration.Instance.Professors[0], new TimeSpan(9, 0, 0), new TimeSpan(10, 0, 0)));
            Configuration.Instance.Constraints.Add(new ProfessorTimeOverlapConstraint("PREDEFINED"));
            Configuration.Instance.Constraints.Add(new RoomTimeOverlapConstraint("PREDEFINED"));
            Configuration.Instance.Constraints.Add(new SingleProfessorDayLimitConstraint("PREDEFINED", Configuration.Instance.Professors[2], 4));

            var groups = Configuration.Instance.Groups;
            var courses = Configuration.Instance.Courses;
            var rooms = Configuration.Instance.Rooms;
            var profs = Configuration.Instance.Professors;
            var classes = Configuration.Instance.Classes;
            CurrentSchedule = new Schedule();
            for(int i = 0;i<7;i++)
            {
                CurrentSchedule[i][groups[0]] = new ObservableCollection<Class>();
                CurrentSchedule[i][groups[1]] = new ObservableCollection<Class>();
                CurrentSchedule[i][groups[2]] = new ObservableCollection<Class>();
                CurrentSchedule[i][groups[3]] = new ObservableCollection<Class>();
                CurrentSchedule.SetStartTime(i, groups[0], TimeSpan.FromHours(8));
                CurrentSchedule.SetStartTime(i, groups[1], TimeSpan.FromHours(8));
                CurrentSchedule.SetStartTime(i, groups[2], TimeSpan.FromHours(8));
                CurrentSchedule.SetStartTime(i, groups[3], TimeSpan.FromHours(8));
            }
            CurrentSchedule.DaysChangedGroupAdded(groups[0]);
            CurrentSchedule.DaysChangedGroupAdded(groups[1]);
            CurrentSchedule.DaysChangedGroupAdded(groups[2]);
            CurrentSchedule.DaysChangedGroupAdded(groups[3]);
            classes.Add(groups[0], new TrulyObservableCollection<ClassContainer>());
            classes.Add(groups[1], new TrulyObservableCollection<ClassContainer>());
            classes.Add(groups[2], new TrulyObservableCollection<ClassContainer>());
            classes.Add(groups[3], new TrulyObservableCollection<ClassContainer>());
            classes[groups[0]].Add(new ClassContainer(new Class(groups[0], courses[3], TimeSpan.FromMinutes(40), Room.Empty), 1000));
            classes[groups[0]].Add(new ClassContainer(new Class(groups[0], courses[0], TimeSpan.FromMinutes(80), rooms[1]), 10));
            classes[groups[0]].Add(new ClassContainer(new Class(groups[0], courses[1], TimeSpan.FromMinutes(80), rooms[0]), 4));
            classes[groups[0]].Add(new ClassContainer(new Class(groups[0], courses[2], TimeSpan.FromMinutes(80), rooms[2]), 5));
            classes[groups[1]].Add(new ClassContainer(new Class(groups[1], courses[0], TimeSpan.FromMinutes(80), rooms[1]), 2));
            classes[groups[1]].Add(new ClassContainer(new Class(groups[1], courses[1], TimeSpan.FromMinutes(80), rooms[0]), 6));
            classes[groups[1]].Add(new ClassContainer(new Class(groups[1], courses[2], TimeSpan.FromMinutes(80), rooms[2]), 4));
            classes[groups[2]].Add(new ClassContainer(new Class(groups[2], courses[0], TimeSpan.FromMinutes(80), rooms[1]), 2));
            classes[groups[2]].Add(new ClassContainer(new Class(groups[2], courses[1], TimeSpan.FromMinutes(80), rooms[0]), 6));
            classes[groups[2]].Add(new ClassContainer(new Class(groups[2], courses[2], TimeSpan.FromMinutes(80), rooms[2]), 4));
            classes[groups[3]].Add(new ClassContainer(new Class(groups[3], courses[0], TimeSpan.FromMinutes(80), rooms[1]), 2));
            classes[groups[3]].Add(new ClassContainer(new Class(groups[3], courses[1], TimeSpan.FromMinutes(80), rooms[0]), 6));
            classes[groups[3]].Add(new ClassContainer(new Class(groups[3], courses[2], TimeSpan.FromMinutes(80), rooms[2]), 4));
        }