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); }
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); } }