Exemplo n.º 1
0
        /*
         * Function: SW_RandomReLink
         * Description:随机重连函数
         * Parameters:
         *      ref cNet cNetwork   待处理网络
         *      int iNum    网络节点总数
         *      int iNei   待连接邻居数
         *      int iPro   重连概率
         * Return Value:
         */
        private void SW_RandomReLink(ref cNet cNetwork, int iNum, int iNei, int iPro)//随机重连
        {
            int intTarget, newTarget, intPoint, intCount;
            Random magic1, magic2;
            int[] tmp, mapTmp;
            int i, j;

            for (i = 0; i < iNum; i++)
            {//遍历网络中所有节点
                intPoint = cNetwork.Network[i].Degree;
                tmp = new int[intPoint];
                mapTmp = new int[intPoint];
                intCount = 0;
                foreach (Edge edge in cNetwork.Network[i])
                {//遍历节点所有连边,并记录下来
                    tmp[intCount] = edge.Target;
                    mapTmp[intCount] = 0;
                    intCount += 1;
                }
                for (j = 0; j < intPoint; j++)
                {//针对每条边计算是否需要重连
                    intTarget = tmp[j];
                    magic1 = new Random(DateTime.Now.Millisecond * i * intTarget);
                    if (magic1.Next(0, 100) < iPro)
                    {
                        do
                        {
                            magic2 = new Random(DateTime.Now.Millisecond * magic1.Next(10, 100));
                            newTarget = magic1.Next(0, iNum-1);
                        } while (intTarget == newTarget || cNetwork.Network[i].Contains(newTarget) == true);
                    }
                }
                for (j = 0; j < intPoint; j++)
                {
                    if (mapTmp[j] > 0)
                    {//符合重连条件的进行重连
                        cNetwork.DecEdge(i, tmp[j]);
                        cNetwork.AddEdge(i, mapTmp[j], 1);
                    }
                }
            }
        }