예제 #1
0
        Matrix graph;   // A

        /// <summary>
        ///   ?? 包含本身嘛?
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private int getEdgesCount(NodeBean node)
        {
            int r     = int.Parse(node.id);
            int count = 0;

            for (int j = 0; j < graph.Cols; j++)
            {
                if (!graph.getMNode(r, j).Value.Equals(0))
                {
                    count++;
                }
            }
            return(count);
        }
예제 #2
0
        /// <summary>
        /// 获取下三角矩阵的最小值,并记录其位置
        /// </summary>
        /// <param name="mat"></param>
        /// <param name="r"></param>
        /// <param name="c"></param>
        /// <returns></returns>
        private double getSubTriangleleMin(Matrix mat, ref int r, ref int c)
        {
            double min = double.MaxValue;

            for (int i = 0; i < mat.Rows; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    if (mat.getMNode(i, j).Value < min)
                    {
                        r   = i; c = j;
                        min = mat.getMNode(i, j).Value;
                    }
                }
            }
            return(min);
        }
예제 #3
0
        /// <summary>
        ///  初始化matrix(取值为 0 或者 1)
        /// </summary>
        public void initialize()
        {
            int count = MyXml.getNodesCount();

            graph = new Matrix(count, count);
            for (int i = 0; i < graph.Rows; i++)
            {
                for (int j = 0; j < graph.Cols; j++)
                {
                    MNode node = graph.getMNode(i, j);
                    node.SName = i.ToString();
                    node.EName = j.ToString();

                    LinkBean bean = new LinkBean();     // 正向
                    bean.source = MyXml.findNodeById(node.SName);
                    bean.target = MyXml.findNodeById(node.EName);

                    LinkBean bean_2 = new LinkBean();   // 反向
                    bean_2.source = MyXml.findNodeById(node.EName);
                    bean_2.target = MyXml.findNodeById(node.SName);

                    foreach (LinkBean lb in MyXml.getAllLinks())
                    {
                        if (lb.Equals(bean) || lb.Equals(bean_2))
                        {
                            node.Value = 1;
                            break;
                        }
                    }
                }
            }

            for (int i = 0; i < graph.Rows; i++)
            {
                for (int j = 0; j < graph.Cols; j++)
                {
                    if (i == j)
                    {
                        graph.getMNode(i, j).Value = 1; continue;
                    }
                }
            }
        }
예제 #4
0
        private Matrix initializeDistance(Matrix src)
        {
            Matrix res = new Matrix(src);

            for (int i = 0; i < src.Rows; i++)
            {
                for (int j = 0; j < src.Cols; j++)
                {
                    res.getMNode(i, j).Value = 1 - Math.Sqrt(src.getMNode(i, j).Value);
                }
            }

            return(res);
        }
예제 #5
0
파일: Similarity.cs 프로젝트: soulzhao/ORA
        /// <summary>
        ///  初始化matrix(取值为 0 或者 1)
        /// </summary>
        public void initialize()
        {
            int count = MyXml.getNodesCount();
            graph = new Matrix(count, count);
            for (int i = 0; i < graph.Rows; i++)
            {
                for (int j = 0; j < graph.Cols; j++)
                {
                    MNode node = graph.getMNode(i, j);
                    node.SName = i.ToString();
                    node.EName = j.ToString();

                    LinkBean bean = new LinkBean();     // 正向
                    bean.source = MyXml.findNodeById(node.SName);
                    bean.target = MyXml.findNodeById(node.EName);

                    LinkBean bean_2 = new LinkBean();   // 反向
                    bean_2.source = MyXml.findNodeById(node.EName);
                    bean_2.target = MyXml.findNodeById(node.SName);

                    foreach (LinkBean lb in MyXml.getAllLinks())
                    {
                        if (lb.Equals(bean) || lb.Equals(bean_2))
                        {
                            node.Value = 1;
                            break;
                        }
                    }
                }
            }

            for (int i = 0; i < graph.Rows; i++){
                for (int j = 0; j < graph.Cols; j++)
                    if (i == j) {graph.getMNode(i, j).Value = 1; continue;}
            }
        }
