docs: public void SFFS() throws Exception {
  		int NumTemplate = Templates.length;
  		CurSet = new boolean[NumTemplate];
  		LeftSet = new boolean[NumTemplate];
  		for (int i = 0; i < NumTemplate; i++) {
  			CurSet[i] = false;
  			LeftSet[i] = true;
  		}
  		Evaluate(Templates, CurSet);
  		boolean continueDelete = false;
  		while (SetSize(CurSet) <= NumTemplate) {
  			if (!continueDelete) {
  				Integer theInt = BooleanSet2Integer(CurSet);
  				int best = BestFeatureByAdding(CurSet, LeftSet);
  				if (best != -1) {
  					System.out.println("Add Best " + best);
  					AlreadyAdded.add(theInt);
  					CurSet[best] = true;
  					LeftSet[best] = false;
  					printAccuracy(CurSet);
  				}
  			}
  			Integer theInt = BooleanSet2Integer(CurSet);
  			// 被删除过的集合就不再删除了
  			if (AlreadyRemoved.contains(theInt)) {
  				continueDelete = false;
  				continue;
  			} else {
  				int worst = WorstFeatureByRemoving(CurSet);
  				boolean[] TestSet = CurSet.clone();
  				TestSet[worst] = false;
  				double accuracy = Evaluate(Templates, TestSet);
  				if (accuracy >= AccuracyRecords.get(theInt)) {
  					System.out.println("Remove Worst " + worst);
  					AlreadyRemoved.add(theInt);
  					CurSet[worst] = false;
  					LeftSet[worst] = true;
  					printAccuracy(CurSet);
  					if (SetSize(CurSet) == 0) {
  						continueDelete = false;
  					} else
  						continueDelete = true;
  				} else {
  					continueDelete = false;
  					continue;
  				}
  			}
  		}
  		printAccuracyRecords(AccuracyRecords);
  		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
  				"/home/zliu/corpus/testTemplate/SFFS.ser"));
  		oos.writeObject(AccuracyRecords);
  		oos.close();
  
  	}