Пример #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);
        }
        public Individ GetChild(Individ _parent, Curriculum _c)
        {
            Individ ResultingChild = (Individ)_parent.Clone();

            for (int RanInensityIndex = 0; RanInensityIndex < Parameters.ShiftMutateIntensity;
                 RanInensityIndex++)
            {
                //Boolean preReq4 = BasicFunctions.checkPrerequisites(ResultingChild.Representation, _c);
                int[] ShiftingSolution  = this.getShiftingSolution(_c, ResultingChild);
                int   OriginePeriod     = ShiftingSolution[0];
                int   CourseID          = ShiftingSolution[1];
                int   DestinationPeriod = ShiftingSolution[2];
                if (CourseID != 0)
                {
                    ResultingChild.Representation[OriginePeriod].Remove(CourseID);
                    ResultingChild.Representation[DestinationPeriod].Add(CourseID);

                    ResultingChild.PeriodCreditLoad[OriginePeriod]     -= _c.courses[CourseID - 1].credit;
                    ResultingChild.PeriodCreditLoad[DestinationPeriod] += _c.courses[CourseID - 1].credit;
                    ResultingChild.Evaluation = BasicFunctions.AssessFitnessMaximumLoad(ResultingChild);
                    //Boolean preReq5 = BasicFunctions.checkPrerequisites(ResultingChild.Representation, _c);
                }
            }
            return(ResultingChild);
        }
        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);
        }
Пример #4
0
        public Individ SwapCourses(int CurrentPeriod, int MinMaxCreditLoadPeriod,
                                   Curriculum _c, Individ _individ)
        {
            Individ    ResultingIndivid = (Individ)_individ.Clone();
            int        LeftPeriodIndex, RightPeriodIndex;
            List <int> LeftPeriodSwapCandidates, RightPeriodSwapCandidates;

            if (CurrentPeriod < MinMaxCreditLoadPeriod)
            {
                LeftPeriodIndex  = CurrentPeriod;
                RightPeriodIndex = MinMaxCreditLoadPeriod;
            }
            else
            {
                LeftPeriodIndex  = MinMaxCreditLoadPeriod;
                RightPeriodIndex = CurrentPeriod;
            }
            LeftPeriodSwapCandidates =
                this.getLeftPeriodSwapCandidates(_c, ResultingIndivid.Representation,
                                                 LeftPeriodIndex, RightPeriodIndex);
            RightPeriodSwapCandidates =
                this.getRightPeriodSwapCandidates(_c, ResultingIndivid.Representation,
                                                  LeftPeriodIndex, RightPeriodIndex);
            if (LeftPeriodSwapCandidates.Count > 0 && RightPeriodSwapCandidates.Count > 0)
            {
                List <int> RandomLeftList  = BasicFunctions.getRandomCourseList(LeftPeriodSwapCandidates);
                List <int> RandomRightList = BasicFunctions.getRandomCourseList(RightPeriodSwapCandidates);
                for (int IL = 0; IL < RandomLeftList.Count; IL++)
                {
                    int LeftListCourseID = RandomLeftList[IL];
                    for (int IR = 0; IR < RandomRightList.Count; IR++)
                    {
                        int RightListCourseID = RandomRightList[IR];

                        int LeftPeriodForeseenCreditLoad = ResultingIndivid.PeriodCreditLoad[LeftPeriodIndex] +
                                                           _c.courses[RightListCourseID - 1].credit - _c.courses[LeftListCourseID - 1].credit;
                        int RightPeriodForeseenCreditLoad = ResultingIndivid.PeriodCreditLoad[RightPeriodIndex] +
                                                            _c.courses[LeftListCourseID - 1].credit - _c.courses[RightListCourseID - 1].credit;

                        bool LeftPeriodCreditLoadFeasible  = LeftPeriodForeseenCreditLoad >= _c.minCredits && LeftPeriodForeseenCreditLoad <= _c.maxCredits;
                        bool RightPeriodCreditLoadFeasible = RightPeriodForeseenCreditLoad >= _c.minCredits && RightPeriodForeseenCreditLoad <= _c.maxCredits;
                        if (LeftPeriodCreditLoadFeasible && RightPeriodCreditLoadFeasible)
                        {
                            ResultingIndivid.Representation[LeftPeriodIndex].Remove(LeftListCourseID);
                            ResultingIndivid.Representation[LeftPeriodIndex].Add(RightListCourseID);
                            ResultingIndivid.Representation[RightPeriodIndex].Remove(RightListCourseID);
                            ResultingIndivid.Representation[RightPeriodIndex].Add(LeftListCourseID);

                            ResultingIndivid.PeriodCreditLoad[LeftPeriodIndex] +=
                                (_c.courses[RightListCourseID - 1].credit -
                                 _c.courses[LeftListCourseID - 1].credit);

                            ResultingIndivid.PeriodCreditLoad[RightPeriodIndex] +=
                                (_c.courses[LeftListCourseID - 1].credit -
                                 _c.courses[RightListCourseID - 1].credit);
                            goto ReturnIndivid;
                        }
                    }
                }
            }

ReturnIndivid:
            ResultingIndivid.Evaluation = BasicFunctions.AssessFitnessMaximumLoad(ResultingIndivid);
            return(ResultingIndivid);
        }