/// <summary> /// Рассчитать базовые затраты на использование данного оборудования для формирования сети. /// </summary> /// <param name="project">Свойства проекта.</param> /// <param name="vertex">Вершина графа, в которой установлен инструмент.</param> /// <returns>Значение выбранных затрат на данный инструмент.</returns> public override double GetCost(Project project, TopologyVertex vertex) { try { var cost = base.GetCost(project, vertex); var laboriousnessFactor = 1 + vertex.LaboriousnessWeight / 10; // Если учитываем стоимость обслуживания или всё подряд if (project.MinimizationGoal == CostType.InstantAndMaintenanceMoney || project.MinimizationGoal == CostType.All) { // Если не используем местную рабочую силу и на участке нет питания или оно вообще не требуется, // то добавляем стоимость замены батареек за весь период эксплуатации if (!project.UseLocalEmployee && !(IsPowerRequired && vertex.Region.HasPower) && BatteryTime.TotalHours > 0) { cost += (new TimeSpan((int)project.UsageMonths * 30, 0, 0, 0).TotalHours / BatteryTime.TotalHours) * BatteryServicePrice * laboriousnessFactor; } } return(cost); } catch (Exception ex) { Console.WriteLine("AbstractDevice GetCost failed! {0}", ex.Message); return(TopologyFitness.UNACCEPTABLE); } }
/// <summary> /// Рассчитать затраты на использование данного УСПД для формирования сети. /// </summary> /// <param name="project">Свойства проекта.</param> /// <param name="vertex">Вершина графа, в которой установлен инструмент.</param> /// <returns>Значение выбранных затрат на данный инструмент.</returns> public override double GetCost(Project project, TopologyVertex vertex) { var cost = base.GetCost(project, vertex); try { if (!CanSendViaLocalNetwork(project, vertex.Region)) { var availableConnections = ServerConnections.Where(q => project.MobileInternetMonthlyPayment.ContainsKey(q)); if (!availableConnections.Any()) // Если в проекте не задано не одного тарифа мобильного Интернета, который поддерживается УСПД { return(TopologyFitness.UNACCEPTABLE); } // Берём самый дешёвый способ передачи данных cost += availableConnections.Min(q => project.MobileInternetMonthlyPayment[q]) * project.UsageMonths; cost += PurchasePrice * (vertex.Region.BadMobileInternetSignal == 1 ? 0 : vertex.Region.BadMobileInternetSignal / 10); // Учитываем затраты на плохую связь } } catch (Exception ex) { Console.WriteLine("DataAcquisitionDevice GetCost failed! {0}", ex.Message); } return(cost); }
/// <summary> /// Рассчитать базовые затраты на использование данного КПД на одном узле для формирования сети. /// </summary> /// <param name="project">Свойства проекта.</param> /// <param name="vertex">Вершина графа, в которой установлен инструмент.</param> /// <returns>Значение выбранных затрат на данный инструмент.</returns> public override double GetCost(Project project, TopologyVertex vertex) { try { switch (ConnectionType) { case ConnectionType.Wired: return(base.GetCost(project, vertex)); case ConnectionType.Wireless: return(0); // Для беспроводной связи проведение в вершине ничего не стоит case ConnectionType.None: return(1); default: return(TopologyFitness.UNACCEPTABLE); } } catch (Exception ex) { Console.WriteLine("DataChannel GetCost failed! {0}", ex.Message); return(TopologyFitness.UNACCEPTABLE); } }
/// <summary> /// Декодировать вершину графа части секции. /// </summary> /// <param name="project">Текущий используемый проект.</param> /// <param name="vertexGene">Ген, характеризующий вершину графа части секции.</param> protected void DecodeVertex(Project project, int vertexGene) { try { Vertex = project.Graph.VerticesArray[vertexGene]; } catch (Exception ex) { Console.WriteLine("AbstractTopologySectionPart DecodeVertex failed! {0}", ex.Message); } }
/// <summary> /// Рассчитать базовые затраты на использование данного инструмента для формирования сети. /// </summary> /// <param name="project">Свойства проекта.</param> /// <param name="vertex">Вершина графа, в которой установлен инструмент.</param> /// <returns>Значение затрат на внедрение данного инструмента.</returns> public virtual double GetCost(Project project, TopologyVertex vertex) { try { return(GetCost(project, 1 + vertex.LaboriousnessWeight / 10)); // В худшем случае затраты могут возрасти в 4 раза } catch (Exception ex) { Console.WriteLine("AbstractEquipment GetCost failed! {0}", ex.Message); return(TopologyFitness.UNACCEPTABLE); } }
/// <summary> /// Создать матрицу вершин участков для будущего графа. /// </summary> /// <returns>Матрица вершин участков бдущего графа.</returns> protected TopologyVertex[,] CreateVerticesMatrix() { Console.Write("Create regions matrix... "); try { var verticesMatrix = new TopologyVertex[Height, Width]; foreach (var region in Regions) // Перебираем все имеющиеся регионы { // Определяем начальные и конечные координаты участков в матрице var startX = region.X - 1; // В конфигурационном файле координаты начинаются с 1 var startY = region.Y - 1; var endX = startX + region.Width; var endY = startY + region.Height; for (var i = startY; i < endY; i++) // Наполняем матрицу идентификаторами участков по координатам { for (var j = startX; j < endX; j++) { // Создаём вершину, привязанную к учаску и задаём её координаты внутри самого участка // +1 из-за того, что в конфигурационном файле координаты начинаются с 1 verticesMatrix[i, j] = new TopologyVertex(region, j - region.X + 1, i - region.Y + 1, GetMCZsInVertex(j + 1, i + 1)); } } } Console.WriteLine("Done! Result matix: "); for (var i = 0; i < Height; i++) // Выводим матрицу идентификаторов регионов в вершинах для наглядности { for (var j = 0; j < Width; j++) { // Делаем отступ исходя из строкового представления вершины и максимально трёхзначного идентификатора участка Console.Write("{0,8}", verticesMatrix[i, j].ToString()); } Console.WriteLine(); } return(verticesMatrix); } catch (Exception ex) { Console.WriteLine("CreateVerticesMatrix failed! {0}", ex.Message); return(new TopologyVertex[, ] { }); } }
/// <summary> /// Переместить данную часть секции с УСПД в другую вершину. /// </summary> /// <param name="newVertex">Вершина графа, в которую осуществляется перемещение.</param> public void Move(TopologyVertex newVertex) { Vertex = newVertex; }