예제 #1
0
    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()