예제 #1
0
        /// <summary>
        /// Ручной ввод маршрута
        /// </summary>
        private void tlStripBtnManualRoute_Click(object sender, EventArgs e)
        {
            frmManualInputRoute frm = new frmManualInputRoute();

            if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                List <int> cities = frm.CitiesIndexes;
                if (cities.Count == 0)
                {
                    return;
                }
                List <City> liCityToManualRoute = new List <City>();
                foreach (int index in cities)
                {
                    liCityToManualRoute.Add(_cities[index - 1]);
                }

                // Путь городов. Заносим лист.
                CitiesCollection citiesCollection = new CitiesCollection(liCityToManualRoute);
                Route            manualRoute      = new Route(citiesCollection, "Ручной расчет");
                manualRoute.Drawing.Color = Color.LawnGreen;
                liRoute.Add(manualRoute);
                ucCP.RefreshRouteList();  // обновляем таблицу с листом маршрутов
                ucCP.RefreshRoutePaint(); // обновляем прорисовку
            }
        }
예제 #2
0
        /// <summary>
        /// Создать коллекцию городов
        /// </summary>
        private void tlStrpBtnCreateRandomCities_Click(object sender, EventArgs e)
        {
            // ИСХОДНЫЕ ДАННЫЕ
            // Создаем Города
            int iCitiesCount;

            try
            {
                iCitiesCount = Convert.ToInt32(tlStrpTxbCitiesCount.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка преобразования из текста в целое число: " + ex.Message);
                return;
            }
            _cities = new CitiesCollection(iCitiesCount);
            liRoute.Clear();
            _paramAnt.MaxCities = iCitiesCount;
            _paramAnt.MaxAnts   = iCitiesCount;

            //Cities.InitPheromone = param.InitPheromone;
            _cities.MaxDistance = _paramAnt.MaxDistance;
            _cities.InitCitiesRandom();
            // Прорисовка городов
            ucCP.Cities = _cities;
            //ucCP.PaintCities();
            ucCP.RefreshRoutePaint();

            rtxbOut.Clear();
            rtxbCities.Clear();
            toolSTLInfo.Text = "Города созданы: " + _cities.Count;
        }
예제 #3
0
 public NearestNeighbourTravelSalesman(CitiesCollection cities, AntParameters param)
     : this(cities)
 {
     SetParameters(param);
     tmrTimer          = new System.Timers.Timer(10);               //инициализация таймера
     tmrTimer.Elapsed += new ElapsedEventHandler(tmrTimer_Elapsed); //подписка на событие таймера "Elapsed"
 }
예제 #4
0
        public void InitAnts(CitiesCollection cities)
        {
            if (_liAnts != null)
            {
                int to = 0;
                for (int i = 0; i < _liAnts.Count; i++)
                {
                    // Распределяем муравьев по городам равномерно
                    if (to == cities.Count)
                    {
                        to = 0;
                    }
                    _liAnts[i].CurrentCity = cities[to++];

                    _liAnts[i].TabuInit(cities.Count);
                    _liAnts[i].PathInit(cities.Count);

                    _liAnts[i].PathIndex = 1;
                    _liAnts[i].PathSet(0, _liAnts[i].CurrentCity);
                    _liAnts[i].NextCity   = null;
                    _liAnts[i].TourLength = 0.0;

                    // Помещаем исходный город, в котором находится муравей в список Табу
                    _liAnts[i].TabuSet(_liAnts[i].CurrentCity.Index, 1);
                }
            }
        }
예제 #5
0
        public void StartAsync(CitiesCollection cities, IParameters parameters)
        {
            Init(cities, parameters);

            timeStart = DateTime.Now;
            // Зпуск алгоритма
            _travelSalesmanBnB.CalculateAsync();
        }
예제 #6
0
 public GeneticAlgorithmTravelSalesman(CitiesCollection cities, GAParameters gap)
     : this(cities)
 {
     //SetParameters(gap);
     _gap     = gap;
     tmrTimer = new System.Timers.Timer(10);                                      //инициализация таймера
     //tmrTimer.Elapsed += new ElapsedEventHandler(tmrTimer_Elapsed); //подписка на событие таймера "Elapsed"
 }
예제 #7
0
        /// <summary>
        /// Начать алгоритм расчета
        /// </summary>
        /// <param name="cities">Коллекция городов</param>
        /// <param name="parameters">Параметры расчета</param>
        public void StartAsync(CitiesCollection cities, IParameters parameters)
        {
            Init(cities, parameters);

            timeStart = DateTime.Now;

            travelSalesmanAnt.CalculateAsync();
        }
예제 #8
0
 public AntAlgTravelSalesman(CitiesCollection cities, AntParameters param)
     : this(cities)
 {
     SetParameters(param);
     maxTime           = _parameters.MaxTime;                       //установка максимального ко-ва проходов
     tmrTimer          = new System.Timers.Timer(10);               //инициализация таймера
     tmrTimer.Elapsed += new ElapsedEventHandler(tmrTimer_Elapsed); //подписка на событие таймера "Elapsed"
 }
예제 #9
0
 /// <summary>
 /// Создать новое поколение
 /// </summary>
 /// <param name="gap">Параметры генетического алгоритма</param>
 /// <param name="cities">Города для расчёта</param>
 public Generation(GAParameters gap, CitiesCollection cities)
 {
     _gap      = gap;
     _cities   = cities;
     _liAgents = new List <Agent>();
     for (int i = 0; i < _gap.Population; i++)
     {
         _liAgents.Add(new Agent(_cities));
     }
 }
예제 #10
0
 /// <summary>
 /// Переводит данные из коллекции городов в тип данные узла
 /// </summary>
 /// <param name="cities">коллекция городов</param>
 public BnBNodeData(CitiesCollection cities)
 {
     try
     {
         DataFromOther(null, cities, -1, -1);
     }
     catch (Exception ex)
     {
         throw new Exception(ex.Message);
     }
 }
예제 #11
0
        /// <summary>
        /// Начать алгоритм расчета
        /// </summary>
        /// <param name="cities">Коллекция городов</param>
        /// <param name="parameters">Параметры расчета</param>
        public void Start(CitiesCollection cities, IParameters parameters)
        {
            this.Init(cities, parameters);

            timeStart = DateTime.Now;
            travelSalesmanGA.Calculate();

            // travelSalesmanNN.SetParameters(parameters);
            //travelSalesmanNN.InitNeighbours(cities);
            //travelSalesmanNN.Calculate();
            // Результаты
        }
예제 #12
0
        /// <summary>
        /// Cyclic crossbreeding
        /// </summary>
        /// <param name="agent1">First agent</param>
        /// <param name="agent2">Second agent</param>
        private void CyclicCrossbreeding(ref Agent agent1, ref Agent agent2)
        {
            if (agent1.Route.Count == agent2.Route.Count)
            {
                int iCount      = agent1.Route.Count;
                int iBreakPoint = _rnd.Next(agent1.Route.Count);

                CitiesCollection tmpCC1 = new CitiesCollection();
                CitiesCollection tmpCC2 = new CitiesCollection();

                Agent agentCopy1 = new Agent(agent1.Route.Cities);
                Agent agentCopy2 = new Agent(agent2.Route.Cities);

                while (agent1.Route.Count > 1)
                {
                    // Копируем города из агентов(первый из первого, последный из второго)
                    City tmpc1 = agent1.Route.Cities[0];
                    tmpCC1.Add(tmpc1);
                    agent1.Route.Cities.Cities.Remove(tmpc1);
                    agent2.Route.Cities.Cities.Remove(tmpc1);

                    City tmpc2 = agent2.Route.Cities[agent2.Route.Cities.Count - 1];
                    tmpCC1.Add(tmpc2);
                    agent1.Route.Cities.Cities.Remove(tmpc2);
                    agent2.Route.Cities.Cities.Remove(tmpc2);

                    // Копируем города из копий Агентов
                    tmpc1 = agentCopy2.Route.Cities[0];
                    tmpCC2.Add(tmpc1);
                    agentCopy1.Route.Cities.Cities.Remove(tmpc1);
                    agentCopy2.Route.Cities.Cities.Remove(tmpc1);

                    tmpc2 = agentCopy1.Route.Cities[agentCopy1.Route.Cities.Count];
                    tmpCC2.Add(tmpc2);
                    agentCopy1.Route.Cities.Cities.Remove(tmpc2);
                    agentCopy2.Route.Cities.Cities.Remove(tmpc2);
                }
                // Если количество городов нечётное, один город остаётся в Агенте
                if (agent1.Route.Count == 1)
                {
                    tmpCC1.Add(agent1.Route.Cities[0]);
                    tmpCC2.Add(agent1.Route.Cities[0]);
                }

                agent1.Route = new Route(tmpCC1, "генетический алгоритм");
                agent2.Route = new Route(tmpCC2, "генетический алгоритм");
            }
            else
            {
                throw new Exception("Число городов в агентах не совпадает!");
            }
        }
예제 #13
0
        /// <summary>
        /// Crossbreeding with one break point in route
        /// </summary>
        /// <param name="agent1">First agent</param>
        /// <param name="agent2">Second agent</param>
        private void OnePointCrossbreeding(ref Agent agent1, ref Agent agent2)
        {
            try
            {
                if (agent1.Route.Count == agent2.Route.Count)
                {
                    int iCount      = agent1.Route.Count;
                    int iBreakPoint = _rnd.Next(agent1.Route.Count);

                    CitiesCollection tmpCC1 = new CitiesCollection();
                    CitiesCollection tmpCC2 = new CitiesCollection();

                    Agent agentCopy1 = new Agent(agent1.Route.Cities);
                    Agent agentCopy2 = new Agent(agent2.Route.Cities);

                    for (int i = 0; i < iBreakPoint; i++)
                    {
                        // Adding first city to collection and deleting it from Agent
                        tmpCC1.Add(agent1.Route.Cities[i]);
                        agent2.Route.Cities.Cities.Remove(agent1.Route.Cities[i]);
                        //agent1.Route.Cities.Cities.RemoveAt(0);

                        tmpCC2.Add(agentCopy2.Route.Cities[i]);
                        agentCopy1.Route.Cities.Cities.Remove(agentCopy2.Route.Cities[i]);
                        //agentCopy2.Route.Cities.Cities.RemoveAt(0);
                    }
                    //for (int i = 0; i < iBreakPoint; i++)
                    //{
                    //    agent1.Route.Cities.Cities.Remove(tmpCC1[i]);
                    //    agent2.Route.Cities.Cities.Remove(tmpCC2[i]);
                    //}

                    for (int i = 0; i < iCount - iBreakPoint; i++)
                    {
                        tmpCC1.Add(agent2.Route.Cities[i]);
                        tmpCC2.Add(agentCopy1.Route.Cities[i]);
                    }
                    agent1.Route = new Route(tmpCC1, "генетический алгоритм");
                    agent2.Route = new Route(tmpCC2, "генетический алгоритм");
                }
                else
                {
                    throw new Exception("Число городов в агентах не совпадает!");
                }
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message + ex.StackTrace);
                throw;
            }
        }
