Branch-and-bound手法を使用してすべてのサブセットを生成することができます。プルーニング条件として「インクリメンタルな方法ですべてのサブセットを生成することができますルートが制約を満たしていない場合はツリー」を選択します。
制約に関して一般的である場合は、これが最適な戦略だと思います。
サブセットを生成するコードを正しい方法で記述してください。そうでなければ、同じサブセットを何度も生成することがあります。マップの参照やメモリオーバーヘッドのために時間がかかるメモ帳を避けるため、そのようにしてサブセットを生成することができる:
GetAllSubsets(List objects) {
List generated = {};
GetAllSubsets(generated, [], objects);
return generated;
}
GetAllSubsets(List subsetGenerated, List objectFixed, List objectsToFix) {
GetAllSubsets(subsetGenerated, objectFixed, objectsToFix.sublist(1, objectsToFix.length());
if (satisfy(toCheck = objectsFixed.add(objectsToFix.get(0)))) {
subsetGenerated.add(toCheck);
GetAllSubsets(subsetGenerated, toCheck, objectsToFix.sublist(1, objectsToFix.length());
}
}
実際、GetAllSubsetsの最初の呼び出しによって追加されたサブセットは第2の呼によってサブセットを加えobjectsToFixの最初の要素を持たない(剪定状態であれば違反していない)にはその要素があるため、生成された2つの部分集合の共通部分は空です。
すべてのセットを反復処理する意味がありません。 (x、y)の合計が100より大きい場合、残りの部分集合をx、yでチェックする必要はありません! (たとえば、(40,79,50)の合計が100を超えているので、チェックする必要はありません(40,79,50,1)、(40,79,50,66,1)など – ooboo
しかし、これは可能な条件のほんの一例です。合計が5050(1〜100の合計)未満の条件の場合、* all *サブセットは条件を満たすでしょう –
しかし、最悪のシナリオでは、O(2^n)時間の複雑さが問題を解決するために良いヒューリスティックを検索するのを止めるべきではありません。 – akappa