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