optimization - Pyomo 和 Gekko 定值(value)与 Excel 不同

标签 optimization pyomo gekko operations-research

我试图使用 2 个 python 求解器获得与 Excel 相同的结果: 盖柯和皮莫。 这是实用管理科学 (Christian Albright) 书中第 350 页的非线性定价模型。 Excel提供的解决方案是将我的商品以93.31美元的价格出售,获得9323美元的利润。

results

然而,在 Gekko 和 Pyomo 中输入同样的问题会导致售价 80 美元,利润 9000 美元。 我想知道是否有任何参数我忘记得到与 Excel 相同的结果?

Pyomo 代码:

import pyomo.environ as pyo
import sys

solvername='ipopt'
solverpath_folder='C:\\ipopt' #does not need to be directly on c drive
solverpath_exe='C:\\ipopt\\bin\\ipopt' #does not need to be directly on c drive
sys.path.append(solverpath_folder)

model = pyo.ConcreteModel()

model.item = pyo.Var(within=pyo.PositiveReals, bounds=(0, 100000), initialize=1)

model.OBJ = pyo.Objective(expr = ((model.item - 50) * (1100 - 10 * model.item)), sense=pyo.maximize)

results = pyo.SolverFactory(solvername,executable=solverpath_exe).solve(model)

print("item=", pyo.value(model.item))
print("objective=", pyo.value(model.OBJ))
print(results)

壁虎代码:

from gekko import GEKKO

m = GEKKO(remote=False) # Initialize gekko

m.options.SOLVER = 1
p1 = m.Var(integer=False)
x1 = m.Var(integer=False)
m.Equation(x1 == 1100 - 10 * p1)
m.Maximize((p1 - 50) * (1100 - 10 * p1)) 

m.options.IMODE = 3 # Steady state optimization
m.solve() # Solve
print('Solution')
print('x1: ' + str(p1.value))
print('Objective: ' + str(m.options.objfcnval))

两个 python 求解器 = 相同的结果 = 80 美元定价和 9000 美元利润,而不是使用 Excel 非线性 Grg 求解器的 93.31 美元定价和 9323 美元利润。

我使用线性需求函数(y = -10x+ 1100)而不是恒定弹性曲线,就像他们在书中和 Excel 结果中所做的那样,我想知道问题是否是这样的?

(问题是我不知道常数弹性曲线中的4E是什么,所以我无法用Python输入它)

demand

最佳答案

这是 Python Gekko 中的解决方案:

profit

from gekko import GEKKO
m = GEKKO()

p = m.Var(lb=50)  # price
d = m.Var(lb=100) # demand
m.Equation(d == 3.777178e6*p**(-2.154))
m.Maximize((p-50)*d)

m.solve()
print('Solution')
price = p.value[0]
obj = -m.options.objfcnval
print(f'Price: {price:0.2f}')
print(f'Profit: {obj:0.2f}')

# view profit versus price solution
import numpy as np
import matplotlib.pyplot as plt
px = np.linspace(55,110)
dx = 3.777178e6*px**(-2.154)
profit = (px-50)*dx
plt.plot(px,profit)
plt.plot(price,obj,'o',markersize=10,color='orange')
plt.grid(); plt.xlabel('Price'); plt.ylabel('Profit')
plt.show()

您是正确的,线性函数是差异的根源。 4E+064000000 的科学计数法,但 Excel 对 3777178 中的数字进行四舍五入。如果您对 2.154xxx 使用更多数字,它可能会得到与 Excel 完全相同的答案。

 ---------------------------------------------------
 Solver         :  IPOPT (v3.12)
 Solution time  :   9.999999994761311E-003 sec
 Objective      :   -9343.94630932932     
 Successful solution
 ---------------------------------------------------
 
Solution
Price: 93.327556326
Profit: 9343.9463093

关于optimization - Pyomo 和 Gekko 定值(value)与 Excel 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75653054/

相关文章:

Java Runtime.maxMemory 不正确?

python - 如何在类中使用 Pyomo 装饰器

python - 使用 Gekko 的 ARX 模型的 MPC

css - 图像在 HTML 或 CSS 中加载速度更快吗?

c - 预处理器定义 VS 局部变量,速度差异

python - 通过 Pyomo 的索引集索引的变量

python - 我什么时候在 Gekko 中使用 Param 而不是 Const?

python - 使用 GEKKO 模拟具有巨大阵列的状态空间方程

c# - for 循环优化 - 需要还是不需要?

python - Pyomo 无法使用索引集索引组件