Beispiel #1
0
        public String makeSchedule(int day, int block)
        {
            // Create a list of employees sorted by the size of their availability blocks.
            // So if they have a large availability, they'll be added to the schedule last
            // and essentially given the worst schedule. X_x

            List<Employee>empDemand = new List<Employee>();
            List<Employee>tempEmp = new List<Employee>();

            foreach (Employee e in schedule.employeeList)
            {
                tempEmp.Add(e);
            }

            for (int i = 0; i < schedule.employeeList.Count; i++)
            {
                Employee lowest = new Employee();

                int j = 0;
                foreach (Employee e in tempEmp)
                {
                    if (j == 0)
                    {
                        lowest = e;
                    }
                    else if (e.getBlocks() < lowest.getBlocks())
                    {
                        lowest = e;

                    }
                    j++;
                }
                empDemand.Add(lowest);
                tempEmp.Remove(lowest);
            }

            // Now it goes through the sorted empDemand and adds the employees to the schedule where they fit
            // PROVIDED that their max hours isn't met for that day. After the day, the max hours is reset.
            int countBreak = 0;
            bool startedWork = false;
            bool alreadyWorked = false;
            foreach (Employee e in empDemand)
            {
                for (int i = 0; i < schedule.finalSchedule.Length; i++)
                {
                    for (int j = 0; j < schedule.finalSchedule[i].Length; j++)
                    {
                        if (schedule.openHours[i][j] == 1 && e.availability[i][j] == 1 && schedule.finalSchedule[i][j].Count < 3
                            && e.hoursAvTotal != 0 && alreadyWorked == false)
                        {
                            schedule.finalSchedule[i][j].Add(e);
                            e.hoursAvTotal--;
                            startedWork = true;
                        }
                        else if (startedWork == true)
                        {
                            countBreak++;
                        }
                        if (countBreak > 1)
                        {
                            alreadyWorked = true;
                        }
                    }
                    e.hoursAvTotal = 7;
                    startedWork = false;
                    alreadyWorked = false;
                    countBreak = 0;
                }
            }

            return schedule.printSchedule();
        }
