Example #1
0
        public Individ GetChild(Individ _parent, Curriculum _c)
        {
            Individ ResultingChild = (Individ)_parent.Clone();
            int     PeriodA, PeriodB;

            for (int RanInensityIndex = 0; RanInensityIndex < Parameters.SwapMutateIntensity;
                 RanInensityIndex++)
            {
                PeriodA = BasicFunctions.randomGenerator.Next(0, _c.noPeriods);
                PeriodB = this.getRandomPeriod(PeriodA, _c.noPeriods);

                Boolean preReq            = BasicFunctions.checkPrerequisites(_parent.Representation, _c);
                Boolean ChecMinMaxCredits = BasicFunctions.checkMinMaxCredit(_parent.PeriodCreditLoad, _c.maxCredits, _c.minCredits);
                Boolean ChecMinMaxCourses = BasicFunctions.checkMinMaxCourse(_parent.Representation, _c.maxCourses, _c.minCourses);
                Boolean CheckEvaluation   = BasicFunctions.checkFitnessMaximumLoad(_parent.Representation, _c, _parent.Evaluation);
                //Console.WriteLine(BasicFunctions.getSolutionDetails(_parent));

                ResultingChild = this.SwapCourses(PeriodA, PeriodB, _c, _parent);

                //Console.WriteLine(BasicFunctions.getSolutionDetails(ResultingChild));
                Boolean preReq2            = BasicFunctions.checkPrerequisites(ResultingChild.Representation, _c);
                Boolean ChecMinMaxCredits2 = BasicFunctions.checkMinMaxCredit(ResultingChild.PeriodCreditLoad, _c.maxCredits, _c.minCredits);
                Boolean ChecMinMaxCourses2 = BasicFunctions.checkMinMaxCourse(ResultingChild.Representation, _c.maxCourses, _c.minCourses);
                Boolean CheckEvaluation2   = BasicFunctions.checkFitnessMaximumLoad(ResultingChild.Representation, _c, ResultingChild.Evaluation);
            }



            return(ResultingChild);
        }