예제 #14
0
 /// <summary>
 /// Инициализируем данные
 /// </summary>
 private void Init(CitiesCollection cities, AntParameters parameters)
 {
     if (cities == null)
     {
         throw new Exception("В алгоритме на определены города");
     }
     if (parameters == null)
     {
         throw new Exception("В алгоритме на определены параметры расчета");
     }
     travelSalesmanNN = new NearestNeighbourTravelSalesman(cities, parameters);
     travelSalesmanNN.eventProgressChanged += new EventHandler <NearestNeighbourChangesEventArgs>(ProgressChange);
     travelSalesmanNN.eventFinally         += new EventHandler <EventArgs>(Finally);
 }
예제 #15
0
 /// <summary>
 /// Инициализируем данные
 /// </summary>
 private void Init(CitiesCollection cities, IParameters parameters)
 {
     if (cities == null)
     {
         throw new Exception("В алгоритме на определены города");
     }
     if (parameters == null)
     {
         throw new Exception("В алгоритме на определены параметры расчета");
     }
     travelSalesmanGA = new GeneticAlgorithmTravelSalesman(cities, (GAParameters)parameters);
     travelSalesmanGA.eventProgressChanged += new EventHandler <GeneticAlgorithmChangesEventArgs>(ProgressChange);
     travelSalesmanGA.eventFinally         += new EventHandler <EventArgs>(Finally);
 }
