Ignore:
Timestamp:
Sep 17, 2010, 6:04:18 PM (14 years ago)
Author:
gnappo
Message:

Individuazione del miglioramento del taglio: tentativi.

File:
1 edited

Legend:

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

    r14 r15  
    11package weka.clusterers.forMetisMQI;
    22
    3 import java.awt.Color;
    4 import java.awt.Dimension;
    5 import java.awt.Paint;
    63import java.util.Collection;
    74import java.util.HashMap;
     
    129import java.util.Stack;
    1310
    14 import javax.swing.JFrame;
    15 
    1611import org.apache.commons.collections15.Factory;
    1712import org.apache.commons.collections15.Transformer;
     
    2217import weka.clusterers.forMetisMQI.graph.Subgraph;
    2318import weka.clusterers.forMetisMQI.graph.UndirectedGraph;
     19import weka.clusterers.forMetisMQI.util.Util;
    2420import edu.uci.ics.jung.algorithms.flows.EdmondsKarpMaxFlow;
    25 import edu.uci.ics.jung.algorithms.layout.FRLayout;
    26 import edu.uci.ics.jung.algorithms.layout.KKLayout;
    27 import edu.uci.ics.jung.algorithms.layout.Layout;
    2821import edu.uci.ics.jung.graph.DirectedGraph;
    2922import edu.uci.ics.jung.graph.DirectedSparseGraph;
    30 import edu.uci.ics.jung.graph.Graph;
    31 import edu.uci.ics.jung.visualization.BasicVisualizationServer;
    32 import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
    3323
    3424public class MQI {
    3525       
    3626        static int i = -1;
     27       
     28        static private Set<Node> reversedLookup(Node sink, DirectedGraph<Node, Edge> g, Map<Edge, Number> edgeFlowMap) {
     29                Set<Node> result = new HashSet<Node>();
     30                Collection<Edge> inEdges = g.getInEdges(sink);
     31                Iterator<Edge> inEdgesIterator = inEdges.iterator();
     32                while (inEdgesIterator.hasNext()) {
     33                        Edge edge = inEdgesIterator.next();
     34                        Node src = g.getSource(edge);
     35                        Edge reverseEdge = g.findEdge(src, sink);
     36                        if ((reverseEdge != null)
     37                                        && ((Integer) edgeFlowMap.get(reverseEdge) < reverseEdge
     38                                                        .getCapacity())) {
     39                                result.add(src);
     40                        }
     41                }
     42                return result;
     43        }
     44       
     45        static private Set<Node> DFSReversed(Node sink, DirectedGraph<Node, Edge> g, Map<Edge, Number> edgeFlowMap) {
     46                Stack<Node> stack = new Stack<Node>();
     47                stack.push(sink);
     48                Set<Node> result = new HashSet<Node>();
     49                Set<Node> discardedNodes = new HashSet<Node>();
     50                result.add(sink);
     51                while (!stack.empty()) {
     52                        boolean founded = false;
     53                        Node currentNode = stack.pop();
     54                        discardedNodes.add(currentNode);
     55                        Collection<Edge> inEdges = g.getInEdges(currentNode);
     56                        Iterator<Edge> inEdgesIterator = inEdges.iterator();
     57                        while (inEdgesIterator.hasNext()) {
     58                                Edge edge = inEdgesIterator.next();
     59                                Node src = g.getSource(edge);
     60                                Edge reverseEdge = g.findEdge(src, currentNode);
     61                                if ((reverseEdge != null) && !discardedNodes.contains(src)
     62                                                && ((Integer) edgeFlowMap.get(reverseEdge) < reverseEdge
     63                                                                .getCapacity()) && !founded) {
     64                                        founded=true;
     65                                        stack.push(src);
     66                                        result.add(src);
     67                                }
     68                                discardedNodes.add(src);
     69                        }
     70                }
     71                return result;
     72        }
    3773       
    3874        static private Set<Node> BFSReversed(Node sink, DirectedGraph<Node, Edge> g, Map<Edge, Number> edgeFlowMap) {
     
    132168                boolean finished = false;
    133169                Bisection bisection = partition;
    134                 Set<Node> cluster = new HashSet<Node>(partition.getSubgraph().createInducedSubgraph().getVertices());
     170                Set<Node> cluster = new HashSet<Node>(partition.getSmallerNotEmptySubgraph().createInducedSubgraph().getVertices());
    135171                int maxFlowThreshold = Integer.MAX_VALUE;
    136172                while (!finished) {
     
    138174                        Node sink = new Node("T");
    139175                        DirectedGraph<Node, Edge> directedGraph = prepareDirectedGraph(bisection, source, sink);
     176//                      Util.viewGraph(directedGraph);
    140177                        Transformer<Edge, Number> capTransformer = new Transformer<Edge, Number>() {
    141178                                public Double transform(Edge e) {
     
    144181                        };
    145182                        Map<Edge, Number> edgeFlowMap = new HashMap<Edge, Number>();
     183                        i=-1;
    146184                        // This Factory produces new edges for use by the algorithm
    147                         i=-1;
    148185                        Factory<Edge> edgeFactory = new Factory<Edge>() {
    149186                                public Edge create() {
    150187                                        i++;
    151                                         return new Edge(Integer.toString(i), 1, 1);
     188                                        return new Edge("f" + Integer.toString(i), 1, 1);
    152189                                }
    153190                        };
     
    155192                                        directedGraph, source, sink, capTransformer, edgeFlowMap, edgeFactory);
    156193                       
    157                         maxFlowThreshold = bisection.getSmallerSubgraph().getVertexCount() * bisection.edgeCut() / 2;
     194                        maxFlowThreshold = bisection.getSmallerNotEmptySubgraph().getVertexCount() * bisection.edgeCut() / 2;
    158195                        alg.evaluate();
     196                        Util.viewFlowGraph(directedGraph, edgeFlowMap);
    159197                        System.out.println("MAX FLOW: " + alg.getMaxFlow() + " THRESHOLD: " + maxFlowThreshold);
    160198                        if(alg.getMaxFlow() < maxFlowThreshold) {
    161                                 Set<Node> sinkPartition = alg.getNodesInSinkPartition();
    162                                 System.out.println(sinkPartition);
    163                                 Set<Node> sourcePartition = alg.getNodesInSourcePartition();
    164                                 System.out.println(sourcePartition);
    165                                 bisection = prepareBisection(bisection.getSmallerSubgraph().createInducedSubgraph(), sourcePartition, sinkPartition);
    166 //                              bisection = new Bisection(new Subgraph(bisection.getSmallerSubgraph().createInducedSubgraph(), BFSReversed(sink, directedGraph, edgeFlowMap)));
     199//                              bisection = prepareBisection(bisection.getSmallerNotEmptySubgraph().createInducedSubgraph(), sourcePartition, sinkPartition);
     200                                cluster = BFSReversed(sink, directedGraph, edgeFlowMap);
     201//                              System.out.println("DFSReversed: " + DFSReversed(sink, directedGraph, edgeFlowMap));
     202//                              bisection = new Bisection(new Subgraph(bisection.getSmallerNotEmptySubgraph().createInducedSubgraph(), DFSReversed(sink, directedGraph, edgeFlowMap)));
     203//                              cluster = reversedLookup(sink, directedGraph, edgeFlowMap);
     204                                cluster.remove(sink);
     205                                bisection = new Bisection(new Subgraph(bisection.getSmallerNotEmptySubgraph().createInducedSubgraph(), cluster));
    167206                                System.out.println("NEW BISECTION: " + bisection.toString());
    168                                 cluster = sinkPartition;
    169207                        } else
    170208                                finished = true;
Note: See TracChangeset for help on using the changeset viewer.