public static boolean mutateRouteBy_Three_Opt(Individual individual, int period, int vehicle)
	{
		ProblemInstance problemInstance = individual.problemInstance;
		ArrayList<Integer> route;
		ArrayList<ArrayList<Integer>> combinations = new ArrayList<ArrayList<Integer>>();
		boolean improved = true;
		while(improved)
		{
			improved = false;
			route  = individual.routes.get(period).get(vehicle);
			double cost = RouteUtilities.costForThisRoute(problemInstance, route, vehicle);
		//	System.out.println("\n"+route.toString());
			
			for(int i=0;i<route.size();i++) // i th node er previous edge
			{
				if(improved)break;
				for(int j=i ; j<route.size();j++) // j th and k th node er porer edge
				{
					if(improved)break;
					for(int k=j+1;k<route.size();k++)
					{
						double min=cost,costThis;
						int selected=-1;
						combinations.add(combination1(i, j, k, route));
						combinations.add(combination2(i, j, k, route));
						combinations.add(combination3(i, j, k, route));
						combinations.add(combination4(i, j, k, route));
						
						//System.out.println("\ncurrent "+" cost : "+cost);
						for(int p=0;p<4;p++)
						{
							ArrayList<Integer> routeCOmb = combinations.get(p);
							costThis = RouteUtilities.costForThisRoute(problemInstance, routeCOmb, vehicle);
							//System.out.println("comb "+ p+" cost : "+costThis);
							if(costThis<min)
							{
								min = costThis;
								selected = p;
							}
						}
						if(selected != -1)
						{
							ArrayList<Integer> selectedComb = combinations.get(selected);
							//System.out.println("Selected : "+selected);
							route.clear();
							route.addAll(selectedComb);
							improved=true;
							break;
						}
						
					}
				}
			}
			//for testing only
			
		}		
		return true;
	}