source: src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java @ 17

Last change on this file since 17 was 17, checked in by gnappo, 14 years ago

Modificata strategia individuazione cluster: quelli trovati vengono rimossi.

File size: 2.3 KB
Line 
1package weka.clusterers.forMetisMQI;
2
3import java.util.HashSet;
4import java.util.Iterator;
5import java.util.Set;
6import java.util.Stack;
7
8import weka.clusterers.forMetisMQI.graph.Bisection;
9import weka.clusterers.forMetisMQI.graph.Node;
10import weka.clusterers.forMetisMQI.graph.UndirectedGraph;
11import weka.clusterers.forMetisMQI.util.CoarserGraphElement;
12import weka.clusterers.forMetisMQI.util.Util;
13
14public class GraphAlgorithms {
15
16       
17        /**
18         * Given an undirected graph, performs the Kernighan-Li algorithm to find a bisection and
19         * then returns it.
20         * @param g
21         * @return
22         */
23        static public Bisection KL(UndirectedGraph g) {
24                Bisection partition = new Bisection(g);
25                Bisection result = partition;
26                int bestEdgeCut = Integer.MAX_VALUE;
27                Node u = partition.getCandidate();
28                while (u != null) {
29                        partition.swap(u);
30                        if (partition.edgeCut() <= bestEdgeCut) {
31                                bestEdgeCut = partition.edgeCut();
32                                result = partition.copy();
33                        }
34                        u = partition.getCandidate();
35                }
36                return result;
37        }
38       
39        static public Bisection metis(UndirectedGraph g, int sizeFinerGraph) {
40                Coarse.setFinerSize(sizeFinerGraph);
41                Stack<CoarserGraphElement> stack = Coarse.coarse(g);
42                Bisection partition = null;
43                if (stack.size() > 0) {
44                        partition = KL(stack.peek().getContracted());
45                        partition = Uncoarse.uncoarse(stack, partition);
46                }
47                return partition;
48        }
49
50        /**
51         * Given an UndirectedGraph, runs metis+mqi for <code>numberOfCluster</code> times and
52         * returns a set of clusters. With the third parameter you can control the maximum size of the finer
53         * graph during the coarsening phase. 
54         * @param g
55         * @param numberOfCluster
56         * @param sizeFinerGraph
57         */
58        static public Set<Set<Node>> metisMqi(UndirectedGraph g, int numberOfCluster, int sizeFinerGraph) {
59                Set<Set<Node>> clusters = new HashSet<Set<Node>>();
60                UndirectedGraph gclone = g.clone();
61//              Util.viewGraph(g);
62                for (int i = 0; i < numberOfCluster; i++) {
63                        Bisection partition = metis(g,sizeFinerGraph);
64                        Set<Node> cluster = MQI.mqi(partition);
65                        Iterator<Node> clustersNode = cluster.iterator();
66                        while(clustersNode.hasNext()){
67                                g.removeVertex(clustersNode.next());
68                        }
69                       
70                       
71                        if(cluster.size()>10) {
72                                clusters.add(cluster);
73                        }
74                        System.out.println("CLUSTER "+ i + ": " + cluster);
75                }
76                Util.viewClusters(gclone, clusters);
77                return clusters;
78        }
79
80}
Note: See TracBrowser for help on using the repository browser.