如何使用Pulp Gekko和Scipy软件包修复具有不同结果的代码以解决线性优化问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Pulp Gekko和Scipy软件包修复具有不同结果的代码以解决线性优化问题?相关的知识,希望对你有一定的参考价值。

我正在用Python设置一个新的线性优化代码。不幸的是,我对Pulp,Scipy和Gekko包的结果不一样。

我尝试用Python中的Linear Optimization实现不同包的代码。

OPTIMIZATION WITH GEKKO

from gekko import GEKKO 
import numpy as np
import matplotlib.pyplot as plt

m = GEKKO()             # create GEKKO model
x = m.Var(value=0, lb=0, ub=400000)      # define new variable, initial     value=0
y = m.Var(value=0, lb=0, ub=200)      # define new variable, initial value=1
z = m.Var(value=0, lb=0)

m.Equation(x+y+z==100)
m.Obj(1.2*x + y + z) # equations
m.solve(disp=False)     # solve

print("Solution with The GEKKO package")
print(x.value, y.value , z.value)# # print solution

OPTIMIZATION WITH Scipy

import numpy as np
from scipy.optimize import minimize

def objective(m):
    x = m[0]
    y = m[1]
    z = m[2]
    return 1.2*x + y + z


def constraint1(m):
    return m[0] + m[1] + m[2] - 100

def constraint2(x):
    return x[2]

x0 = [0,0,0]
b1 = (0,400000)
b2 = (0,200)
b3= (0,None)
bnds = (b1,b2,b3)

con1 = {'type' : 'eq', 'fun' : constraint1}
con2 = {'type' : 'ineq', 'fun' : constraint2}
cons = [con1,con2]

sol = minimize(objective,x0,method='SLSQP', bounds=bnds , constraints=cons)

print("Solution with The SCIPY package")
print(sol)

OPTIMIZATION WITH PULP

from pulp import *

prob = LpProblem("Problem",LpMinimize)

x = LpVariable("X",0,400000,LpContinuous)
y = LpVariable("Y",0,200,LpContinuous)
z = LpVariable("Z",0,None,LpContinuous)

prob += 1.2*x + y + z
prob += (x + y + z == 100)
prob.solve()

print("Solution with The PULP package")
print("Status:", LpStatus[prob.status])

for v in prob.variables():
    print(v.name, "=", v.varValue)

我希望得到相同的结果,但不幸的是实际输出是不同的:

The solution with The GEKKO package

[0.0] [36.210291349] [63.789708661]

The solution with The SCIPY package

fun: 100.0000000000001
jac: array([1.19999981, 1.        , 1.        ]) 
message: 'Optimization terminated successfully.'
nfev: 35
nit: 7
njev: 7
status: 0
success: True
x: array([4.88498131e-13, 5.00000000e+01, 5.00000000e+01])

The Solution with The PULP package

X = 0.0
Y = 100.0
Z = 0.0
答案

所有结果都是正确的/每个解算器都是正确的!

  • 每个解决方案都达到了目标:100
  • 每个解决方案都保留了可变边界
  • 每个解决方案都保留了“单纯形”约束:qazxsw poi

忽略浮点限制,可以为您的问题提供无限多种不同的最优解。

包括不同解决方法在内的不同解算器可以导致不同的解决方案(选择许多解决方案中的一个这里举例如下:

  • 像Simplex(Pulp)这样的LP算法
  • NLP算法,如顺序最小二乘(scipy) (请记住:在scipy中也有LP解算器,并且通常更好地给出一些先验定义的优化问题 - > LP vs. NLP)

以上是关于如何使用Pulp Gekko和Scipy软件包修复具有不同结果的代码以解决线性优化问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复“由于 EnvironmentError 无法安装软件包:[WinError 123]”?

如何使用 gekko 变量作为数组的组件?

如何修复“-scipy.misc 没有属性“imresize””

如何使用 R reticulate 安装 gekko 包?

如何使用gekko解决ini方程问题?

如何修复 scipy 的 odeint 函数中的 np.float64 不可调用错误? [关闭]