예제 #16
0
        public void CitySwitchMutation(ref Agent agent)
        {
            // Getting Cities collection
            CitiesCollection tmpCC = new CitiesCollection(agent.Route.Cities);

            // Choosing random cities indexes
            int iCity1, iCity2;

            iCity1 = _rnd.Next(tmpCC.Count);
            iCity2 = _rnd.Next(tmpCC.Count);

            // Writing cities in local variables
            City tmpc1 = tmpCC[iCity1];
            City tmpc2 = tmpCC[iCity2];

            // Switching cities
            tmpCC[iCity1] = tmpc2;
            tmpCC[iCity2] = tmpc1;

            // Adding temporary collection to the Agent
            agent.Route = new Route(tmpCC, "генетический алгоритм");
        }
예제 #17
0
        /// <summary>
        /// Инициализируем данные
        /// </summary>
        private void Init(CitiesCollection cities, IParameters parameters)
        {
            if (cities == null)
            {
                throw new Exception("В алгоритме на определены города");
            }
            if (parameters == null)
            {
                throw new Exception("В алгоритме на определены параметры расчета");
            }

            try
            {
                Parameters = (AntParameters)parameters;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            travelSalesmanAnt = new AntAlgTravelSalesman(cities, (AntParameters)Parameters);
            travelSalesmanAnt.eventProgressChanged += new EventHandler <AntAlgChangesEventArgs>(ProgressChange);
            travelSalesmanAnt.eventFinally         += new EventHandler <EventArgs>(Finally);
        }
예제 #18
0
        public void IsolatedChainMutation(ref Agent agent)
        {
            // Mutation takes place only if it is more than 4 cities in collection
            if (agent.Route.Cities.Count > 4)
            {
                // Getting Cities collection
                CitiesCollection tmpCC = new CitiesCollection(agent.Route.Cities);

                // Choosing random cities indexes
                int iCity1, iCity2;

                // Lower bound
                iCity1 = _rnd.Next(tmpCC.Count - 4);
                // Upper bound
                iCity2 = _rnd.Next(iCity1 + 4, tmpCC.Count);

                List <City> _liCityTemp = new List <City>();
                for (int i = iCity1 + 1; i < iCity2; i++)
                {
                    _liCityTemp.Add(tmpCC[i]);
                }

                for (int i = iCity1 + 1; i < iCity2; i++)
                {
                    int iRnd = _rnd.Next(_liCityTemp.Count);
                    tmpCC[i] = _liCityTemp[iRnd];
                    _liCityTemp.RemoveAt(iRnd);
                }

                agent.Route = new Route(tmpCC, "генетический алгоритм");

                if (Generation.IsCorruptedRoute(ref agent))
                {
                }
            }
        }
예제 #19
0
 public BranchAndBoundTravelSalesman(CitiesCollection cities)
     : this()
 {
     Cities = cities;
 }
예제 #20
0
 public AntAlgTravelSalesman(CitiesCollection cities)
     : this()
 {
     Cities = cities;
 }
예제 #21
0
 public ProceduralCityGenerator()
 {
     this.Cities    = new CitiesCollection();
     this.CityTypes = new CityTypesCollection();
     this.DefaultCityTypes();
 } //New
예제 #22
0
        private void GAFinally(object sender, EventArgs e)
        {
            Object thisLock = new Object();

            lock (thisLock)
            {
                // Critical code section
                this.Invoke(new MethodInvoker(delegate()
                {
                    // РЕЗУЛЬТАТЫ
                    //Начинаем перебор списка экземпляров алгоритма муравья
                    #region while
                    for (int i = 0; i < _prGAList.Count; i++)
                    {
                        #region if
                        if (_prGAList[i].ResultInfo != null)
                        {
                            // Лист результатов расчета
                            rtxbOut.AppendText("        генетический (" + i + ")       \n");
                            List <string> listr = _prGAList[i].ResultInfo;
                            foreach (string str in listr)
                            {
                                rtxbOut.AppendText(str);
                                rtxbOut.AppendText("\n");
                            }
                            rtxbOut.AppendText("--------------------------------------------\n");

                            // Лист последовательности городов
                            CitiesCollection CitiesInPath = _prGAList[i].ResultPath.Cities;
                            rtxbCities.Clear();
                            for (int k = 0; k < CitiesInPath.Count; k++)
                            {
                                rtxbCities.AppendText(String.Format("{0:0000}", CitiesInPath[k].Index) + " X:" + CitiesInPath[i].X + " Y:" + CitiesInPath[i].Y + Environment.NewLine);
                            }

                            // Путь городов. Заносим лист.
                            //_prBnBList[i].ResultPath.Drawing.Color = Color.Orange; // цвет маршрута
                            //liRoute.Add(_prBnBList[i].ResultPath);
                            _prGAList[i].ResultPath.Drawing.Color = _prGAList[i].Drawing.Color;
                            liRoute.Add(_prGAList[i].ResultPath);
                            ucCP.RefreshRouteList();  // обновляем таблицу с листом маршрутов
                            ucCP.RefreshRoutePaint(); // обновляем прорисовку

                            toolSTLInfo.Text = "Время расчета: " + _prGAList[i].ProcessTime.ToString();
                            // Удаляем label-процента исполнения
                            for (int j = 0; j < liLinkedPrLabel.Count; j++)
                            {
                                if (liLinkedPrLabel[j].Process == _prGAList[i])
                                {
                                    toolStrip1.Items.Remove(liLinkedPrLabel[j].Label);
                                    liLinkedPrLabel.RemoveAt(j);

                                    if (liLinkedPrLabel.Count == 0)
                                    {
                                        statusStrip1.Items.Clear();
                                    }
                                    break;
                                }
                            }

                            // Готовность интерфейса
                            _prGAList[i] = null;
                            tlStrpTxbCitiesCount.Enabled        = true;
                            tlStrpBtnCreateRandomCities.Enabled = true;

                            //удаление экземпляра алгортима из списка экземпляров
                            _prGAList.RemoveAt(i);
                            break;
                        }
                        #endregion
                    }
                    #endregion
                }));
            }
        }
예제 #23
0
        private void PNNFinally(object sender, EventArgs e)
        {
            Object thisLock = new Object();

            lock (thisLock)
            {
                // Critical code section
                this.Invoke(new MethodInvoker(delegate()
                {
                    //Начинаем перебор списка экземпляров алгоритма муравья
                    #region while
                    for (int i = 0; i < _prNNList.Count; i++)
                    {
                        #region if
                        if (_prNNList[i].ResultList != null)
                        {
                            try
                            {
                                // РЕЗУЛЬТАТЫ
                                // Лист результатов расчета
                                rtxbOut.AppendText("        ближайший сосед (" + i + ")       \n");
                                List <string> listr = _prNNList[i].ResultList;
                                foreach (string str in listr)
                                {
                                    rtxbOut.AppendText(str);
                                }
                                rtxbOut.AppendText("\n--------------------------------------------\n");
                                // Лист последовательности городов
                                CitiesCollection CitiesInPath = _prNNList[i].ResultPath.Cities;
                                rtxbCities.Clear();
                                for (int k = 0; k < CitiesInPath.Count; k++)
                                {
                                    rtxbCities.AppendText(String.Format("{0:0000}", CitiesInPath[i].Index) + " X:" + CitiesInPath[k].X + " Y:" + CitiesInPath[k].Y + Environment.NewLine);
                                }

                                // Путь городов
                                //_pnn.ResultPath.AlgorithmName = "Ближайший сосед";
                                _prNNList[i].ResultPath.Drawing.Color = Color.LightSeaGreen;
                                liRoute.Add(_prNNList[i].ResultPath);
                                ucCP.RefreshRouteList();  // обновляем таблицу с листом маршрутов
                                ucCP.RefreshRoutePaint(); // обновляем прорисовку

                                toolSTLInfo.Text = "Время расчета: " + _prNNList[i].ProcessTime.ToString();
                                // Удаляем label-процента исполнения
                                for (int j = 0; j < liLinkedPrLabel.Count; j++)
                                {
                                    if (liLinkedPrLabel[j].Process == _prNNList[i])
                                    {
                                        toolStrip1.Items.Remove(liLinkedPrLabel[j].Label);
                                        liLinkedPrLabel.RemoveAt(j);

                                        if (liLinkedPrLabel.Count == 0)
                                        {
                                            statusStrip1.Items.Clear();
                                        }
                                        break;
                                    }
                                }

                                // Готовность интерфейса
                                _prNNList[i] = null;
                                tlStrpTxbCitiesCount.Enabled = true;
                                //tlStrpBtnAntAlgStart.Enabled = true;
                                tlStrpBtnCreateRandomCities.Enabled = true;
                                //tsbNearestNeighbour.Enabled = true;
                                //ToolStripProgress.Visible = false;
                                //toolSTLProgress.Visible = false;

                                //удаление экземпляра алгортима из списка экземпляров
                                _prNNList.RemoveAt(i);
                                break;
                            }//try
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message + ex.StackTrace);
                            }
                        } //IF
                        #endregion
                    }     //For
                    #endregion
                }));
            }
        }
