我试图使用 2 个 python 求解器获得与 Excel 相同的结果: 盖柯和皮莫。 这是实用管理科学 (Christian Albright) 书中第 350 页的非线性定价模型。 Excel提供的解决方案是将我的商品以93.31美元的价格出售,获得9323美元的利润。
然而,在 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输入它)
最佳答案
这是 Python Gekko 中的解决方案:
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+06
是 4000000
的科学计数法,但 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/