public boolean twoOpt555(){
		int pathLength=tour.length();
		
		boolean better=false;
		for(int currentVerticeIndex=0; currentVerticeIndex<pathLength;currentVerticeIndex++){
			int nextVerticeIndex=(currentVerticeIndex+1)%pathLength;
			//skip the current and the nextVerticeIndex
			int toVerticeIndex=(currentVerticeIndex+2)%pathLength;
			
			int distOldEdge=tour.indexDistance(currentVerticeIndex, nextVerticeIndex);/*ug.dist(current,nextVerticeIndex);*/
			
			//goes through all other edges
			for(int iters=0;iters<pathLength-3;iters++){
				
				int distNewEdge=tour.indexDistance(currentVerticeIndex,toVerticeIndex);/*ug.dist(current,swapWith);*/
				//check if edge to swapwith is better than edge from current to next
				if(distNewEdge < distOldEdge ){
//					System.out.println("before " +tourLength(dist,tour));
					//check if second edge swap if it really is an improvement
					if(swapIfBetterTwoOpt(nextVerticeIndex,toVerticeIndex)){
						//it was better so complete the reversing
						int innerFrom=(nextVerticeIndex+1)%pathLength;
						int innerTo= toVerticeIndex==0 ? pathLength-1 : toVerticeIndex-1; 
//						reverse(path, innerFrom, innerTo);
						tour.reverseSubPath(innerFrom, innerTo);
//						System.out.println("after " +tourLength(dist,tour));
						better=true;
					}
					
					
				}
				
				//increment the index, but do a wraparound if it reaches the end
				toVerticeIndex++; if(toVerticeIndex>=pathLength){ toVerticeIndex=0; }
			}
			
		}
		return better;
	}