Beispiel #2
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            // Create a writer and open the file
            //TextWriter tw = new StreamWriter("C:/schedule.txt");

            // Create several arrays, days (ever used?), schedule, and openHours.
            int[][] days = new int[7][];
            for (int i = 0; i < days.Length; i++)
            {
                days[i] = new int[24];
            }

            int[][] schedule = new int[7][];
            for (int i = 0; i < days.Length; i++)
            {
                schedule[i] = new int[24];
            }

            int[][] openHours = new int[7][];
            for (int i = 0; i < days.Length; i++)
            {
                openHours[i] = new int[24];
            }

            List<Employee>employeeList = new List<Employee>();

            // Input variables for open/close hours
            int openSun = 12;
            int closeSun = 24;
            int openMon = 7;
            int closeMon = 24;
            int openTue = 7;
            int closeTue = 24;
            int openWed = 7;
            int closeWed = 24;
            int openThu = 7;
            int closeThu = 24;
            int openFri = 7;
            int closeFri = 24;
            int openSat = 9;
            int closeSat = 18;
            // Employee availability times.
            // Input variables for employee 1 [morning guy]
            int emp1Sun1 = 0;
            int emp1Sun2 = 0;
            int emp1Mon1 = 7;
            int emp1Mon2 = 14;
            int emp1Tue1 = 7;
            int emp1Tue2 = 14;
            int emp1Wed1 = 7;
            int emp1Wed2 = 14;
            int emp1Thu1 = 7;
            int emp1Thu2 = 14;
            int emp1Fri1 = 7;
            int emp1Fri2 = 12;
            int emp1Sat1 = 0;
            int emp1Sat2 = 0;

            // Input variables for employee 3 [night guy]
            int emp3Sun1 = 14;
            int emp3Sun2 = 24;
            int emp3Mon1 = 14;
            int emp3Mon2 = 24;
            int emp3Tue1 = 14;
            int emp3Tue2 = 24;
            int emp3Wed1 = 14;
            int emp3Wed2 = 24;
            int emp3Thu1 = 14;
            int emp3Thu2 = 24;
            int emp3Fri1 = 14;
            int emp3Fri2 = 24;
            int emp3Sat1 = 0;
            int emp3Sat2 = 0;

            // Input variables for employee 5 [weekend mix guy]
            int emp5Sun1 = 7;
            int emp5Sun2 = 24;
            int emp5Mon1 = 5;
            int emp5Mon2 = 16;
            int emp5Tue1 = 5;
            int emp5Tue2 = 15;
            int emp5Wed1 = 1;
            int emp5Wed2 = 12;
            int emp5Thu1 = 1;
            int emp5Thu2 = 12;
            int emp5Fri1 = 1;
            int emp5Fri2 = 12;
            int emp5Sat1 = 7;
            int emp5Sat2 = 24;

            int maxShift = 10;
            int maxBreak = 1;

            //Make openHours array reflect input open hours variables.
            for (int i = 0; i< openHours[0].Length; i++)
            {
                if (i >= (openSun - 1) && i <= closeSun - 1)
                    openHours[0][i] = 1;
                if (i >= (openMon - 1) && i <= closeMon - 1)
                    openHours[1][i] = 1;
                if (i >= (openTue - 1) && i <= closeTue - 1)
                    openHours[2][i] = 1;
                if (i >= (openWed - 1) && i <= closeWed - 1)
                    openHours[3][i] = 1;
                if (i >= (openThu - 1) && i <= closeThu)
                    openHours[4][i] = 1;
                if (i >= (openFri - 1) && i <= closeFri)
                    openHours[5][i] = 1;
                if (i >= (openSat - 1) && i <= closeSat)
                    openHours[6][i] = 1;
            }

            // Create availability for employee
            int[][] availability1 = new int[7][];
            for (int i = 0; i < availability1.Length; i++)
            {
                availability1[i] = new int[24];
            }
            int[][] availability2 = new int[7][];
            for (int i = 0; i < availability2.Length; i++)
            {
                availability2[i] = new int[24];
            }
            int[][] availability3 = new int[7][];
            for (int i = 0; i < availability3.Length; i++)
            {
                availability3[i] = new int[24];
            }
            int[][] availability4 = new int[7][];
            for (int i = 0; i < availability4.Length; i++)
            {
                availability4[i] = new int[24];
            }
            int[][] availability5 = new int[7][];
            for (int i = 0; i < availability5.Length; i++)
            {
                availability5[i] = new int[24];
            }

            //Make openHours array reflect input open hours variables.
            for (int i = 0; i < availability1[0].Length; i++)
            {
                if (i >= (emp1Sun1 - 1) && i <= emp1Sun2 - 1)
                    availability1[0][i] = 1;
                if (i >= (emp1Mon1 - 1) && i <= emp1Mon2 - 1)
                    availability1[1][i] = 1;
                if (i >= (emp1Tue1 - 1) && i <= emp1Tue2 - 1)
                    availability1[2][i] = 1;
                if (i >= (emp1Wed1 - 1) && i <= emp1Wed2 - 1)
                    availability1[3][i] = 1;
                if (i >= (emp1Thu1 - 1) && i <= emp1Thu2)
                    availability1[4][i] = 1;
                if (i >= (emp1Fri1 - 1) && i <= emp1Fri2)
                    availability1[5][i] = 1;
                if (i >= (emp1Sat1 - 1) && i <= emp1Sat2)
                    availability1[6][i] = 1;
            }
            for (int i = 0; i < availability2[0].Length; i++)
            {
                if (i >= (emp3Sun1 - 1) && i <= emp3Sun2 - 1)
                    availability2[0][i] = 1;
                if (i >= (emp3Mon1 - 1) && i <= emp3Mon2 - 1)
                    availability2[1][i] = 1;
                if (i >= (emp3Tue1 - 1) && i <= emp3Tue2 - 1)
                    availability2[2][i] = 1;
                if (i >= (emp3Wed1 - 1) && i <= emp3Wed2 - 1)
                    availability2[3][i] = 1;
                if (i >= (emp3Thu1 - 1) && i <= emp3Thu2)
                    availability2[4][i] = 1;
                if (i >= (emp3Fri1 - 1) && i <= emp3Fri2)
                    availability2[5][i] = 1;
                if (i >= (emp3Sat1 - 1) && i <= emp3Sat2)
                    availability2[6][i] = 1;
            }
            for (int i = 0; i < availability3[0].Length; i++)
            {
                if (i >= (emp5Sun1 - 1) && i <= emp5Sun2 - 1)
                    availability3[0][i] = 1;
                if (i >= (emp5Mon1 - 1) && i <= emp5Mon2 - 1)
                    availability3[1][i] = 1;
                if (i >= (emp5Tue1 - 1) && i <= emp5Tue2 - 1)
                    availability3[2][i] = 1;
                if (i >= (emp5Wed1 - 1) && i <= emp5Wed2 - 1)
                    availability3[3][i] = 1;
                if (i >= (emp5Thu1 - 1) && i <= emp5Thu2)
                    availability3[4][i] = 1;
                if (i >= (emp5Fri1 - 1) && i <= emp5Fri2)
                    availability3[5][i] = 1;
                if (i >= (emp5Sat1 - 1) && i <= emp5Sat2)
                    availability3[6][i] = 1;
            }
            for (int i = 0; i < availability4[0].Length; i++)
            {
                if (i >= (15) && i <= 25)
                    availability4[0][i] = 1;
                if (i >= (18) && i <= 25)
                    availability4[1][i] = 1;
                if (i >= (18) && i <= 25)
                    availability4[2][i] = 1;
                if (i >= (18) && i <= 25)
                    availability4[3][i] = 1;
                if (i >= (0) && i <= 0)
                    availability4[4][i] = 1;
                if (i >= (16) && i <= 24)
                    availability4[5][i] = 1;
                if (i >= (0) && i <= 0)
                    availability4[6][i] = 1;
            }
            for (int i = 0; i < availability5[0].Length; i++)
            {
                if (i >= (11) && i <= 24)
                    availability5[0][i] = 1;
                if (i >= (10) && i <= 16)
                    availability5[1][i] = 1;
                if (i >= (16) && i <= 20)
                    availability5[2][i] = 1;
                if (i >= (10) && i <= 18)
                    availability5[3][i] = 1;
                if (i >= (6) && i <= 24)
                    availability5[4][i] = 1;
                if (i >= (6) && i <= 24)
                    availability5[5][i] = 1;
                if (i >= (0) && i <= 24)
                    availability5[6][i] = 1;
            }

            int employeeCount = 0;
            Employee zachadams = new Employee("Zach Adams", 7, availability3, false, employeeCount);
            Employee nichadams = new Employee("Nich Adams", 7, availability1, false, employeeCount);
            Employee remibarron = new Employee("Remi Barron", 7, availability3, false, employeeCount);
            Employee scottbigler = new Employee("Scott Bigler", 14, availability2, false, employeeCount);
            Employee jakebarton = new Employee("Jake Barton", 7, availability1, false, employeeCount);
            Employee ryanegan = new Employee("Ryan Egan", 7, availability4, false, employeeCount);
            Employee garylowe = new Employee("Gary Lowe", 7, availability2, false, employeeCount);
            Employee loganfrerer = new Employee("Logan Frerer", 7, availability5, false, employeeCount);
            Employee lexibelle = new Employee("Lexi Belle", 7, availability2, false, employeeCount);
            Employee peterwallace = new Employee("Peter Wallace", 14, availability1, false, employeeCount);
            employeeCount++;
            employeeList.Add(zachadams);
            employeeList.Add(nichadams);
            employeeList.Add(remibarron);
            employeeList.Add(scottbigler);
            employeeList.Add(jakebarton);
            employeeList.Add(ryanegan);
            employeeList.Add(peterwallace);
            employeeList.Add(garylowe);
            employeeList.Add(loganfrerer);
            employeeList.Add(lexibelle);

            int zach = zachadams.getBlocks();
            int scott = scottbigler.getBlocks();

            Schedule schedule1 = new Schedule(openHours, maxShift, maxBreak, employeeList);

            ScheduleGreed scheduleGreed1 = new ScheduleGreed(schedule1);
            Console.Out.WriteLine(scheduleGreed1.makeSchedule(0, 0));

            //ScheduleMaker scheduleMaker1 = new ScheduleMaker(schedule1, tw);

            //scheduleMaker1.makeSchedule(0, 0);

            //tw.Write(scheduleMaker1.makeSchedule(0, 22));
            //Console.Out.WriteLine(scheduleMaker1.makeSchedule(0, 23));

            //tw.Close();

            while(true)
            {
            }
        }
