/// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
            }
        }
Ejemplo n.º 4
0
 /// <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);
     }
 }
Ejemplo n.º 5
0
 /// <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);
     }
 }
Ejemplo n.º 6
0
        /// <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[, ] {
                });
            }
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Переместить данную часть секции с УСПД в другую вершину.
 /// </summary>
 /// <param name="newVertex">Вершина графа, в которую осуществляется перемещение.</param>
 public void Move(TopologyVertex newVertex)
 {
     Vertex = newVertex;
 }