Ejemplo n.º 1
0
        public void TestSimplexMethod()
        {
            Matrix <double> matrix = DenseMatrix.OfArray(new double[, ] {
                { 1, 0, 2, -1 }, { 0, 1, 4, 2 }
            });
            Vector <double> simplexFunction = DenseVector.OfArray(new double[] { 1, -4, 3, 4 });
            Vector <double> constraints     = DenseVector.OfArray(new double[] { 2, 6 });

            BasisFinder basisFinder = new BasisFinder(matrix, simplexFunction, constraints);

            int[] basis = basisFinder.GetBasis();

            Console.WriteLine($"Basis: {string.Join(", ", basis)}");

            Simplex simplex = new Simplex(basisFinder, basis);

            simplex.FindAnswer();

            Console.WriteLine($"Matrix: {simplex.matrix.ToString()}");
            Console.WriteLine($"Constraints: {constraints.ToString()}");
            Console.WriteLine($"Simplex function: {simplexFunction.ToString()}");
            double answer = simplex.GetAnswer();

            Console.WriteLine($"Answer: {answer}");

            double[,] matrixResult = { { 1, 0.5, 4, 0 }, { 0, 0.5, 2, 1 } };
            Assert.IsTrue(answer == 17.0 && matrixResult.IsEqualsValues(simplex.matrix));
        }
Ejemplo n.º 2
0
        private void PrepareDataForSimplexMethod()
        {
            // TODO: Algorithm:
            // - Standartization of points
            // - Calculate hashes for tiles
            // - Get graphs by hashes or real time add tiles
            // - Combine graphs
            // - Path finding
            // - Convert data for simplex method

            // TODO: UI usability structure
            help.Content = "Right click on map to select point";
            double[] constraints = new double[pointsList.Count / countOfSources];
            for (int i = 0; i < constraints.Length; i++)
            {
                constraints[i] = Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox($"Cost condition for {i}:", "Please, enter the field", "1"));
            }

            double[] simplex = new double[countOfSources];
            for (int i = 0; i < simplex.Length; i++)
            {
                simplex[i] = Convert.ToInt32(Microsoft.VisualBasic.Interaction.InputBox($"Satisfaction condition for {i}:", "Please, enter the field", "1"));
            }

            double           cZoom = dataController.ConvertToMapZoom(zoom);
            Vector2 <double> tile  = MercatorProjection.LatLngToTile(pointsList.First().TileLatLng, cZoom).Floor();
            Graph            graph = dataController.GetRoads(new Vector3 <double>(tile.X, tile.Y, cZoom));

            if (graph == null)
            {
                return;
            }

            //List<string> hashes = pointsList.GetMapTileHashes(dataController.ConvertToMapZoom(zoom));
            //Graph.CombineGraphs(dataController.GetRoads(hashes[0]).nodes, dataController.GetRoads(hashes[1]).nodes);

            List <Node> points = new List <Node>();

            foreach (RaycastMapResult point in pointsList)
            {
                //var proj = MercatorProjection.LatLngToTile(, cZoom);
                var proj = point.PointLatLng;
                points.Add(graph.FindNearest(proj));
            }

            Console.WriteLine("Clear list of points...");
            pointsList.Clear();

            double[,] distances = new double[points.Count / countOfSources, countOfSources];
            int counterX = 0;
            int counterY = 0;

            for (int i = 1; i < points.Count; i++)
            {
                if (counterX == countOfSources)
                {
                    counterY = 0;
                    counterX++;
                }
                AStarPathSearch.AStarPathSearchResult result = AStarPathSearch.FindPath(points[0], points[i]);
                if (result == null)
                {
                    return;
                }
                distances[counterX, counterY] = result.Score;
                counterY++;
            }

            Matrix <double> distanceMatrix    = DenseMatrix.OfArray(distances);
            Vector <double> constraintsVector = DenseVector.OfArray(constraints);
            Vector <double> simplexFunction   = DenseVector.OfArray(simplex);

            BasisFinder basisFinder = new BasisFinder(distanceMatrix, simplexFunction, constraintsVector);

            int[] basis = basisFinder.GetBasis();

            Console.WriteLine($"Basis: {string.Join(", ", basis)}");

            Simplex simplexMethod = new Simplex(basisFinder, basis);

            simplexMethod.FindAnswer();

            Console.WriteLine($"Matrix: {simplexMethod.matrix.ToString()}");
            Console.WriteLine($"Constraints: {constraintsVector.ToString()}");
            Console.WriteLine($"Simplex function: {simplexFunction.ToString()}");
            double answer = simplexMethod.GetAnswer();

            Console.WriteLine($"Answer: {answer}");
        }