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]); } }
/// <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); } }