コード例 #1
0
        public string GetMostRoute(string homeSystem = null)
        {
            List <Mission> missions      = missionMonitor.missions.ToList();
            string         mostSystem    = null;
            decimal        mostDistance  = 0;
            string         routeList     = null;
            decimal        routeDistance = 0;
            long           mostCount     = 0;
            List <long>    missionids    = new List <long>(); // List of mission IDs for the next system

            if (missions.Count > 0)
            {
                StarSystem curr = EDDI.Instance?.CurrentStarSystem;
                StarSystem dest = new StarSystem();             // Destination star system

                // Determine the number of missions per individual system
                List <string> systems      = new List <string>(); // Mission systems
                List <int>    systemsCount = new List <int>();    // Count of missions per system
                foreach (Mission mission in missions.Where(m => m.statusEDName == "Active").ToList())
                {
                    if (mission.destinationsystems != null && mission.destinationsystems.Any())
                    {
                        foreach (DestinationSystem system in mission.destinationsystems)
                        {
                            int index = systems.IndexOf(system.name);
                            if (index == -1)
                            {
                                systems.Add(system.name);
                                systemsCount.Add(1);
                            }
                            else
                            {
                                systemsCount[index] += 1;
                            }
                        }
                    }
                    else if (mission.destinationsystem != string.Empty)
                    {
                        int index = systems.IndexOf(mission.destinationsystem);
                        if (index == -1)
                        {
                            systems.Add(mission.destinationsystem);
                            systemsCount.Add(1);
                        }
                        else
                        {
                            systemsCount[index] += 1;
                        }
                    }
                }

                // Sort the 'most' systems by distance
                SortedList <decimal, string> mostList = new SortedList <decimal, string>();   // List of 'most' systems, sorted by distance
                mostCount = systemsCount.Max();
                for (int i = 0; i < systems.Count(); i++)
                {
                    if (systemsCount[i] == mostCount)
                    {
                        dest = StarSystemSqLiteRepository.Instance.GetOrCreateStarSystem(systems[i], true);
                        if (dest != null)
                        {
                            mostList.Add(CalculateDistance(curr, dest), systems[i]);
                        }
                    }
                }

                // Nearest 'most' system is first in the list
                mostSystem   = mostList.Values.FirstOrDefault();
                mostDistance = mostList.Keys.FirstOrDefault();

                // Calculate the missions route using the 'Repetitive Nearest Neighbor' Algorithim (RNNA)
                mostList.Add(0, curr?.systemname);
                if (missionMonitor.CalculateRNNA(mostList.Values.ToList(), homeSystem))
                {
                    routeList     = missionMonitor.missionsRouteList;
                    routeDistance = missionMonitor.missionsRouteDistance;
                    Logging.Debug("Calculated Route Selected = " + routeList + ", Total Distance = " + routeDistance);
                    if (homeSystem != null)
                    {
                        mostSystem   = routeList?.Split('_')[0];
                        mostDistance = mostList.Keys[mostList.Values.ToList().IndexOf(mostSystem)];
                    }

                    // Set destination variables (route already set)
                    missionMonitor.UpdateDestinationData(mostSystem, null, mostDistance);
                }
                else
                {
                    routeList     = mostSystem;
                    routeDistance = mostDistance;
                    Logging.Debug("Unable to meet missions route calculation criteria");

                    // Set route and destination variables
                    missionMonitor.SetNavigationData(mostSystem, null, mostDistance);
                }

                // Get mission IDs for 'most' system
                missionids = missionMonitor.GetSystemMissionIds(mostSystem);
            }
            EDDI.Instance.enqueueEvent(new RouteDetailsEvent(DateTime.Now, "most", mostSystem, routeList, mostCount, mostDistance, routeDistance, missionids));
            return(mostSystem);
        }