Example #2
0
        public Individ getRandomIndivid(Curriculum _c)
        {
            Individ RandomIndivid = new Individ(_c.noPeriods);

            // Step 1: Consider Prerequisits and MinMaxCourses constraints
            int[] InitialNoCoursePerPeriod = this.getInitialNoCoursePerPeriod(_c.courses.Count, _c.noPeriods);
            int   CourseID, PeriodStartIndex = 0;

            for (int CourseIndex = 0; CourseIndex < _c.courses.Count; CourseIndex++)
            {
                CourseID = _c.courses[CourseIndex].ID;
                List <int> RequiredCourses = _c.courses[CourseIndex].RequiredCourses;
                for (int PeriodIndex = PeriodStartIndex; PeriodIndex < _c.noPeriods; PeriodIndex++)
                {
                    if (RandomIndivid.Representation[PeriodIndex].Count < InitialNoCoursePerPeriod[PeriodIndex])
                    {
                        if (
                            RandomIndivid.PeriodCreditLoad[PeriodIndex] + _c.courses[CourseIndex].credit <= _c.maxCredits &&
                            !ContainsGroup(RandomIndivid.Representation[PeriodIndex], RequiredCourses)
                            )
                        {
                            RandomIndivid.Representation[PeriodIndex].Add(CourseID);
                            RandomIndivid.PeriodCreditLoad[PeriodIndex] += _c.courses[CourseIndex].credit;
                            break;
                        }
                    }
                    else
                    {
                        PeriodStartIndex++;
                    }
                }
            }

            //Step 2 :Incorporate randomness
            int PeriodA, PeriodB;

            for (int RanInensityIndex = 0; RanInensityIndex < Parameters.InitialSolutionRandomnessIntensity;
                 RanInensityIndex++)
            {
                PeriodA       = BasicFunctions.randomGenerator.Next(0, _c.noPeriods);
                PeriodB       = this.getRandomPeriod(PeriodA, _c.noPeriods);
                RandomIndivid = this.SwapCourses(PeriodA, PeriodB, _c, RandomIndivid);
            }

            //Step 3 :Consider MinMaxCredits constraint
            Boolean MinMaxCreditsConstraintFulfilled = false;

            while (!MinMaxCreditsConstraintFulfilled)
            {
                int PeriodCount = 0, RandomPeriod;
                for (int CurrentPeriod = 0; CurrentPeriod < _c.noPeriods; CurrentPeriod++)
                {
                    if (RandomIndivid.PeriodCreditLoad[CurrentPeriod] > _c.maxCredits ||
                        RandomIndivid.PeriodCreditLoad[CurrentPeriod] < _c.minCredits)
                    {
                        RandomPeriod  = this.getRandomPeriod(CurrentPeriod, _c.noPeriods);
                        RandomIndivid = this.SwapCourses(CurrentPeriod, RandomPeriod, _c, RandomIndivid);
                        break;
                    }
                    PeriodCount++;
                }
                if (PeriodCount == _c.noPeriods)
                {
                    MinMaxCreditsConstraintFulfilled = true;
                }
            }

            RandomIndivid.Evaluation = BasicFunctions.AssessFitnessMaximumLoad(RandomIndivid);

            Boolean preReq            = BasicFunctions.checkPrerequisites(RandomIndivid.Representation, _c);
            Boolean ChecMinMaxCredits = BasicFunctions.checkMinMaxCredit(RandomIndivid.PeriodCreditLoad, _c.maxCredits, _c.minCredits);
            Boolean ChecMinMaxCourses = BasicFunctions.checkMinMaxCourse(RandomIndivid.Representation, _c.maxCourses, _c.minCourses);
            Boolean CheckEvaluation   = BasicFunctions.checkFitnessMaximumLoad(RandomIndivid.Representation, _c, RandomIndivid.Evaluation);

            return(RandomIndivid);
        }
        public Individ Apply(Curriculum objCurriculum)
        {
            Individ Best = new Individ(objCurriculum.noPeriods);

            Individ[] P = Enumerable.Repeat(
                new Individ(objCurriculum.noPeriods), Parameters.popSize).ToArray();
            Individ[] Q = Enumerable.Repeat(
                new Individ(objCurriculum.noPeriods), Parameters.popSize).ToArray();
            for (int i = 0; i < Parameters.popSize; i++)
            {
                Individ currentIndivid = getRandomIndivid(objCurriculum);
                //Individ currentIndivid = iah.getRandomIndivid(objCurriculum);
                //Individ currentIndivid = ifa.getRandomIndivid(objCurriculum);

                Boolean preReq            = BasicFunctions.checkPrerequisites(currentIndivid.Representation, objCurriculum);
                Boolean ChecMinMaxCredits = BasicFunctions.checkMinMaxCredit(currentIndivid.PeriodCreditLoad, objCurriculum.maxCredits, objCurriculum.minCredits);
                Boolean ChecMinMaxCourses = BasicFunctions.checkMinMaxCourse(currentIndivid.Representation, objCurriculum.maxCourses, objCurriculum.minCourses);
                Boolean CheckEvaluation   = BasicFunctions.checkFitnessMaximumLoad(currentIndivid.Representation, objCurriculum, currentIndivid.Evaluation);
                P[i] = (Individ)currentIndivid.Clone();
            }

            Best = (Individ)P[0].Clone();

            int CurrentGeneration = 1;

            do
            {
                for (int i = 0; i < Parameters.popSize; i++)
                {
                    Boolean preReq            = BasicFunctions.checkPrerequisites(P[i].Representation, objCurriculum);
                    Boolean ChecMinMaxCredits = BasicFunctions.checkMinMaxCredit(P[i].PeriodCreditLoad, objCurriculum.maxCredits, objCurriculum.minCredits);
                    Boolean ChecMinMaxCourses = BasicFunctions.checkMinMaxCourse(P[i].Representation, objCurriculum.maxCourses, objCurriculum.minCourses);
                    Boolean CheckEvaluation   = BasicFunctions.checkFitnessMaximumLoad(P[i].Representation, objCurriculum, P[i].Evaluation);

                    if (P[i].Evaluation < Best.Evaluation)
                    {
                        Best = (Individ)P[i].Clone();;
                        Console.WriteLine("Current generation: " + CurrentGeneration);
                        Console.WriteLine(BasicFunctions.getSolutionDetails(Best));
                    }
                }
                for (int i = 0; i < Parameters.popSize; i += 2)
                {
                    Individ ParentA = BasicFunctions.GetBestParent(P);
                    Individ ParentB = BasicFunctions.GetBestParent(P);

                    Individ childA, childB;
                    if (SwapMutationOn)
                    {
                        childA = objSwapMutate.GetChild(ParentA, objCurriculum);
                        childB = objSwapMutate.GetChild(ParentB, objCurriculum);
                    }
                    else
                    {
                        Boolean preReq            = BasicFunctions.checkPrerequisites(ParentA.Representation, objCurriculum);
                        Boolean ChecMinMaxCredits = BasicFunctions.checkMinMaxCredit(ParentA.PeriodCreditLoad, objCurriculum.maxCredits, objCurriculum.minCredits);
                        Boolean ChecMinMaxCourses = BasicFunctions.checkMinMaxCourse(ParentA.Representation, objCurriculum.maxCourses, objCurriculum.minCourses);
                        Boolean CheckEvaluation   = BasicFunctions.checkFitnessMaximumLoad(ParentA.Representation, objCurriculum, ParentA.Evaluation);

                        childA = objShiftMutate.GetChild(ParentA, objCurriculum);

                        Boolean preReq2            = BasicFunctions.checkPrerequisites(childA.Representation, objCurriculum);
                        Boolean ChecMinMaxCredits2 = BasicFunctions.checkMinMaxCredit(childA.PeriodCreditLoad, objCurriculum.maxCredits, objCurriculum.minCredits);
                        Boolean ChecMinMaxCourses2 = BasicFunctions.checkMinMaxCourse(childA.Representation, objCurriculum.maxCourses, objCurriculum.minCourses);
                        Boolean CheckEvaluation2   = BasicFunctions.checkFitnessMaximumLoad(childA.Representation, objCurriculum, childA.Evaluation);

                        Boolean preReq3            = BasicFunctions.checkPrerequisites(ParentB.Representation, objCurriculum);
                        Boolean ChecMinMaxCredits3 = BasicFunctions.checkMinMaxCredit(ParentB.PeriodCreditLoad, objCurriculum.maxCredits, objCurriculum.minCredits);
                        Boolean ChecMinMaxCourses3 = BasicFunctions.checkMinMaxCourse(ParentB.Representation, objCurriculum.maxCourses, objCurriculum.minCourses);
                        Boolean CheckEvaluation3   = BasicFunctions.checkFitnessMaximumLoad(ParentB.Representation, objCurriculum, ParentB.Evaluation);

                        childB = objShiftMutate.GetChild(ParentB, objCurriculum);

                        Boolean preReq4            = BasicFunctions.checkPrerequisites(childB.Representation, objCurriculum);
                        Boolean ChecMinMaxCredits4 = BasicFunctions.checkMinMaxCredit(childB.PeriodCreditLoad, objCurriculum.maxCredits, objCurriculum.minCredits);
                        Boolean ChecMinMaxCourses4 = BasicFunctions.checkMinMaxCourse(childB.Representation, objCurriculum.maxCourses, objCurriculum.minCourses);
                        Boolean CheckEvaluation4   = BasicFunctions.checkFitnessMaximumLoad(childB.Representation, objCurriculum, childB.Evaluation);
                    }


                    Q[i]     = (Individ)childA.Clone();
                    Q[i + 1] = (Individ)childB.Clone();
                }

                P = (Individ[])Q.Clone();

                CurrentGeneration++;
                if (CurrentGeneration % (Parameters.MutationAlternationFrequency * Parameters.MaxGeneration) == 0)
                {
                    SwapMutationOn = !SwapMutationOn;
                }
            }while (CurrentGeneration <= Parameters.MaxGeneration);

            MessageBox.Show("Best solution details:\n" + BasicFunctions.getSolutionDetails(Best));

            return(Best);
        }
