private static IEnumerable <PartialSolutionTail> CreateNewPartialSolution(PartialSolutionTail tail, Point[] points) { var newPartialSolutions = new PartialSolutionTail[points.Length]; for (int i = 0; i < newPartialSolutions.Length; i++) { newPartialSolutions[i] = new PartialSolutionTail(tail, points[i]); } return(newPartialSolutions); }
public PartialSolution(PartialSolution partialSolution, PartialSolutionTail partialSolutionTail, int id) { Id = id; var points = partialSolution.Points.ToList(); points.AddRange(partialSolutionTail.Points); Points = points.ToArray(); DistanceClosed += partialSolutionTail.ClosedDistance; DistanceOpen = partialSolution.DistanceOpen + partialSolutionTail.DistanceOpen; LastPoint = partialSolutionTail.LastPoint; }
public SolutionSet GetNextSolutionSet(SolutionSet solution, IEnumerable <Point> points, int beamDepth) { var tails = new PartialSolutionTail[solution.PartialSolutionList.Length]; for (int i = 0; i < solution.PartialSolutionList.Length; i++) { tails[i] = new PartialSolutionTail(solution.PartialSolutionList[i]); } var tempPartialSolutions = Repeat(tails, points, beamDepth); var ordered = tempPartialSolutions .OrderBy(ps => ps.ClosedDistance) .Take(SolutionSet.BeamWidth); solution.Attach(ordered.ToArray()); return(solution); }
public PartialSolutionTail(PartialSolutionTail fromTail, Point point) { var points = fromTail.Points.ToList(); if (!points.Any()) { DistanceOpen += fromTail.Head.LastPoint.CalculateDistanceTo(point); } else { DistanceOpen = fromTail.DistanceOpen + fromTail.LastPoint.CalculateDistanceTo(point); } points.Add(point); Points = points.ToArray(); Head = fromTail.Head; LastPoint = point; }