在这里,我以相反的方式解决了这个问题——我生成了从原始完整网格中排除的节点集,以生成每个生成的完整网格。从这里,我可以很容易地使用一些技巧-跳过没有包含在相应的完整网格中的边,使用集差异,并在次优分支超过权重阈值时对其进行修剪。
class FullMesh:
def __init__(self, pairs, weights):
self.pairs = pairs
self.weights = weights
self.elements = set(range(len(weights)))
self.skips = {e:set() for e in self.elements}
for i, (a, b) in enumerate(pairs):
self.skips[a].add(i)
self.skips[b].add(i)
def find_max(self):
max_score = sum(self.weights)
val, nums = self.exclude(0, max_score + 1, set(range(len(self.pairs))))
return max_score - val, sorted(self.elements - set(nums))
def exclude(self, curr_score, min_score, search):
if not search or min_score <= curr_score:
return curr_score, []
min_nums = []
for e in self.pairs[next(iter(search))]:
score, nums = self.exclude(curr_score + self.weights[e], min_score, search - self.skips[e])
if score < min_score:
min_score, min_nums = score, nums + [e]
return min_score, min_nums