public CityCluster(List<CityNodeData> Cities, List<CityNodeData> AllCities, CostMatrix costMatrix) { _containedCities = new List<CityNodeData>(Cities); _allCities = new List<CityNodeData>(AllCities); _costMatrix = costMatrix; _cityEntryPoint = -1; _cityExitPoint = -1; _incomingEdgesSortedByDistance = new List<int>(); _outgoingEdgesSortedByDistance = new List<int>(); _incomingEdgesByCitySortedByDistance = new Dictionary<int, List<int>>(); _outgoingEdgesByCitySortedByDistance = new Dictionary<int, List<int>>(); foreach (CityNodeData innerCity in _containedCities) { int innerCityId = innerCity.CityId; foreach (CityNodeData outerCity in AllCities) { if (!_containedCities.Contains(outerCity)) { int outerCityId = outerCity.CityId; if (!_incomingEdgesByCitySortedByDistance.ContainsKey(outerCityId)) { _incomingEdgesByCitySortedByDistance.Add(outerCityId, new List<int>()); } if (!_outgoingEdgesByCitySortedByDistance.ContainsKey(outerCityId)) { _outgoingEdgesByCitySortedByDistance.Add(outerCityId, new List<int>()); } int incomingId = costMatrix.EdgeId(outerCityId, innerCityId); int outgoingId = costMatrix.EdgeId(innerCityId, outerCityId); _incomingEdgesSortedByDistance.Add(incomingId); _incomingEdgesByCitySortedByDistance[outerCityId].Add(incomingId); _outgoingEdgesSortedByDistance.Add(outgoingId); _outgoingEdgesByCitySortedByDistance[outerCityId].Add(outgoingId); } } } _incomingEdgesSortedByDistance.Sort((a, b) => costMatrix.CostAtEdgeId(a).CompareTo(costMatrix.CostAtEdgeId(b)) ); _outgoingEdgesSortedByDistance.Sort((a, b) => costMatrix.CostAtEdgeId(a).CompareTo(costMatrix.CostAtEdgeId(b))); ContainedCityIds = new List<int>(); foreach (CityNodeData city in _containedCities) { ContainedCityIds.Add(city.CityId); } }
public double SolveExternalClusters(CostMatrix costMatrix, List<CityNodeData> CityData, List<CityCluster> cityClusters, Dictionary<int, CityCluster> cityToClusterItsIn, out List<int> interNodeEdges) { int startingEdge = -1; foreach (int i in costMatrix.AllEdgesSortedByDistance) { KeyValuePair<int, int> coords = costMatrix.EdgeCoords(i); if (!cityToClusterItsIn[coords.Key].Equals(cityToClusterItsIn[coords.Value])) { startingEdge = i; break; } } KeyValuePair<int, int> curCoords = costMatrix.EdgeCoords(startingEdge); CityCluster curFromCluster = cityToClusterItsIn[curCoords.Key]; List<int> visitedCities = new List<int>(); List<CityCluster> clustersVisitedInOrder = new List<CityCluster>(); interNodeEdges = new List<int>(); clustersVisitedInOrder.Add(cityToClusterItsIn[curCoords.Key]); visitedCities.AddRange(cityToClusterItsIn[curCoords.Key].ContainedCityIds); cityToClusterItsIn[curCoords.Value].IncomingFromEdge(startingEdge); cityToClusterItsIn[curCoords.Key].OutgoingOnEdge(startingEdge); interNodeEdges.Add(startingEdge); while (interNodeEdges.Count < cityClusters.Count - 1) { curFromCluster = cityToClusterItsIn[curCoords.Value]; int newEdgeId = curFromCluster.GetShortestValidOutgoingEdgeIgnoringCities(visitedCities); curCoords = costMatrix.EdgeCoords(newEdgeId); cityToClusterItsIn[curCoords.Value].IncomingFromEdge(newEdgeId); cityToClusterItsIn[curCoords.Value].OutgoingOnEdge(newEdgeId); clustersVisitedInOrder.Add(curFromCluster); visitedCities.AddRange(curFromCluster.ContainedCityIds); interNodeEdges.Add(newEdgeId); } CityCluster end = cityToClusterItsIn[curCoords.Value]; CityCluster start = clustersVisitedInOrder[0]; int lastEdge = CityCluster.ShortedValidEdgeBetweenClusters(end, start); interNodeEdges.Add(lastEdge); _interNodeEdges = interNodeEdges; double retVal = 0; foreach (int edge in interNodeEdges) { retVal += costMatrix.CostAtEdgeId(edge); } return retVal; }