예제 #24
0
 public GeneticAlgorithmTravelSalesman(CitiesCollection cities) : this()
 {
     Cities = cities;
 }
예제 #25
0
        public void BackgroundCalculate()
        {
            try
            {
                tmrTimer.Interval = 10;
                tmrTimer.Start();
                // Нужен для списка Табу
                AntAlgDataAnt ant = new AntAlgDataAnt();

                ant.TabuInit(Cities.Count);
                int iCurrentCity = 0;
                //ccRoute = new AntAlgDataCitiesCollection();
                //Cities[iCurrentCity].Index = iCurrentCity;
                City city = Cities[iCurrentCity];
                city.Index = iCurrentCity;
                ccRoute.Add(city);
                ccRoute.MaxDistance = _parameters.MaxDistance;
                DateTime dtStart = DateTime.Now;
                string   strOut;
                ant.TabuSet(iCurrentCity, 1);
                maxTime = Summ(Cities.Count);
                for (int i = 0; i < Cities.Count; i++)
                {
                    curTime = Summ(i);
                    double dCurrentDistance = double.MaxValue;
                    double dMinimum         = double.MaxValue;
                    int    iMinimum         = -1;
                    City   CityI            = Cities[iCurrentCity];
                    //CityI.Index = i;
                    for (int j = 0; j < Cities.Count; j++)
                    {
                        //if (ant.TabuGet(j) == 0 && j != i && (ccRoute.Count == 0 || PointIsNotFound(ccRoute, j)))
                        if (ant.TabuGet(j) != 1)
                        {
                            City CityJ = Cities[j];
                            // CityJ.Index = j;

                            dCurrentDistance = Cities.Distance[iCurrentCity, j];
                            // Math.Sqrt((Math.Pow(Math.Abs(CityI.X - CityJ.X), 2) +
                            //           (Math.Pow(Math.Abs(CityI.Y - CityJ.Y), 2))));
                            if (dCurrentDistance < dMinimum)
                            {
                                dMinimum = dCurrentDistance;
                                iMinimum = j;
                            }
                        }
                    }
                    if (iMinimum != -1)
                    {
                        iCurrentCity = iMinimum;
                        City city_temp = Cities[iCurrentCity];
                        city_temp.Index = iCurrentCity;
                        ccRoute.Add(city_temp);
                        ant.TabuSet(iCurrentCity, 1);
                        TimeSpan tsElapsed = (DateTime.Now - dtStart);
                        strOut = String.Format("{0:00000} ", i + 1) + String.Format(" Time is {0:00}s {1:000}ms", tsElapsed.Seconds, tsElapsed.Milliseconds) + "\n"; // Дописать!!!!!
                        listrTime.Add(strOut);
                    }
                }
                strOut = "\nОбщее время:\n" + String.Format("{0:t}", DateTime.Now - dtStart); // Дописать!!!!!
                listrTime.Add(strOut);
                tmrTimer.Stop();
                BestPath = ccRoute;
                OnFinally(EventArgs.Empty);
            }
            catch (ThreadAbortException taex)
            { listrTime.Add(taex.Message); }
            catch (Exception ex)
            { listrTime.Add(ex.Message); }
        }
