Java计算图的匹配率
Posted 邗影
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java计算图的匹配率相关的知识,希望对你有一定的参考价值。
2016-07-02
大概意思就是这样了,代码里我貌似没有计算最后一步,但是原理都是一样的、、、、、R1有5个点P1有四个点,他们共同的点是4个,那就是共同点4*4/(R1的5个点*P1的四个点就是0.8啦)
我这个代码又一个投机取巧的地方,就是你算两个图的最大共有连通子图的时候,不单单要两个图都有这些点,这些点所连接得边其实也是必须一样,我这里就是找有公共的点但是这些点连接的边是否都有我并没考虑。。。。。。。。
1 import java.text.DecimalFormat; 2 import java.util.ArrayList; 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class catchmain { 7 void initgraph(int a,catchrate []pis) 8 { 9 for(int z=1;z<=a;z++) 10 11 { 12 13 System.out.println("请输入该组第"+z+"个图的节点数:"); 14 Scanner cinn=new Scanner(System.in); 15 int n,e;//分别代表结点个数和边的数 16 n=cinn.nextInt(); 17 System.out.println("请输入该组第"+z+"个图的起始点char型表示:"); 18 Scanner cinn2=new Scanner(System.in); 19 String str=cinn2.next(); 20 //String labels[]=new String[n];//结点的标识 21 catchrate graph=new catchrate(n); 22 // pis[z-1]=graph; 23 24 for(int i=0;i<n;i++) { 25 char sss=(char)(str.charAt(0)+i); 26 27 graph.insertVertex(sss);//插入结点 28 } 29 //插入e条边 30 System.out.println("请输入该组第"+z+"个图的边数:"); 31 Scanner cinn3=new Scanner(System.in); 32 e=cinn3.nextInt(); 33 for(int aa=0;aa<e;aa++) 34 { 35 System.out.println("from:"); 36 Scanner top=new Scanner(System.in); 37 System.out.println("to:"); 38 Scanner bottom=new Scanner(System.in); 39 graph.insertEdge(top.nextInt()-1, bottom.nextInt()-1, 1); 40 } 41 42 System.out.println("结点个数是:"+graph.getNumOfVertex()); 43 System.out.println("边的个数是:"+graph.getNumOfEdges()); 44 pis[z-1]=graph; 45 } 46 47 48 } 49 public Object clone() 50 { 51 Object o=null; 52 try 53 { 54 o=(ArrayList)super.clone();//Object 中的clone()识别出你要复制的是哪一个对象。 55 } 56 catch(CloneNotSupportedException e) 57 { 58 System.out.println(e.toString()); 59 } 60 return o; 61 } 62 int Jiao(ArrayList A,ArrayList B) 63 { 64 ArrayList temp=new ArrayList(A.size()); 65 66 temp=(ArrayList) A.clone(); 67 //System.out.print(A.size()+",,,"+temp.size()); 68 temp.retainAll(B); 69 //System.out.println(temp); 70 //System.out.print(A.size()+",,,"+temp.size()); 71 return temp.size(); 72 } 73 public static void main(String args[]) { 74 catchmain A=new catchmain(); 75 76 System.out.print("第一组图的个数:"); 77 Scanner cin=new Scanner(System.in); 78 int numgraph=cin.nextInt(); 79 80 catchrate pis1[]=new catchrate[numgraph]; 81 A.initgraph(numgraph,pis1); 82 83 //............................................ 84 System.out.print("第2组图的个数:"); 85 Scanner con=new Scanner(System.in); 86 int numg2=cin.nextInt(); 87 88 catchrate pis2[]=new catchrate[numg2]; 89 A.initgraph(numg2,pis2); 90 91 //取两个图的交集retainall、、边的交集也要比对是否存在,这里为了方便假设点交集中所有的连接边 92 //在R中有的边在p中也都有,免去边求交集的步骤。 93 for(int i=0;i<numgraph;i++) 94 { 95 for(int j=0;j<numg2;j++) 96 { 97 int result=A.Jiao(pis1[i].getarraylist(),pis2[j].getarraylist()); 98 System.out.println("公共节点数:"+result); 99 System.out.println("num of node everygraph:"+pis1[i].getarraylist().size()+"....."+pis2[j].getarraylist().size()); 100 int fenmu=(pis1[i].getarraylist().size())*(pis2[j].getarraylist().size()); 101 float rate=(float)(result*result)/(fenmu); 102 float b = (float)(Math.round(rate*100))/100; 103 System.out.println("第一组"+(i+1)+"图和第二组"+(j+1)+"图的匹配率为"+b); 104 } 105 } 106 107 } 108 }
import java.util.ArrayList; import java.util.LinkedList; /** * @description 邻接矩阵模型类 * @author beanlam * @time 2015.4.17 */ public class catchrate { private ArrayList vertexList;//存储点的链表 private int[][] edges;//邻接矩阵,用来存储边 private int numOfEdges;//边的数目 public catchrate(int n) { //初始化矩阵,一维数组,和边的数目 edges=new int[n][n]; vertexList=new ArrayList(n); numOfEdges=0; } public ArrayList getarraylist() { return vertexList; } //得到结点的个数 public int getNumOfVertex() { return vertexList.size(); } //得到边的数目 public int getNumOfEdges() { return numOfEdges; } //返回结点i的数据 public Object getValueByIndex(int i) { return vertexList.get(i); } //返回v1,v2的权值 public int getWeight(int v1,int v2) { return edges[v1][v2]; } //插入结点 public void insertVertex(Object vertex) { vertexList.add(vertexList.size(),vertex); } //插入边 public void insertEdge(int v1,int v2,int weight) { edges[v1][v2]=weight; edges[v2][v1]=weight; numOfEdges++; } //删除边 public void deleteEdge(int v1,int v2) { edges[v1][v2]=0; numOfEdges--; } //得到第一个邻接结点的下标 public int getFirstNeighbor(int index) { for(int j=0;j<vertexList.size();j++) { if (edges[index][j]>0) { return j; } } return -1; } //根据前一个邻接结点的下标来取得下一个邻接结点 public int getNextNeighbor(int v1,int v2) { for (int j=v2+1;j<vertexList.size();j++) { if (edges[v1][j]>0) { return j; } } return -1; } }
这个代码是自己输入图图的顶点图得边以及每个组有几个图,我没有仔细试试,估计错误会有很多,网批评指正吧。
以上是关于Java计算图的匹配率的主要内容,如果未能解决你的问题,请参考以下文章