我能用纸浆做最小Z=max(a,b,c)吗

2024-05-13 23:09:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道我是否可以在纸浆中建立一个多目标函数,通过这样做我可以使纸浆中的最小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()

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


Tags: 函数代码in目标forlenjobsrange
1条回答
网友
1楼 · 发布于 2024-05-13 23:09:21

我敢肯定你不能只使用python的(!)max关于pulp的内部表达式!这些求解者正在研究一个非常具体的问题规范,LP标准格式,这里没有这个概念!在

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

例如,cvxpy不重载,但引入了自定义的max函数,这些函数在内部转换您的问题。在

尽管如此,我很惊讶你的代码运行时没有出现严重错误。但我懒得查纸浆的来源。在

看看常用的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,其中通常会优化一些最坏的情况。并不是所有的多目标优化问题都是这样处理多目标组件的。在

相关问题 更多 >