Example #4
0
        public Individ GetChild2(Individ parentA, Curriculum c)
        {
            //step 1: construct list of period loads
            int[] tempPeriodList        = new int[] { 0, 1, 2, 3, 4, 5, 6, 7 };
            int[] tempPeriodListCredits = (int[])parentA.PeriodCreditLoad.Clone();
            for (int i = 0; i < tempPeriodListCredits.Length - 1; i++)
            {
                for (int j = i + 1; j < tempPeriodListCredits.Length; j++)
                {
                    if (tempPeriodListCredits[i] < tempPeriodListCredits[j])
                    {
                        int temp = tempPeriodListCredits[i];
                        tempPeriodListCredits[i] = tempPeriodListCredits[j];
                        tempPeriodListCredits[j] = temp;

                        temp = tempPeriodList[i];
                        tempPeriodList[i] = tempPeriodList[j];
                        tempPeriodList[j] = temp;
                    }
                }
            }
            //start swaping by most and least loaded period
            int        left = 0, right = tempPeriodList.Length - 1;
            List <int> candidatePeriod1 = parentA.Representation[tempPeriodList[left]];
            List <int> candidatePeriod2 = parentA.Representation[tempPeriodList[right]];

            for (int i = 0; i < candidatePeriod1.Count; i++)
            {
                //krahasimi me mesataren e period load
                if (parentA.PeriodCreditLoad[tempPeriodList[right]] > parentA.PeriodCreditLoad[tempPeriodList[left]])
                {
                    break;
                }

                int candidateCourse = candidatePeriod1[i];
                parentA.Representation[tempPeriodList[left]].Remove(candidateCourse);
                parentA.Representation[tempPeriodList[right]].Add(candidateCourse);
                if (!BasicFunctions.checkPrerequisites(parentA.Representation, c) || !BasicFunctions.checkMinMaxCourse(parentA.Representation, c.maxCourses, c.minCourses) ||
                    !BasicFunctions.checkMinMaxCredit(parentA.PeriodCreditLoad, c.maxCredits, c.minCredits))
                {
                    parentA.Representation[tempPeriodList[right]].Remove(candidateCourse);
                    parentA.Representation[tempPeriodList[left]].Add(candidateCourse);
                }

                //update periodcreditload
                int s = 0;
                for (int k = 0; k < parentA.Representation[tempPeriodList[right]].Count; k++)
                {
                    s += c.courses[parentA.Representation[tempPeriodList[right]][k] - 1].credit;
                }
                parentA.PeriodCreditLoad[tempPeriodList[right]] = s;

                s = 0;
                for (int k = 0; k < parentA.Representation[tempPeriodList[left]].Count; k++)
                {
                    s += c.courses[parentA.Representation[tempPeriodList[left]][k] - 1].credit;
                }
                parentA.PeriodCreditLoad[tempPeriodList[left]] = s;
            }

            return(parentA);
        }