public boolean startFindBestSolution(int[] rightCuts){
		

		//
		SubPath[] subPaths=getSubPaths(rightCuts,p);
//		System.out.println("subPaths: "+Arrays.toString(subPaths));
		
		
		//temporary
		int[] solution=new int[rightCuts.length];
		boolean[] reversed=new boolean[rightCuts.length];
		boolean[] used=new boolean[rightCuts.length];
		
		//fill because want to use the dist method to calculate oldEdgeDist
		for(int i=0;i<rightCuts.length;i++){
			solution[i]=i;
		}
		//calculate oldEdgeDist
		int oldEdgeDist=0;
		for(int i=rightCuts.length-2;i>=-1;i--){
			oldEdgeDist += dist(subPaths, solution, reversed, i);
		}
		
		//the best results
		this.improved=false;
		this.best=oldEdgeDist;
		this.bestSolution=new int[rightCuts.length];
		this.bestReversed=new boolean[rightCuts.length];
		
		
		//find the best k swap
		findBestPermutation(subPaths, solution, reversed, 
				used, rightCuts.length-1, 0);
		
		if(improved){
//			System.out.println("was better performing move: ");
//			System.out.println("previous path: "+Arrays.toString(p.getPathCopy()));
//			System.out.println(Arrays.toString(subPaths));
//			System.out.println(Arrays.toString(bestSolution));
//			System.out.println(Arrays.toString(bestReversed));
			p.performSubPathChanges(subPaths, bestSolution, bestReversed);
			improved=false;
			return true;
		} else {
			return false;
		}
		
	}