Пример #1
0
        // 随机攻击某一个节点
        public static List <List <string> > RandomAttack(List <List <string> > data, int index)
        {
            // 由于data不能发生变化, 所以在这里要创建data的副本
            List <List <string> > duplicateData = CommonUtils.getDuplicateData(data);

            // 攻击某个节点即在duplicateData中删除某个节点
            GraphUtils.removeNode(duplicateData, index);
            return(duplicateData);
        }
Пример #2
0
        // 计算每一个节点的coreness
        public static List <int> getNodeCoreness(List <List <string> > data)
        {
            // 若最大的度为m,则每一个节点的coreness必在0~m之间
            List <int> allCoreness = new List <int>();

            // 先初始化每一个节点的coreness
            for (int i = 0; i < data.Count; i++)
            {
                allCoreness.Add(0);
            }
            // 由于各个方法中关于data的传递全部是引用传递,
            // 而这里需要修改data中的内容,所以最好再开辟新的空间来存放一个data
            List <List <string> > duplicateData = CommonUtils.getDuplicateData(data);
            // 计算最大的度
            int maxDegree = GraphUtils.getMaxDegree(duplicateData);
            // 判断节点是否被移除
            Boolean isRemove;

            // 从度为0一直移除到度为maxDegree, 也就是从0-coreness图一直计算到k-coreness图
            for (int k = 0; k <= maxDegree + 1; k++)
            {
                // 开始计算k-coreness图
                List <int> allDegree = GraphUtils.getAllDegree(duplicateData);
                isRemove = false;
                for (int i = 0; i < duplicateData.Count; i++)
                {
                    // 如果该点没有被移除
                    if (!(duplicateData[i][i].Equals("r")))
                    {
                        if (allDegree[i] < k)
                        {
                            allCoreness[i] = k - 1;
                            //移除该点, 这里仍需要传入该节点的标号
                            GraphUtils.removeNode(duplicateData, i + 1);
                            // 各个点的度很可能已经发生变化,需要重新计算各个点的度
                            isRemove = true;
                            break;
                        }
                        // 如果该点的度>=k
                        else
                        {
                            allCoreness[i] = k;
                        }
                    }
                }
                if (isRemove)
                {
                    k--;
                }
            }
            return(allCoreness);
        }
Пример #3
0
        //计算子图
        public static List <List <int> > getAllSubgraph(List <List <string> > data)
        {
            List <List <int> >    allSubgraph   = new List <List <int> >();
            List <List <string> > duplicateData = CommonUtils.getDuplicateData(data);

            // 只要图不为空,就一直去找子图
            while (!GraphUtils.isAllRemove(duplicateData))
            {
                List <int> subgraph = GraphUtils.getSubgraph(duplicateData);
                allSubgraph.Add(subgraph);
                // 删除该子图中所有节点
                foreach (int index in subgraph)
                {
                    GraphUtils.removeNode(duplicateData, index);
                }
            }
            return(allSubgraph);
        }