コード例 #1
0
        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);
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
        }