Вы можете сгенерировать все подмножества, используя метод 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, не имеют первого элемента objectsToFix, где подмножества, добавленные вторым вызовом (если условие обрезки не нарушено), имеют этот элемент, поэтому пересечение из двух сгенерированных наборов подмножеств пуст.