我可以在 PuLP 中制作 Min Z = max(a,b,c)

R.v*_*.vW 0 python mathematical-optimization linear-programming pulp

我想知道我是否可以在PuLP 中创建一个多目标函数,通过这样做我可以在PuLP 中创建一个 Min Z = max(a,b,c),但是在使用此代码时

    ilp_prob = pulp.LpProblem("Miniimize Problem", pulp.LpMinimize)
    x = []
    if m >3:
        return 1,1
    for i in range(m):
        temp = []
        for j in range(len(jobs)):
            temp += [pulp.LpVariable("x_%s_%s" %((i+1),(j+1)),0,1, cat = 'Binary')]
        x+= [temp]
    ilp_prob += max([pulp.lpSum([jobs[j]*x[i][j] for j in range(len(jobs))] for i in range(m))])
    for i in range(len(jobs)):
         ilp_prob += pulp.lpSum([x[j][i] for j in range(m)])==1 
    ilp_prob.solve()
Run Code Online (Sandbox Code Playgroud)

它只返回 x[0] 中的所有 1,以及 x[0] 中的所有 0。

sas*_*cha 6

我很确定你不能只max在纸浆的内部表达式上使用 python 的 (!) !那些求解器正在研究一个非常具体的问题规范,LP 标准形式,这里没有概念!

例外情况是,如果纸浆会为其数据结构重载这个最大函数(不知道这在 python 中是否可能),但我很确定纸浆不支持这样的重新制定(有一些需要;同样:目标是标准形式)。

例如cvxpy不会重载,但会引入自定义的最大函数,从而在内部转换您的问题。

话虽如此:我很惊讶您的代码运行时没有出现严重错误。但我懒得在这里检查纸浆来源。

查看通常的 LP/IP 配方指南。

第一个想法是:

目标: min (max(a,b,c))

重新配制:

  • 引入一个新变量 z
  • 添加约束:
    • z >= a
    • z >= b
    • z >= c
  • 假设:目标以某种方式想要最小化z(最大化会让你陷入困境,因为问题将变得无限!)
    • 这就是这种情况,因为我们目标的最终目标如下所示:
    • min(z)

备注:必须小心,问题仍然是线性/凸的(取决于求解器)。在这种情况下(我们的简单示例;我没有检查您的整个模型)我没有看到问题,但在更复杂的情况下min(max(complex_expression)) subjective to complex constraints,这可能会引入非凸性(并且不能由圆锥求解器解决,包括 LP -求解器)。

只需在环中抛出一个关键字:您的方法/目标听起来有点像robust-optimization,通常会优化一些最坏的情况。并非所有多目标优化问题都像这样处理多个目标组件。