using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace VRPProblemAnalyzer { public class DepotExcentricityCalculator { public static double Geographic(double[,] vertices) { var customers = Utils.MatrixToPointList(vertices); var depot = customers[0]; customers.RemoveAt(0); var minX = customers.Min(c => c.X); var minY = customers.Min(c => c.Y); var maxX = customers.Max(c => c.X); var maxY = customers.Max(c => c.Y); var rangeX = maxX - minX; var rangeY = maxY - minY; var center = new PointD(minX + rangeX/2, minY + rangeY/2); Console.WriteLine("Geographic {0} -> {1} = {2}", depot, center, depot.DistanceTo(center)); return depot.DistanceTo(center); } public static double DistanceCentroid(double[,] vertices) { var customers = Utils.MatrixToPointList(vertices); var depot = customers[0]; customers.RemoveAt(0); var center = new PointD( customers.Select(c => c.X).Average(), customers.Select(c => c.Y).Average()); Console.WriteLine("Distance {0} -> {1} = {2}", depot, center, depot.DistanceTo(center)); return depot.DistanceTo(center); } public static double DemandDistanceCentroid(double[,] vertices, double[] demands) { var factor = demands.Sum()/demands.Length; var customers = Utils.MatrixToPointList(vertices).Zip(demands, (c, d) => new {c.X, c.Y, D = d/factor}).ToList(); var depot = customers[0]; customers.RemoveAt(0); var center = new PointD( customers.Select(c => c.X*c.D).Average(), customers.Select(c => c.Y*c.D).Average()); Console.WriteLine("Demand {0} -> {1} = {2}", depot, center, new PointD(depot.X, depot.Y).DistanceTo(center)); return new PointD(depot.X, depot.Y).DistanceTo(center); } } }