예제 #1
0
 public BnBNodePath(BnBNodePath path) : this()
 {
     for (int i = 0; i < path.Arc.Count; i++)
     {
         _liArc.Add(path.Arc[i]);
     }
     for (int i = 0; i < path.PiePath.Count; i++)
     {
         _piePath.Add(path.PiePath[i]);
     }
 }
예제 #2
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);
            }
        }