Ignore:
Timestamp:
Sep 16, 2010, 10:44:40 AM (14 years ago)
Author:
gnappo
Message:

Un po' di refactoring e implementazione dell'algoritmo di raffinamento.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/main/java/weka/clusterers/forMetisMQI/MQI.java

    r10 r11  
    22
    33import java.awt.Dimension;
     4import java.util.HashMap;
    45import java.util.Iterator;
     6import java.util.Map;
     7import java.util.Set;
    58
    69import javax.swing.JFrame;
    710
     11import org.apache.commons.collections15.Factory;
     12import org.apache.commons.collections15.Transformer;
     13
     14import weka.clusterers.forMetisMQI.graph.Bisection;
     15import weka.clusterers.forMetisMQI.graph.Edge;
     16import weka.clusterers.forMetisMQI.graph.Node;
     17import weka.clusterers.forMetisMQI.graph.Subgraph;
     18import weka.clusterers.forMetisMQI.graph.UndirectedGraph;
     19import edu.uci.ics.jung.algorithms.flows.EdmondsKarpMaxFlow;
    820import edu.uci.ics.jung.algorithms.layout.KKLayout;
    921import edu.uci.ics.jung.algorithms.layout.Layout;
     22import edu.uci.ics.jung.graph.DirectedGraph;
    1023import edu.uci.ics.jung.graph.DirectedSparseGraph;
    1124import edu.uci.ics.jung.graph.Graph;
     
    1528public class MQI {
    1629       
     30        static int i = -1;
     31       
    1732        public static void viewGraph(Graph<Node, Edge> g){
    1833                Layout<Node, Edge> layout = new KKLayout<Node, Edge>(g);
    19                 layout.setSize(new Dimension(300,300)); // sets the initial size of the space
     34                layout.setSize(new Dimension(800,600)); // sets the initial size of the space
    2035                // The BasicVisualizationServer<V,E> is parameterized by the edge types
    2136                BasicVisualizationServer<Node,Edge> vv =
    2237                new BasicVisualizationServer<Node,Edge>(layout);
    23                 vv.setPreferredSize(new Dimension(350,350)); //Sets the viewing area size
     38                vv.setPreferredSize(new Dimension(800,600)); //Sets the viewing area size
    2439                vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>());
    2540                vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<Edge>());
     
    3146                frame.setVisible(true);
    3247        }
     48
     49        /**
     50         * Given a bisection, returns the cardinality of the larger subgraph.
     51         * @param b
     52         * @return
     53         */
     54        static private int getMaxCardinality(Bisection b) {
     55                Subgraph A = null;
     56                if(b.getSubgraph().getVertexCount() > b.getComplement().getVertexCount()) {
     57                        A = b.getSubgraph();
     58                }
     59                else {
     60                        A = b.getComplement();
     61                }
     62                return A.getVertexCount();
     63        }
    3364       
    34         static public void start(KLPartition partition) {
     65        static private DirectedGraph<Node,       Edge> prepareDirectedGraph(Bisection partition, Node source, Node sink) {
    3566                Subgraph A = null;
    3667                Subgraph B = null;
     
    4475                }
    4576                int a = A.getVertexCount();
    46                 int c = partition.edgeCut();
     77                int c = partition.edgeCut() / 2;
    4778               
    4879               
    49                 Graph<Node,Edge> g = new DirectedSparseGraph<Node, Edge>();
     80                DirectedGraph<Node,Edge> g = new DirectedSparseGraph<Node, Edge>();
    5081                Iterator<Node> nodes =  A.iterator();
    5182                while(nodes.hasNext()) {
     
    6697                }
    6798               
    68                 Node source = new Node("S");
    69                 Node sink = new Node("T");
    7099                g.addVertex(source);
    71100                g.addVertex(sink);
     
    91120                        id++;
    92121                }
    93                
    94 //              viewGraph(g);
    95                 System.out.println(g.toString());
    96                
     122                return g;
     123        }
     124       
     125        static public Bisection mqi(Bisection partition) {
     126                boolean finished = false;
     127                Bisection bisection = partition;
     128                int maxFlowThreshold = Integer.MAX_VALUE;
     129                while (!finished) {
     130                        UndirectedGraph startingGraph = partition.getGraph();
     131                        Node source = new Node("S");
     132                        Node sink = new Node("T");
     133                        DirectedGraph<Node, Edge> g = prepareDirectedGraph(bisection, source, sink);
     134                        Transformer<Edge, Number> capTransformer = new Transformer<Edge, Number>() {
     135                                public Double transform(Edge e) {
     136                                        return (double) e.getCapacity();
     137                                }
     138                        };
     139                        Map<Edge, Number> edgeFlowMap = new HashMap<Edge, Number>();
     140                        // This Factory produces new edges for use by the algorithm
     141                        i=-1;
     142                        Factory<Edge> edgeFactory = new Factory<Edge>() {
     143                                public Edge create() {
     144                                        i++;
     145                                        return new Edge(Integer.toString(i), 1, 1);
     146                                }
     147                        };
     148                        EdmondsKarpMaxFlow<Node, Edge> alg = new EdmondsKarpMaxFlow<Node, Edge>(
     149                                        g, source, sink, capTransformer, edgeFlowMap, edgeFactory);
     150                       
     151                        maxFlowThreshold = getMaxCardinality(bisection) * bisection.edgeCut() / 2;
     152                        alg.evaluate();
     153                        if(alg.getMaxFlow() < maxFlowThreshold) {
     154                                Set<Node> sinkPartition = alg.getNodesInSinkPartition();
     155                                Set<Node> sourcePartition = alg.getNodesInSourcePartition();
     156                                bisection = prepareBisection(startingGraph, sourcePartition, sinkPartition);
     157                        } else
     158                                finished = true;
     159                }
     160                return bisection;
     161        }
     162       
     163        private static Bisection prepareBisection(UndirectedGraph g, Set<Node> sourcePartition, Set<Node> sinkPartition) {
     164                Bisection b = null;
     165                Subgraph sourceSubgraph = new Subgraph(g, sourcePartition);
     166                Subgraph sinkSubgraph = new Subgraph(g, sinkPartition);
     167                Subgraph subgraph = null;
     168                if(sourceSubgraph.getVertexCount() > sinkSubgraph.getVertexCount())
     169                        subgraph =sourceSubgraph;
     170                else
     171                        subgraph = sinkSubgraph;
     172                b = new Bisection(subgraph);
     173                return b;
    97174        }
    98175       
Note: See TracChangeset for help on using the changeset viewer.