Ejemplo n.º 1
0
        public double HillClimb(ProblemDefinition problemObj)
        {
            double tResultImprovement = 0;

            if (CollisionList.Count > 0)
            {
                bool continueClimb;
                Individual original = new Individual(this, problemObj);
                original.Decode(problemObj);
                original.Evaluate(problemObj);

                int seeder = 7;
                Random rnd = new Random(seeder);

                int climbRetryCount = 0;
                do
                {
                    climbRetryCount++;
                    bool climb = HillClimber(problemObj, rnd);
                    if (climb)
                        return 0;
                    //HillClimberF22(problemObj, rnd,22);
                    Decode(problemObj);
                    Evaluate(problemObj);

                    var obj0Imp = original.Obj[0] - Obj[0];
                    var obj1Imp = original.Obj[1] - Obj[1];
                    var obj2Imp = original.Obj[2] - Obj[2];

                    if (obj0Imp + obj1Imp + obj2Imp == 0)
                    {
                        if (obj0Imp > 0)
                        {
                            original = new Individual(this, problemObj);
                            original.Decode(problemObj);
                            original.Evaluate(problemObj);
                        }
                        continueClimb = false;
                    }
                    else if (obj0Imp + obj1Imp + obj2Imp > 0)
                    {
                        continueClimb = false;
                        original = new Individual(this, problemObj);
                        original.Decode(problemObj);
                        original.Evaluate(problemObj);
                    }
                    else
                    {
                        continueClimb = false;
                    }

                    tResultImprovement += obj0Imp + obj1Imp + obj2Imp;

                } while (continueClimb && climbRetryCount < 10);

                if (tResultImprovement < 0) //todo check sanki geri almıyor.
                {
                    Copy(original, problemObj);
                    Decode(problemObj);
                    Evaluate(problemObj);
                    tResultImprovement = 0;
                }
            }
            return tResultImprovement;
        }