Changeset 22


Ignore:
Timestamp:
Oct 5, 2010, 5:14:37 PM (14 years ago)
Author:
gnappo
Message:

Implementata ricorsione corretta di MQI. Aggiunto parametro a linea di comando per la bisezione casuale.

Location:
src/main/java/weka/clusterers
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/weka/clusterers/MetisMQIClusterer.java

    r14 r22  
    3636         */
    3737        private Map<Node, Integer> nodeMap = null;
     38       
     39        /**
     40         * True if a random bisection must be used.
     41         */
     42        private boolean randomBisection = false;
    3843
    3944        /**
     
    4853                g.loadFromInstance(data);
    4954                Set<Set<Node>> clusters = GraphAlgorithms.metisMqi(g, numberOfClusters,
    50                                 sizeFinerGraph);
     55                                sizeFinerGraph, randomBisection);
    5156                setNumClusters(clusters.size());
    5257                int i = 0;
     
    118123                        setSizeFinerGraph(Integer.parseInt(optionString));
    119124                }
     125                optionString = Utils.getOption('R', options);
     126                setRandomBisection(Boolean.parseBoolean(optionString));
     127        }
     128
     129        private void setRandomBisection(boolean b) {
     130                this.randomBisection = b;
    120131        }
    121132
     
    134145                result.add("-S");
    135146                result.add("" + getSizeFinerGraph());
     147                result.add("-R");
    136148                return (String[]) result.toArray(new String[result.size()]);
    137149        }
  • src/main/java/weka/clusterers/forMetisMQI/GraphAlgorithms.java

    r21 r22  
    8080         * @param sizeFinerGraph
    8181         */
    82         static public Set<Set<Node>> metisMqi(UndirectedGraph g, int numberOfCluster, int sizeFinerGraph) {
     82        static public Set<Set<Node>> metisMqi(UndirectedGraph g, int numberOfCluster, int sizeFinerGraph, boolean randomBisection) {
    8383                System.out.println("Vertex count: " + g.getVertexCount());
    8484                System.out.println("Edges count: " + g.getEdgeCount());
     
    9595//              Util.viewGraph(g);
    9696                for (int i = 0; i < numberOfCluster; i++) {
    97                         Bisection partition = metis(g,sizeFinerGraph);
    98 //                      Bisection partition = new Bisection(g);
     97                        Bisection bisection = null;
     98                        if(!randomBisection)
     99                                bisection = metis(g,sizeFinerGraph);
     100                        else
     101                                bisection = new Bisection(g);
    99102                        System.out.print("Partizione iniziale: ");
    100                         System.out.print("V1: " + partition.getSubgraph().getVertexCount());
    101                         System.out.print(" V2: " + partition.getComplement().getVertexCount());
    102                         System.out.println(" EC: " + partition.edgeCut() * 0.5);
     103                        System.out.print("V1: " + bisection.getSubgraph().getVertexCount());
     104                        System.out.print(" V2: " + bisection.getComplement().getVertexCount());
     105                        System.out.println(" EC: " + bisection.edgeCut() * 0.5);
    103106                        System.out.println("Conductance: " +
    104                                         ((double)partition.edgeCut() / 2) / Math.min(partition.getSubgraph().totalDegree(),partition.getComplement().totalDegree()));
    105                         Set<Node> cluster = MQI.mqi(partition,true);
     107                                        ((double)bisection.edgeCut() / 2) / Math.min(bisection.getSubgraph().totalDegree(),bisection.getComplement().totalDegree()));
     108                        Set<Node> cluster = MQI.mqi(bisection,true);
    106109                       
    107110                        UndirectedGraph clusterGraph = new Subgraph(gclone,cluster).createInducedSubgraph();
     
    113116                        System.out.println("Conductance: " + newConductance);
    114117                       
    115                        
    116                         if(newConductance < 1) {
    117                                 System.out.println("CLUSTER "+ i + ":  V=" + clusterGraph.getVertexCount() + ", E=" + clusterGraph.getEdgeCount()+".");
    118                                 clusters.add(cluster);
    119                         }
     118                        System.out.println("CLUSTER "+ i + ":  V=" + clusterGraph.getVertexCount() + ", E=" + clusterGraph.getEdgeCount()+".");
     119                        clusters.add(cluster);
    120120                       
    121121                        System.out.println();
  • src/main/java/weka/clusterers/forMetisMQI/MQI.java

    r21 r22  
    8282        static private DirectedGraph<Node, Edge> prepareDirectedGraph(
    8383                        Bisection bisection, Node source, Node sink, boolean forConductance) {
    84                 Subgraph A = bisection.getLargerSubgraph();
    85                 Subgraph B = bisection.getSmallerSubgraph();
     84                Subgraph B = bisection.getLargerSubgraph();
     85                Subgraph A = bisection.getSmallerSubgraph();
    8686                int a = 0;
    8787                if (!forConductance)
    8888                        a = A.getVertexCount();
    8989                else {
    90                         a = Math.min(B.totalDegree(),A.totalDegree());
     90//                      a = Math.min(B.totalDegree(),A.totalDegree());
     91                        a = A.totalDegree();
    9192                }
    9293                int c = bisection.edgeCut() / 2;
     
    140141                        Node u = nodes.next();
    141142                        if(forConductance)
    142                                 //FIXME: CONTROLLAMI
    143143                                g.addEdge(new Edge(Integer.toString(id), 1, c * bisection.getGraph().degree(u)), u, sink);
    144144                        else
     
    161161                boolean finished = false;
    162162                Bisection bisection = partition;
    163                 Set<Node> cluster = new HashSet<Node>(partition.getLargerSubgraph()
     163                Set<Node> cluster = new HashSet<Node>(partition.getSmallerSubgraph()
    164164                                .createInducedSubgraph().getVertices());
     165//              System.out.println("IMPROVING SUBGRAPH: " + cluster);
    165166                int maxFlowThreshold = Integer.MAX_VALUE;
    166167                while (!finished) {
     
    192193                                                * bisection.edgeCut() / 2;
    193194                        else {
    194                                 maxFlowThreshold = Math.min(bisection.getLargerSubgraph().totalDegree(), bisection.getSmallerSubgraph().totalDegree());
     195//                              maxFlowThreshold = Math.min(bisection.getLargerSubgraph().totalDegree(), bisection.getSmallerSubgraph().totalDegree());
     196                                maxFlowThreshold = bisection.getSmallerSubgraph().totalDegree();
    195197                                maxFlowThreshold = maxFlowThreshold
    196198                                                * (bisection.edgeCut() / 2);
    197199                        }
    198200                        alg.evaluate();
    199                         Util.viewFlowGraph(directedGraph, edgeFlowMap);
     201//                      Util.viewFlowGraph(directedGraph, edgeFlowMap);
    200202                        System.out.println("MAX FLOW: " + alg.getMaxFlow() + " THRESHOLD: "
    201203                                        + maxFlowThreshold);
     
    207209                                bisection = new Bisection(new Subgraph(
    208210                                        bisection.getGraph(), cluster));
     211//                              System.out.println("REFINED BISECTION: " + bisection.toString());
    209212                        } else
    210213                                finished = true;
Note: See TracChangeset for help on using the changeset viewer.