Esempio n. 1
0
 /// <summary>
 /// Копирует из данных узла
 /// </summary>
 /// <param name="nodeData">данные узла</param>
 public BnBNodeData(BnBNodeData nodeData)
 {
     try
     {
         DataFromOther(nodeData, null, -1, -1);
     }
     catch (Exception ex)
     {
         throw new Exception(ex.Message);
     }
 }
Esempio n. 2
0
        /// <summary>
        /// Получить копию данного экземпляра класса
        /// </summary>
        /// <returns>Объект NodeData, заполненный данными как в текущем экземпляре класса</returns>
        public object Clone()
        {
            BnBNodeData cloneData = new BnBNodeData();

            try
            {
                cloneData.DataFromOther(this, null, -1, -1);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            return(cloneData);
        }
Esempio n. 3
0
 /// <summary>
 /// Копирует из данных узла, исключая определенную строку и столбец
 /// </summary>
 /// <param name="nodeData">Данные узла дерева, из которых нужно получить копию</param>
 /// <param name="indexRow">Индекс строки, которую НЕ нужно копировать</param>
 /// <param name="indexColumn">Индекс столбца, который НЕ нужно копировать</param>
 public BnBNodeData(BnBNodeData nodeData, int indexRow, int indexColumn)
 {
     if (indexColumn < 0 || indexRow < 0)
     {
         throw new Exception("Индексы удаляемых строки и столбца должны быть положительными");
     }
     try
     {
         DataFromOther(nodeData, null, indexRow, indexColumn);
     }
     catch (Exception ex)
     {
         throw new Exception(ex.Message);
     }
 }
Esempio n. 4
0
 public BnBNode(BnBNode parent, BnBNodeData data)
     : this(parent)
 {
     Data = data;
 }
Esempio n. 5
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);
            }
        }