/// <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(); // обновляем прорисовку } }
/// <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; }
public NearestNeighbourTravelSalesman(CitiesCollection cities, AntParameters param) : this(cities) { SetParameters(param); tmrTimer = new System.Timers.Timer(10); //инициализация таймера tmrTimer.Elapsed += new ElapsedEventHandler(tmrTimer_Elapsed); //подписка на событие таймера "Elapsed" }
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); } } }
public void StartAsync(CitiesCollection cities, IParameters parameters) { Init(cities, parameters); timeStart = DateTime.Now; // Зпуск алгоритма _travelSalesmanBnB.CalculateAsync(); }
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" }
/// <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(); }
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" }
/// <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)); } }
/// <summary> /// Переводит данные из коллекции городов в тип данные узла /// </summary> /// <param name="cities">коллекция городов</param> public BnBNodeData(CitiesCollection cities) { try { DataFromOther(null, cities, -1, -1); } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <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(); // Результаты }
/// <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("Число городов в агентах не совпадает!"); } }
/// <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; } }
/// <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); }
/// <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); }
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, "генетический алгоритм"); }
/// <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); }
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)) { } } }
public BranchAndBoundTravelSalesman(CitiesCollection cities) : this() { Cities = cities; }
public AntAlgTravelSalesman(CitiesCollection cities) : this() { Cities = cities; }
public ProceduralCityGenerator() { this.Cities = new CitiesCollection(); this.CityTypes = new CityTypesCollection(); this.DefaultCityTypes(); } //New
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 })); } }
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 })); } }
public GeneticAlgorithmTravelSalesman(CitiesCollection cities) : this() { Cities = cities; }
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); } }
public NearestNeighbourTravelSalesman(CitiesCollection cities) : this() { Cities = cities; }
public BranchAndBoundTravelSalesman(CitiesCollection cities, BnBParameters param) : this(cities) { _parameters = param; }
/// <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); } }