Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复一个具有不同结果的线性优化问题的代码;小包装?_Python_Optimization_Scipy_Pulp_Gekko - Fatal编程技术网

Python 如何修复一个具有不同结果的线性优化问题的代码;小包装?

Python 如何修复一个具有不同结果的线性优化问题的代码;小包装?,python,optimization,scipy,pulp,gekko,Python,Optimization,Scipy,Pulp,Gekko,我正在用Python设置一个新的线性优化代码。不幸的是,我没有同样的结果与纸浆,Scipy和Gekko包 我尝试用不同的包在Python中实现线性优化代码 用GEKKO优化 用Scipy进行优化 纸浆优化 我希望得到相同的结果,但实际结果不同,不幸的是: GEKKO软件包的解决方案 使用SCIPY包的解决方案 用纸浆包装的溶液 所有结果都正确/每个解算器都正确 每个解决方案都达到了其目标的最低值:100 每个解都保持变量的界 每个解都保持“单纯形”约束:sum(x)=100 忽略浮点限制,您

我正在用Python设置一个新的线性优化代码。不幸的是,我没有同样的结果与纸浆,Scipy和Gekko包

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

用GEKKO优化 用Scipy进行优化 纸浆优化 我希望得到相同的结果,但实际结果不同,不幸的是:

GEKKO软件包的解决方案 使用SCIPY包的解决方案 用纸浆包装的溶液
所有结果都正确/每个解算器都正确

  • 每个解决方案都达到了其目标的最低值:
    100
  • 每个解都保持变量的界
  • 每个解都保持“单纯形”约束:
    sum(x)=100
忽略浮点限制,您的问题有无限多个不同的最佳解决方案

不同的解算器(包括不同的解算方法)可能导致不同的解(从多个解中选择一个)。例如:

  • 类似单纯形(纸浆)的LP算法
  • NLP算法,如序列最小二乘法(scipy)
    • (请记住:scipy中也有LP解算器,如果给定一些先验定义的优化问题->LP与NLP,则更专业的解算器通常会更好)

对于线性优化问题,scipy除了“SLSQP”之外还有其他方法吗?我知道有这么多,但我不知道哪一个最适合这个问题!,但是我不能推荐基于单纯形的求解器。@AzizB.Ammar:如果答案解决了您的问题,请不要忘记将答案标记为已接受(您可以通过单击答案旁边的小复选框来完成,然后该复选框变为绿色)。
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
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)
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)
[0.0] [36.210291349] [63.789708661]
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])
X = 0.0
Y = 100.0
Z = 0.0