예제 #26
0
 public NearestNeighbourTravelSalesman(CitiesCollection cities) : this()
 {
     Cities = cities;
 }
예제 #27
0
 public BranchAndBoundTravelSalesman(CitiesCollection cities, BnBParameters param) : this(cities)
 {
     _parameters = param;
 }
예제 #28
0
        /// <summary>
        /// Заполнить поля класса данными из NodeData ИЛИ CitiesCollection
        /// </summary>
        /// <param name="nodeData">Узел, копию данных которого создает функция</param>
        /// <param name="cities">Коллекция городов, из которой можно получить данные</param>
        /// <param name="withoutRow">Исключая строку с данным индексом. Значение -1 значит, что без исключений</param>
        /// <param name="withoutColumn">Исключая столбец с данным индексом. Значение -1 значит, что без исключений</param>
        private void DataFromOther(BnBNodeData nodeData, CitiesCollection cities, int withoutRow, int withoutColumn)
        {
            if (nodeData != null && cities != null)
            {
                throw new Exception("Получать данные можно либо из NodeData, либо из CitiesCollection");
            }
            BnBNodePath path = new BnBNodePath();

            // Выделяем память для массива дистанций
            if (cities != null)
            {
                _iDistLength = (int)Math.Sqrt((double)cities.Distance.Length);
            }
            else
            {
                _iDistLength = nodeData.Length;
            }

            if (withoutRow >= 0 && withoutColumn < 0
                ||
                withoutRow < 0 && withoutColumn >= 0) // задан для исключения только столбец или только строка
            {
                throw new Exception("Задан для исключения только столбец или только строка");
            }

            if (withoutRow >= 0 && withoutColumn >= 0) // исключаем строку и столбец. длина сокращается на 1
            {
                _iDistLength--;
            }
            _arrDistance = new CellData[Length, Length];

            // Массивы горизонтальных и вертикальных индексов
            _iArrHorIndexes = new int[Length];
            _iArrVerIndexes = new int[Length];


            int i, j, k, l;                          // индексы исходных данных, откуда происходит компирвоание

            for (i = 0, k = 0; i < Length; i++, k++) // проход по строкам массива дистанции
            {
                if (withoutRow == i)                 // пропускаем строку в исходных данных
                {
                    k++;
                }
                if (cities != null)
                {
                    // Заполняем массивы индексом значениями по умолчанию (1,2,3...n)
                    _iArrVerIndexes[i] = i;
                }
                else
                {
                    _iArrVerIndexes[i] = nodeData.VerIndexes[k];
                }
                for (j = 0, l = 0; j < Length; j++, l++) // проход по столбцам массива дистанции
                {
                    if (withoutColumn == j)              // пропускаем строку в исходных данных
                    {
                        l++;
                    }
                    CellData cell = new CellData();
                    if (cities != null)
                    {
                        _iArrHorIndexes[i] = i;
                        if (i == j) // главная дагональ
                        {
                            cell.Value = double.PositiveInfinity;
                        }
                        else
                        {
                            cell.Value = Convert.ToDouble(cities.Distance[i, j]);
                        }
                        cell.Pow = double.PositiveInfinity;
                    }
                    else
                    {
                        _iArrHorIndexes[j] = nodeData.HorIndexes[l];
                        cell.Value         = nodeData.Distance[k, l].Value;
                        cell.Pow           = nodeData.Distance[k, l].Pow;
                    }


                    _arrDistance[i, j] = cell;
                }
            }

            if (cities != null)
            {
                _dSumWeight = 0.0;
                _path       = new BnBNodePath();
            }
            else
            {
                _dSumWeight = nodeData.SummWeight;
                _path       = new BnBNodePath(nodeData.Path);
            }
        }