在 pulp objective 函数上获取最大值的最小值

Get minimum of maximize value on pulp objective function

我正在尝试使用纸浆获取以下 objective 函数的最小值 U(X)

其中 x_{f,i,v} 是二进制值。

将 objective 函数设置为 pulp.LpProblem 时,我在编写 max() 时遇到问题。

我所做的是使用 python 内部函数 max() 但它给了我一个错误。好像不能用来打浆

    for each_sfc in self.SFCs:
        vnf_id_list = list()
        for each_VNF in each_sfc.VNF_list:
            vnf_id_list.append(str(each_VNF.ID))

        new_sfc_vars = LpVariable.dicts(
            name='X',
            indexs=vnf_id_list,
            lowBound=0,
            upBound=1,
            cat='Continuous'
        )

        for each_key in new_sfc_vars.keys():
            new_sfc_vars[each_key] = 1 - new_sfc_vars[each_key]

        self.sfc_vars.append(new_sfc_vars)

    self.LP_model = LpProblem(
        name="Static backup",
        sense=LpMinimize
    )

    for each_SFC, each_vars in zip(self.SFCs, self.sfc_vars):
        self.LP_model.objective += each_SFC.backup_cost * max(each_vars.values())
    print(self.LP_model.objective)

如何将 max() 与 pulp 一起使用或如何重新编写代码?

这是一个非常基础的问题。

  1. max() 不是线性的。线性表达式看起来像 a1*x1+a2*x2+...。 PuLP 仅适用于线性模型,因此它只允许 objective 和约束中的线性表达式。请注意,某些建模工具具有最大函数,但它们通常会在后台对其进行线性化处理。

  2. min sum(i, max(j, x(i,j))这样的构造的一个非常标准的公式是

    min sum(i, y(i))
    y(i) >= x(i,j)  for all i,j 
    
  3. 只要查阅任何LP教材即可。它将解释这个公式。通常这被称为 minimax.