Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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;
        }