/// <summary> /// Копирует из данных узла /// </summary> /// <param name="nodeData">данные узла</param> public BnBNodeData(BnBNodeData nodeData) { try { DataFromOther(nodeData, null, -1, -1); } catch (Exception ex) { throw new Exception(ex.Message); } }
/// <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); }
/// <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); } }
public BnBNode(BnBNode parent, BnBNodeData data) : this(parent) { Data = data; }
/// <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); } }