public void Init(string path, Random gen)
        {
            smallestBoundary = new SmallestBoundaryPolygon();
            smallestBoundary.LoadPointsFromFile(path);

            hillClimb = new HillClimber <List <Vector2> >();

            hillClimb.gen           = gen;
            hillClimb.Epsilon       = 10;
            hillClimb.MaxIterations = 1000;

            hillClimb.Fitness = (solution) => smallestBoundary.Objective(solution);
            hillClimb.LowerFitnessIsBetter();

            hillClimb.RandomStart = () =>
            {
                var    points = new List <Vector2>();
                double rangeX = HighestPoint.X - LowestPoint.X;
                double rangeY = HighestPoint.Y - LowestPoint.Y;

                foreach (var point in smallestBoundary.points)
                {
                    var x = (gen.NextDouble() * rangeX) + LowestPoint.X;
                    var y = (gen.NextDouble() * rangeY) + LowestPoint.Y;
                    points.Add(new Vector2((float)x, (float)y));
                }

                while (smallestBoundary.Constraint(points) < 0)
                {
                    points.Clear();
                    foreach (var point in smallestBoundary.points)
                    {
                        var x = (gen.NextDouble() * rangeX) + LowestPoint.X;
                        var y = (gen.NextDouble() * rangeY) + LowestPoint.Y;
                        points.Add(new Vector2((float)x, (float)y));
                    }
                }

                return(points);
            };

            hillClimb.TakeValidStep = (state) =>
            {
                var newState = new List <Vector2>();
                foreach (var point in state)
                {
                    var x = gen.Next(-1, 1);
                    var y = gen.Next(-1, 1);
                    var v = new Vector2(x, y);

                    v  = Vector2.Normalize(v);
                    v *= (float)hillClimb.Epsilon;
                    v += point;

                    newState.Add(v);
                }
                return(newState);
            };
        }
示例#2
0
 //Constructor
 public SimulatedAnnealing()
 {
     problem = new SmallestBoundaryPolygon();
     problem.LoadPointsFromFile("SBP_Points.txt");
 }
示例#3
0
 //Constructor
 public SBP_HillClimbing(SolutionType solutionType)
 {
     this.solutionType = solutionType;
     problem           = new SmallestBoundaryPolygon();
     problem.LoadPointsFromFile("SBP_Points.txt");
 }