Пример #1
0
        private double GetAttractiveness(PointFirefly i, PointFirefly j)
        {
            double z      = GetZ(j);
            double radius = Math.Sqrt(Math.Pow(i.X1 - j.X1, 2) + Math.Pow(i.X2 - j.X2, 2));

            return((b0 * z) / (1 + yota * Math.Pow(radius, 2)));
        }
Пример #2
0
 public FireflyPointForFirstTest(PointFirefly point, double Answer,
                                 bool Right, String Name)
     : base(point, Answer)
 {
     this.Name  = Name;
     this.Right = Right;
 }
Пример #3
0
        private PointFirefly Shift(PointFirefly i, PointFirefly j, int n)
        {
            double radius = Math.Sqrt(Math.Pow(i.X1 - j.X1, 2) + Math.Pow(i.X2 - j.X2, 2));
            double Bij    = b0 / (1 + yota * Math.Pow(radius, n));

            double X1 = j.X1 + Bij * (i.X1 - j.X1) + GetA(n) * (random.NextDouble() * 2 - 1);
            double X2 = j.X2 + Bij * (i.X2 - j.X2) + GetA(n) * (random.NextDouble() * 2 - 1);

            return(new PointFirefly(X1, X2));
        }
Пример #4
0
        public ConceptSearchResponse GetGeneration()
        {
            if (startGeneration.Count == 0)
            {
                SetPositionFirefly();
            }

            if (listGeneration.Count == 0)
            {
                listGeneration.Add(startGeneration);
            }

            List <Redirect> redirects = new List <Redirect>();

            for (int i = 0; i < N; i++)
            {
                List <PointFirefly> Old = listGeneration.Last();
                List <PointFirefly> New = new List <PointFirefly>();
                int FirstShift          = 0;
                for (int j = 0; j < Old.Count; j++)
                {
                    PointFirefly better = Old[j];
                    for (int k = 0; k < Old.Count; k++)
                    {
                        if (GetAttractiveness(Old[j], Old[k])
                            < GetAttractiveness(Old[j], better) && k != j)
                        {
                            better = Old[k];
                            if (i == 0)
                            {
                                FirstShift = k;
                            }
                        }
                    }
                    if (better != Old[j])
                    {
                        PointFirefly buffer = Old[j];
                        better = Shift(buffer, better, N);
                    }

                    New.Add(better);
                    if (i == 0)
                    {
                        redirects.Add(new Redirect()
                        {
                            IndexFirst = j, IndexLast = FirstShift
                        });
                    }
                }
                listGeneration.Add(New);
            }

            FireflyAnswer answer = new FireflyAnswer(listGeneration.Last().First(),
                                                     GetZ(listGeneration.Last().First()));

            for (int i = 1; i < listGeneration.Last().Count; i++)
            {
                if (GetZ(listGeneration.Last()[i]) < answer.Answer)
                {
                    answer = new FireflyAnswer(listGeneration.Last()[i], GetZ(listGeneration.Last()[i]));
                }
            }

            return(new ConceptSearchResponse(startGeneration,
                                             listGeneration, redirects, answer));
        }
Пример #5
0
 public FireflyAnswer(PointFirefly point, double Answer) : base(point)
 {
     this.Answer = Answer;
 }
Пример #6
0
 private double GetZ(PointFirefly j)
 {
     return(a * Math.Pow(j.X1 + c, b) +
            p * Math.Pow(j.X2 + g, t));
 }