void CMatrixGen::CreateChains() { // Перед построением новых цепей, убедимся, что предыдущие цепи удалены m_Chains.clear(); double Yii; double Yimj; double Yij; double Yimi; int nodeIdx = 0; // 1. Просто создадим цепи for (int chainIdx = 0; chainIdx < m_ChainNodesNumber.size(); chainIdx++) { Chain Current; Current.ChainNumber = chainIdx; Current.NodesNumber = m_ChainNodesNumber[chainIdx]; Current.StartNode = nodeIdx; vector<double> NewVec(m_ChainNodesNumber[chainIdx]); Current.RightVector = NewVec; Yimj = 0.0; for (int nodeNumber = 0; nodeNumber < m_ChainNodesNumber[chainIdx]; nodeNumber++) { Yij = GetRandomAdmittance(); Yii = -Yij - Yimj; Current.ChainMatrix.AddElement(Yii, nodeIdx, nodeIdx); if (nodeNumber == m_ChainNodesNumber[chainIdx] - 1) { nodeIdx++; break; } Current.ChainMatrix.AddElement(Yij, nodeIdx, nodeIdx + 1); Current.ChainMatrix.AddElement(Yij, nodeIdx + 1, nodeIdx); Yimj = Yij; nodeIdx++; } Current.CopyChainMatrixToMainMatrix(); m_Chains.push_back(Current); } // 2. Накидаем в цепь связей, обеспечивающих связность сети в целом //for (int chainIdx = 1; chainIdx < m_Chains.size(); chainIdx++) //{ // // У каждой цепи должна быть хотябы одна связь // int NewLink = RandomInt(0, chainIdx - 1); // Выбрать нужно цепь, из тех, что уже в связной области // // Случайно выберем откуда и куда придут связи внутри заданных цепей NewLink и chainIdx // int NodeFrom = RandomInt(m_Chains[chainIdx].StartNode, m_Chains[chainIdx].StartNode + m_Chains[chainIdx].NodesNumber - 1); // int NodeTo = RandomInt(m_Chains[NewLink].StartNode, m_Chains[NewLink].StartNode + m_Chains[NewLink].NodesNumber - 1); // double NewLinkAdmittance = GetRandomAdmittance(); // for (int elementIdx = 0; elementIdx < m_Chains[chainIdx].ChainMatrix.row_idx.size(); elementIdx++) // { // int elementCol = m_Chains[chainIdx].ChainMatrix.col_idx[elementIdx]; // int elementRow = m_Chains[chainIdx].ChainMatrix.row_idx[elementIdx]; // if (elementRow == NodeFrom && // elementRow == elementCol) // { // m_Chains[chainIdx].ChainMatrix.val[elementIdx] -= NewLinkAdmittance; // m_Chains[chainIdx].ChainMatrix.AddElementInto(NewLinkAdmittance, NodeFrom, NodeTo); // break; // } // } // for (int elementIdx = 0; elementIdx < m_Chains[NewLink].ChainMatrix.row_idx.size(); elementIdx++) // { // int elementCol = m_Chains[NewLink].ChainMatrix.col_idx[elementIdx]; // int elementRow = m_Chains[NewLink].ChainMatrix.row_idx[elementIdx]; // if (elementRow == NodeTo && // elementRow == elementCol) // { // m_Chains[NewLink].ChainMatrix.val[elementIdx] -= NewLinkAdmittance; // m_Chains[NewLink].ChainMatrix.AddElementInto(NewLinkAdmittance, NodeTo, NodeFrom); // break; // } // } // m_RandomNetAdmittancesLeft--; //} }