예제 #6
0
파일: Similarity.cs 프로젝트: soulzhao/ORA
        Matrix graph; // A

        #endregion Fields

        #region Methods

        public Matrix GetSimilarityMatrix()
        {
            Matrix mat = new Matrix(graph.Rows, graph.Cols);
            for (int i = 0; i < graph.Rows; i++ )
            {
                for (int j = 0; j < graph.Cols; j++)
                {
                    MNode node = mat.getMNode(i, j);
                    node.Value = getSimilarity(i, j);
                }
            }

            System.Console.WriteLine("****************  相似度矩阵   ***********************");
            mat.Print();
            System.Console.WriteLine("****************************************************");
            return mat;
        }
예제 #7
0
        public Matrix GetSimilarityMatrix()
        {
            Matrix mat = new Matrix(graph.Rows, graph.Cols);

            for (int i = 0; i < graph.Rows; i++)
            {
                for (int j = 0; j < graph.Cols; j++)
                {
                    MNode node = mat.getMNode(i, j);
                    node.Value = getSimilarity(i, j);
                }
            }

            System.Console.WriteLine("****************  相似度矩阵   ***********************");
            mat.Print();
            System.Console.WriteLine("****************************************************");
            return(mat);
        }
예제 #8
0
파일: Ward.cs 프로젝트: soulzhao/ORA
        private Matrix initializeDistance(Matrix src)
        {
            Matrix res = new Matrix(src);

            for (int i = 0; i < src.Rows; i++)
            {
                for (int j = 0; j < src.Cols; j++)
                {
                    res.getMNode(i, j).Value = 1 - Math.Sqrt(src.getMNode(i, j).Value);
                }
            }

            return res;
        }
예제 #9
0
파일: Ward.cs 프로젝트: soulzhao/ORA
 /// <summary>
 /// 获取下三角矩阵的最小值,并记录其位置
 /// </summary>
 /// <param name="mat"></param>
 /// <param name="r"></param>
 /// <param name="c"></param>
 /// <returns></returns>
 private double getSubTriangleleMin(Matrix mat, ref int r, ref int c)
 {
     double min = double.MaxValue;
     for (int i = 0; i < mat.Rows; i++ )
     {
         for (int j = 0; j < i; j++ )
         {
             if (mat.getMNode(i, j).Value < min)
             {
                 r = i; c = j;
                 min = mat.getMNode(i, j).Value;
             }
         }
     }
     return min;
 }
예제 #10
0
        public void calculateWard(object obj)
        {
            simi.initialize();
            Matrix smax = simi.GetSimilarityMatrix(); // 计算全矩阵的相似度
            Matrix D    = initializeDistance(smax);

            initializeGroups();

            onGroupClustered(absoluteC());

            do
            {
                #region 线程控制操作
                if (!this.StopEvent.WaitOne(0))     // 如果Stop没有置位的话就进入条件判断语句
                {
                    if (this.PauseEvent.WaitOne(0)) // 如果Pause置位了,那么就进入条件等待Resume置位
                    {
                        this.ResumeEvent.WaitOne();
                    }
                }
                else
                {
                    break;
                }
                #endregion

                int    i = 0, j = 0;
                double min = getSubTriangleleMin(D, ref i, ref j);

                for (int k = 0; k < absoluteC(); k++)
                {
                    if (k == i || k == j)
                    {
                        continue;
                    }

                    int Ni = N(i), Nk = N(k), Nj = N(j);

                    double value =
                        (((Ni + Nk) * D.getMNode(i, k).Value) + ((Nj + Nk) * D.getMNode(j, k).Value) - (Nk * D.getMNode(i, j).Value))
                        / (Ni + Nj + Nk);

                    if (k < i)
                    {
                        D.getMNode(i, k).Value = value;
                    }
                    else
                    {
                        D.getMNode(k, i).Value = value;
                    }
                }

                lstC.Add(newC(C(i), C(j)));

                D.reduceMatrixByIndex(j);

                // 触发外界的事件
                onGroupClustered(absoluteC());
            } while (absoluteC() > 1);

            onGroupclusteredFinished();
        }