gpt4 book ai didi

python - 如何使用 Pulp Gekko 和 Scipy 包修复具有不同结果的线性优化问题的代码?

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:40 24 4
gpt4 key购买 nike

我正在使用 Python 设置新的线性优化代码。不幸的是,我没有使用 Pulp、Scipy 和 Gekko 包得到相同的结果。

我尝试用不同的包在 Python 中实现线性优化的代码。

使用 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

使用 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)

使用 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)

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

使用 GEKKO 包的解决方案

[0.0] [36.210291349] [63.789708661]

SCIPY包解决方案

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])

使用 PULP 包的解决方案

X = 0.0
Y = 100.0
Z = 0.0

最佳答案

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

  • 每个解决方案都达到其目标的最小值:100
  • 每个解决方案都保留变量边界
  • 每个解决方案都保留“类似单纯形”的约束:sum(x) = 100

忽略 float 限制,您的问题有无数种不同的最佳解决方案。

不同的求解器(包括不同的求解方法)可能会导致不同的解决方案(从众多解决方案中选择一个)。这里例如:

  • LP 算法,例如 Simplex (Pulp)
  • NLP 算法,例如序列最小二乘法 (scipy)
    • (请记住:scipy 中也有 LP 求解器,对于一些先验定义的优化问题,通常更专业的求解器会更好 -> LP 与 NLP)

关于python - 如何使用 Pulp Gekko 和 Scipy 包修复具有不同结果的线性优化问题的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55674412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com