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); }
/// <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); }
/// <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; } } } }
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); }
/// <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;} } }
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; }
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); }
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; }
/// <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; }
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(); }