穷举搜索。 假设10个属性, 需要找出2^^10 种可能情形中, 那种的merit最优。 每次直接根据迭代次数space产生属性集 code: //best_group 初始为空 //best_merit初始为空best_group的merit //假设有10个属性, 那么需要搜索 2^^10 - 1 = 1023 次 BigInteger searchSpaceEnd = BigInteger.ONE.add(BigInteger.ONE).pow(numatts).subtract(BigInteger.ONE); while (!done) { // the next subset space = space.add(BigInteger.ONE); if (space.equals(searchSpaceEnd)) { done = true; } //每次都是从迭代次数取得属性集, 不需要用另外的内存空间 tempGroup.clear(); for (int i = 0; i < numatts; i++) { if (space.testBit(i)) { if (!m_hasClass) { tempGroup.set(i); } else { int j = (i >= m_classIndex)? i + 1: i; tempGroup.set(j); } } } tempMerit = ASEvaluator.evaluateSubset(tempGroup); m_evaluations++; if (tempMerit >= best_merit) { tempSize = countFeatures(tempGroup); if (tempMerit > best_merit || //这里是或???. 确实是或, 逻辑真晦涩。 //改成 if((tempMerit > best_merit) ||((tempMerit == best_merit) && (tempSize < sizeOfBest)) )更好点 (tempSize < sizeOfBest)) { best_merit = tempMerit; m_bestGroup = (BitSet)(tempGroup.clone()); sizeOfBest = tempSize; } } } m_bestMerit = best_merit; return attributeList(m_bestGroup);