Beispiel #3
0
        public Employee[] createSchedule2()
        {
            if (isPossibleSchedule())
            {
                EmployeeQueue    eq          = new EmployeeQueue(roster);
                Queue <Employee> queue       = eq.queueRandom(r);
                long             brokenCount = 0;

                for (int w = 0; w < getWorkWeek(); w++)
                {
                    for (int p = 0; p < allPositions.Length; p++)
                    {
                        for (int l = 0; l < shiftTimes.Length; l++)
                        {
                            for (int z = 0; z < peoplePerShift()[w, p]; z++)
                            {
                                bool shiftFilled  = false;
                                bool checkDoubles = false;
                                do
                                {
                                    Employee tempEmployee = queue.Dequeue();
                                    if (tempEmployee.getName().Equals("Alex Four"))
                                    {
                                        shiftFilled = false;
                                        int a = 1;
                                        a++;
                                    }
                                    if (tempEmployee.canWork(w, shiftTimes[l], allPositions[p], checkDoubles, weekHours[p]))
                                    {
                                        foreach (Employee e in roster)
                                        {
                                            if (e.getName().Equals(tempEmployee.getName()))
                                            {
                                                e.setSchedule(w, shiftTimes[l], allPositions[p]);
                                                shiftFilled = true;
                                            }
                                        }
                                    }
                                    if (queue.Count == 0 && !shiftFilled)
                                    {
                                        brokenCount++;
                                        if (brokenCount > 1000)
                                        {
                                            return(null);
                                        }
                                        queue        = eq.queueRandom(r);
                                        checkDoubles = true;
                                        int b = 0;
                                        int totalEmployeesPosition = 0;
                                        foreach (Employee e in roster)
                                        {
                                            int a = 0;
                                            foreach (String positions in e.getPositions())
                                            {
                                                if (positions.Equals(allPositions[p]))
                                                {
                                                    totalEmployeesPosition++;
                                                    foreach (String s in e.getWorkSchedule())
                                                    {
                                                        if (!s.Equals("None"))
                                                        {
                                                            a += s.Split('/').Length;
                                                            if (a == weekHours[p])
                                                            {
                                                                b++;
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        if (b == totalEmployeesPosition)
                                        {
                                            weekHours[p]++;
                                        }
                                    }
                                    if (shiftFilled)
                                    {
                                        queue = eq.queueRandom(r);
                                    }
                                } while (!shiftFilled);
                            }
                        }
                    }
                }
            }
            return(roster);
        }