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 | }
|
---|