/* ========================================== * JGraphT : a free Java graph-theory library * ========================================== * * Project Info: http://jgrapht.sourceforge.net/ * Project Creator: Barak Naveh (http://sourceforge.net/users/barak_naveh) * * (C) Copyright 2003-2008, by Barak Naveh and Contributors. * * This program and the accompanying materials are dual-licensed under * either * * (a) the terms of the GNU Lesser General Public License version 2.1 * as published by the Free Software Foundation, or (at your option) any * later version. * * or (per the licensee's choosing) * * (b) the terms of the Eclipse Public License v1.0 as published by * the Eclipse Foundation. */ /* --------------------- * VertexCoversTest.java * --------------------- * (C) Copyright 2003-2008, by Linda Buisman and Contributors. * * Original Author: Linda Buisman * Contributor(s): Barak Naveh * * $Id$ * * Changes * ------- * 06-Nov-2003 : Initial revision (LB); * 10-Nov-2003 : Adapted to VertexCovers (BN); * */ package org.jgrapht.alg; import java.util.*; import junit.framework.*; import org.jgrapht.*; import org.jgrapht.graph.*; /** * Tests the vertex cover algorithms. * * @author Linda Buisman * @since Nov 6, 2003 */ public class VertexCoversTest extends TestCase { //~ Static fields/initializers --------------------------------------------- private static final int TEST_GRAPH_SIZE = 200; private static final int TEST_REPEATS = 20; //~ Methods ---------------------------------------------------------------- /** * . */ public void testFind2ApproximationCover() { for (int i = 0; i < TEST_REPEATS; i++) { Graph<Integer, DefaultEdge> g = createRandomGraph(); assertTrue( isCover(VertexCovers.find2ApproximationCover(g), g)); } } /** * . */ public void testFindGreedyCover() { for (int i = 0; i < TEST_REPEATS; i++) { Graph<Integer, DefaultEdge> g = createRandomGraph(); Set<Integer> c = VertexCovers.findGreedyCover( Graphs.undirectedGraph(g)); assertTrue(isCover(c, g)); } } /** * Checks if the specified vertex set covers every edge of the graph. Uses * the definition of Vertex Cover - removes every edge that is incident on a * vertex in vertexSet. If no edges are left, vertexSet is a vertex cover * for the specified graph. * * @param vertexSet the vertices to be tested for covering the graph. * @param g the graph to be covered. * * @return */ private boolean isCover( Set<Integer> vertexSet, Graph<Integer, DefaultEdge> g) { Set<DefaultEdge> uncoveredEdges = new HashSet<DefaultEdge>(g.edgeSet()); for (Iterator<Integer> i = vertexSet.iterator(); i.hasNext();) { uncoveredEdges.removeAll(g.edgesOf(i.next())); } return uncoveredEdges.size() == 0; } /** * Create a random graph of TEST_GRAPH_SIZE nodes. * * @return */ private Graph<Integer, DefaultEdge> createRandomGraph() { // TODO: move random graph generator to be under GraphGenerator // framework. Pseudograph<Integer, DefaultEdge> g = new Pseudograph<Integer, DefaultEdge>(DefaultEdge.class); for (int i = 0; i < TEST_GRAPH_SIZE; i++) { g.addVertex(new Integer(i)); } List<Integer> vertices = new ArrayList<Integer>(g.vertexSet()); // join every vertex with a random number of other vertices for (int source = 0; source < TEST_GRAPH_SIZE; source++) { int numEdgesToCreate = ((int) Math.random() * TEST_GRAPH_SIZE / 2) + 1; for (int j = 0; j < numEdgesToCreate; j++) { // find a random vertex to join to int target = (int) Math.floor(Math.random() * TEST_GRAPH_SIZE); g.addEdge(vertices.get(source), vertices.get(target)); } } return g; } } // End VertexCoversTest.java