Exemple #1
0
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--;
	//}
}