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。
我很确定你不能只max在纸浆的内部表达式上使用 python 的 (!) !那些求解器正在研究一个非常具体的问题规范,LP 标准形式,这里没有概念!
例外情况是,如果纸浆会为其数据结构重载这个最大函数(不知道这在 python 中是否可能),但我很确定纸浆不支持这样的重新制定(有一些需要;同样:目标是标准形式)。
例如cvxpy不会重载,但会引入自定义的最大函数,从而在内部转换您的问题。
话虽如此:我很惊讶您的代码运行时没有出现严重错误。但我懒得在这里检查纸浆来源。
查看通常的 LP/IP 配方指南。
第一个想法是:
目标: min (max(a,b,c))
重新配制:
z >= az >= bz >= cz(最大化会让你陷入困境,因为问题将变得无限!)
min(z)备注:必须小心,问题仍然是线性/凸的(取决于求解器)。在这种情况下(我们的简单示例;我没有检查您的整个模型)我没有看到问题,但在更复杂的情况下min(max(complex_expression)) subjective to complex constraints,这可能会引入非凸性(并且不能由圆锥求解器解决,包括 LP -求解器)。
只需在环中抛出一个关键字:您的方法/目标听起来有点像robust-optimization,通常会优化一些最坏的情况。并非所有多目标优化问题都像这样处理多个目标组件。