[7315] | 1 | using System;
|
---|
| 2 | using System.Collections.Generic;
|
---|
| 3 | using System.Linq;
|
---|
| 4 | using System.Text;
|
---|
| 5 |
|
---|
| 6 | namespace VRPProblemAnalyzer {
|
---|
| 7 |
|
---|
| 8 | public class DepotExcentricityCalculator {
|
---|
| 9 |
|
---|
| 10 | public static double Geographic(double[,] vertices) {
|
---|
| 11 | var customers = Utils.MatrixToPointList(vertices);
|
---|
| 12 | var depot = customers[0];
|
---|
| 13 | customers.RemoveAt(0);
|
---|
| 14 | var minX = customers.Min(c => c.X);
|
---|
| 15 | var minY = customers.Min(c => c.Y);
|
---|
| 16 | var maxX = customers.Max(c => c.X);
|
---|
| 17 | var maxY = customers.Max(c => c.Y);
|
---|
| 18 | var rangeX = maxX - minX;
|
---|
| 19 | var rangeY = maxY - minY;
|
---|
| 20 | var center = new PointD(minX + rangeX/2, minY + rangeY/2);
|
---|
| 21 | Console.WriteLine("Geographic {0} -> {1} = {2}", depot, center, depot.DistanceTo(center));
|
---|
| 22 | return depot.DistanceTo(center);
|
---|
| 23 | }
|
---|
| 24 |
|
---|
| 25 | public static double DistanceCentroid(double[,] vertices) {
|
---|
| 26 | var customers = Utils.MatrixToPointList(vertices);
|
---|
| 27 | var depot = customers[0];
|
---|
| 28 | customers.RemoveAt(0);
|
---|
| 29 | var center = new PointD(
|
---|
| 30 | customers.Select(c => c.X).Average(),
|
---|
| 31 | customers.Select(c => c.Y).Average());
|
---|
| 32 | Console.WriteLine("Distance {0} -> {1} = {2}", depot, center, depot.DistanceTo(center));
|
---|
| 33 | return depot.DistanceTo(center);
|
---|
| 34 | }
|
---|
| 35 |
|
---|
| 36 | public static double DemandDistanceCentroid(double[,] vertices, double[] demands) {
|
---|
| 37 | var factor = demands.Sum()/demands.Length;
|
---|
| 38 | var customers = Utils.MatrixToPointList(vertices).Zip(demands, (c, d) => new {c.X, c.Y, D = d/factor}).ToList();
|
---|
| 39 | var depot = customers[0];
|
---|
| 40 | customers.RemoveAt(0);
|
---|
| 41 | var center = new PointD(
|
---|
| 42 | customers.Select(c => c.X*c.D).Average(),
|
---|
| 43 | customers.Select(c => c.Y*c.D).Average());
|
---|
| 44 | Console.WriteLine("Demand {0} -> {1} = {2}", depot, center, new PointD(depot.X, depot.Y).DistanceTo(center));
|
---|
| 45 | return new PointD(depot.X, depot.Y).DistanceTo(center);
|
---|
| 46 | }
|
---|
| 47 | }
|
---|
| 48 | }
|
---|