コード例 #1
0
        private (List <int> trajectory, float lenght) Simulate(int BeginNumber)
        {
            List <int>  trajectory    = new List <int>();
            float       length        = 0;
            GraphVertex currentVertex = _Vertices.Where(i => i.Number == BeginNumber).FirstOrDefault();

            trajectory.Add(BeginNumber);

            while (true)
            {
                List <(int number, double p)> probabilities = new List <(int, double)>();
                foreach (GraphEdge t in currentVertex.Edges)
                {
                    if (trajectory.Where(i => i == t.Number).Count() > 0)
                    {
                        continue;
                    }
                    double p = Math.Pow(200.0 / t.Distance, _DistanceEffectFactor) * Math.Pow(t.Feromones, _FeromonesEffectFactor);
                    probabilities.Add((t.Number, p));
                }
                if (probabilities.Count == 0)
                {
                    break;
                }

                List <(int number, double p)> probabilitiesVertexs = new List <(int, double)>();
                double overallProbability = probabilities.Select(i => i.p).Sum();
                foreach ((int number, double p)item in probabilities)
                {
                    probabilitiesVertexs.Add((item.number, item.p / overallProbability));
                }

                int nextVertext = RouletteProbability(probabilitiesVertexs);

                length       += currentVertex.Edges.Where(i => i.Number == nextVertext).First().Distance;
                currentVertex = _Vertices.Where(i => i.Number == nextVertext).FirstOrDefault();

                trajectory.Add(nextVertext);
            }

            return(trajectory, length);
        }
コード例 #2
0
        public AntsAlgoritm(List <Vector2> points)
        {
            int i = 0, j;

            foreach (Vector2 item in points)
            {
                GraphVertex _vertex = new GraphVertex(item);
                _vertex.Number = i++;
                j = 0;
                foreach (Vector2 item2 in points)
                {
                    if (!item.Equals(item2))
                    {
                        float distance = Vector2.Distance(item2, item);
                        _vertex.Edges.Add(new GraphEdge(distance, _DefaultFeromones, j));
                    }
                    j++;
                }
                _Vertices.Add(_vertex);
            }
        }