public void run() {
		/* forall v in V doe label(v) <- EMPTY;
		 * for i<-n downto 1 do
		 * 	let v be an unnumbered vertex with largest label;
		 * 	number(v);
		 * 	forall unnumbered neighbours of v do
		 * 		label(w) <- label(w) + {i}
		 */
		NVertexOrder<D> order =  new NVertexOrder<D>();
		int bestUpperBound = Integer.MAX_VALUE;
		for( int startVertex=0; startVertex<graph.getNumberOfVertices(); ++startVertex ){
			for(NVertex<LBFSData> v : graph){
				v.data.visited = false;
				v.data.labels.clear();
				order.order.clear();
			}
			
			//Set start vertex
			NVertex<LBFSData> first = graph.getVertex(startVertex);
			//Update his neigbours
			updateNeigbours(first, graph.getNumberOfVertices() );
			//Add the first vertex to the permutation
			order.order.add( first.data.getOriginal() );
			
			//for i <- n downto 1 do
			for( int i=graph.getNumberOfVertices()-1; i>0; --i ){
				NVertex<LBFSData> biggest = null; // Vertex with highest label
				for(int j=0; j<graph.getNumberOfVertices(); ++j) {
					NVertex<LBFSData> v = graph.getVertex(j);					
					//Only look at vertices that aren't numbered
					if( ! v.data.visited ) {						
						//Set the first vertex as the init vertex
						if( biggest==null ) {						
							biggest = v;
						} else if( lexBigger( v.data.labels, biggest.data.labels ) ) {
							biggest = v;						
						}					
					}
				}
				//Update the neighbours of the selected vertex
				if( biggest!=null ) {
					updateNeigbours(biggest, i );
					order.order.add( biggest.data.getOriginal() );					
				}
			}
			//Reverse the list
			Collections.reverse(order.order);
			
			//Create the treedecomposition to get the upperbound 
			PermutationToTreeDecomposition<D> pttd = new PermutationToTreeDecomposition<D>(order);
			pttd.setInput(originalGraph);
			pttd.run();
			int newUpper = pttd.getUpperBound();
			if( bestUpperBound > newUpper) {
				vertexOrder = new NVertexOrder<D>(order);
				bestUpperBound = newUpper;				
			}
		}
		upperbound = bestUpperBound;
	}