Esempio n. 1
0
        void Optimize_SteepestAscent()
        {
            bool stuck = false;

            P         = problem.GenerateFixSolution();
            P.Fitness = problem.Fitness(P);

            t = 0;
            while (!stuck && !StoppingCondition())
            {
                SmallestBoundaryPolygon.Solution q = problem.BestNeighbor(P, Epsilon);
                q.Fitness = problem.Fitness(q);

                float deltaE = (float)q.Fitness - (float)P.Fitness;

                if (deltaE < 2)
                {
                    P = SmallestBoundaryPolygon.Solution.Copy(q);

                    Logol(t + ": BEST: " + p.Fitness, p);
                }
                else
                {
                    stuck = true;
                }
                NewSolution(P, null);
                t++;
            }
        }
Esempio n. 2
0
        void Optimize_RandomRestart()
        {
            List <SmallestBoundaryPolygon.Solution> V = new List <SmallestBoundaryPolygon.Solution>();


            t = 0;
            while (!StoppingCondition())
            {
                bool ok;
                do
                {
                    ok = true;
                    P  = problem.GenerateRandomSolution();

                    foreach (var sol in V)
                    {
                        if (P.SolutionsEquals(sol))
                        {
                            ok = false;
                            break;
                        }
                    }
                } while (!ok);

                P.Fitness = problem.Fitness(P);
                if (P_opt == null)
                {
                    P_opt = SmallestBoundaryPolygon.Solution.Copy(P);
                }
                bool stuck = false;

                while (!stuck && !StoppingCondition())
                {
                    SmallestBoundaryPolygon.Solution q = problem.BestNeighbor(P, Epsilon);
                    q.Fitness = problem.Fitness(q);
                    float deltaE = (float)q.Fitness - (float)P.Fitness;

                    if (deltaE < 0)
                    {
                        P = SmallestBoundaryPolygon.Solution.Copy(q);
                        V.Add(q);
                        if (P_opt.Fitness > P.Fitness)
                        {
                            P_opt = SmallestBoundaryPolygon.Solution.Copy(P);
                        }
                        Logol(t + ": BEST: " + p.Fitness, p);
                    }
                    else
                    {
                        stuck = true;
                    }
                    NewSolution(P_opt, P);
                }



                t++;
            }
        }
Esempio n. 3
0
        void Optimize()
        {
            stop      = false;
            P         = problem.GenerateFixSolution();
            P.Fitness = problem.Fitness(P);


            P_opt = SmallestBoundaryPolygon.Solution.Copy(P);

            t = 0;
            while (!StoppingCondition())
            {
                //Thread.Sleep(5);
                //get random neighbor
                SmallestBoundaryPolygon.Solution q = problem.RandomNeighbor(P, Epsilon);
                q.Fitness = problem.Fitness(q);

                float deltaE = (float)q.Fitness - (float)P.Fitness;

                if (deltaE < 0)
                {
                    P = SmallestBoundaryPolygon.Solution.Copy(q);

                    if (P.Fitness < P_opt.Fitness)
                    {
                        //New Optimal
                        P_opt = SmallestBoundaryPolygon.Solution.Copy(P);
                        Logol("--------\n Iteration: " + t + ", Temperature: " + Temperature().ToString());
                        Logol("BEST: " + P_opt.Fitness, P_opt);
                    }
                }
                else
                {
                    float  T    = Temperature();
                    double rand = r.NextDouble();
                    //Logol("random: " + rand + ", P: " + AcceptanceProbability(deltaE, T).ToString("0.0000"));
                    if (rand < AcceptanceProbability(deltaE, T))
                    {
                        P = SmallestBoundaryPolygon.Solution.Copy(q);
                        Logol("random OK", q);
                    }
                }
                NewSolution(P_opt, q);
                t++;
            }
        }
Esempio n. 4
0
 void Logol(string ss, SmallestBoundaryPolygon.Solution s)
 {
     try
     {
         using (var fileStream = new FileStream("log_SMP_SA.txt", FileMode.Append))
             using (var streamWriter = new StreamWriter(fileStream))
             {
                 streamWriter.WriteLine(ss + ":");
                 foreach (var point in s.points)
                 {
                     streamWriter.WriteLine("(" + point.X + "\t" + point.Y + ")");
                 }
             }
     }
     catch (Exception)
     {
     }
 }
Esempio n. 5
0
        public void Start()
        {
            P    = null;
            stop = false;
            switch (solutionType)
            {
            case SolutionType.Stochastic:
                Optimize_Stochastic();
                break;

            case SolutionType.SteepestAscent:
                Optimize_SteepestAscent();
                break;

            case SolutionType.RandomRestart:
                Optimize_RandomRestart();
                break;

            default:
                break;
            }
        }
Esempio n. 6
0
        void Optimize_Stochastic()
        {
            P         = problem.GenerateFixSolution();
            P.Fitness = problem.Fitness(P);

            t = 0;
            while (!StoppingCondition())
            {
                SmallestBoundaryPolygon.Solution q = problem.RandomNeighbor(P, Epsilon);
                q.Fitness = problem.Fitness(q);

                float deltaE = (float)q.Fitness - (float)P.Fitness;

                if (deltaE < 0)
                {
                    P = SmallestBoundaryPolygon.Solution.Copy(q);

                    Logol(t + ": BEST: " + p.Fitness, p);
                }
                NewSolution(P, q);
                t++;
            }
        }