def getMayGroups(self): # 将组合分为两组,mayFill是可能将所有的虚拟机填下去,cantFill是不可能将虚拟机填下去(需要去除部分虚拟机) self.mayGroups = HMap() # 分别获取单独使用某一种物理机装 maxValSingle = 0 # 单个物理机最大的价值 numsSingle = {} # 单个物理机的数量,为后面获取可能的组合提供参考 for name, compuSpec in self.compusSpec.items(): dp = DP(compuSpec, self.ecssSpec, self.ecssNum) compuEcssInfo = dp.getCompuEcssInfo() val = self.calcuVal({name: compuEcssInfo}, True) maxValSingle = max(maxValSingle, val) numsSingle[name] = len(compuEcssInfo) mayGroup = {} # 第一个组合,全部为0 for name in self.compusSpec: mayGroup[name] = 0 compusName = self.compusSpec.keys() while self.updateMayGroup(mayGroup, numsSingle, compusName): val, canFill = self.calcuVal(mayGroup) # 如果组合的价值大于单个物理机最好的放置 if canFill and val >= maxValSingle: self.mayGroups[deepcopy(mayGroup)] = val self.mayGroups.sort()