我目前是一名SAS用户,正在过渡到Python,我正在尝试转换一个程序,该程序可以根据先前的需求、价格和弹性系数来优化价格。
然而,我在制定需求约束时遇到了一些麻烦。
在这个问题中,我卖的是苹果和/或橙子;但是,我只能卖出100种商品的总和。此外,这两个项目的价格必须是相同的价格,因为我只允许一个价格。
以前,我以5.00美元的价格卖出了60个苹果,以5.00美元的价格卖出了30个橙子,弹性系数分别为-2.5和-1.5;然而,我之前卖了90个水果,但我被允许卖出100个水果的总和。那么,优化收入所需的价格是多少?
我使用的是来自https://pyomocontrib-simplemodel.readthedocs.io/en/latest/的pyomocontrib-simplemodel,我使用的求解器是来自https://www.coin-or.org/download/binary/Ipopt/的Ipopt二进制文件,并且我运行了示例问题,没有出现任何问题。
我已经测试了各种示例问题,并且能够很好地运行它们。
在SAS中,用于约束的公式最初来自这里:http://support.sas.com/documentation/cdl/en/ormpex/66104/HTML/default/viewer.htm#ormpex_ex21_sect009.htm
我根据需要修改了SAS代码,使其看起来像这样(我验证了它在SAS中工作正常):
con Demand_con {i in PRODUCTS}:
(Demand[i] - prev_demand[i]) / prev_demand[i]
= sum {PRODUCTS} elasticity[i] * (Price - prev_price[i]) / prev_price[i];但是,我一直在尝试使用Python中的pyomocontrib-simplemodel包来复制这个约束。
在Pyomo中,我的尝试如下所示:
m += ((demand[i]-prev_demand[i])/prev_demand[i] for i in products) == sum(elasticity[i] * ( price - prev_price[i]) / prev_price[i] for i in products)下面是完整的代码:
# Price Elasticity
from pyomo.contrib.simplemodel import *
# Input Variables
products = {'Apples','Oranges'}
prev_demand = {'Apples':60, 'Oranges':30}
elasticity = {'Apples':-2.5, 'Oranges':-1.5}
prev_price = {'Apples':5.00, 'Oranges':5.00}
supply = 100
# Create empty model
m = SimpleModel(maximize=True)
# Variables
price = m.var('price', within=NonNegativeReals)
demand = m.var('demand', products, within=NonNegativeReals)
# Objective
m += sum(price*demand[i] for i in products)
# Demand Constraint - Broken
m += ((demand[i]-prev_demand[i])/prev_demand[i] for i in products) == sum(elasticity[i] * ( price - prev_price[i]) / prev_price[i] for i in products)
#Supply Constraint
m += sum(demand[i] for i in products) <= supply
# Optimize
status = m.solve('ipopt')
# Print the status of the solved NLP
print("Objective = %f" % value(m.objective()))下面是我在制定需求约束时遇到的错误: AttributeError:'generator‘对象没有属性'is_expression_type’
我还尝试了这个语法:
# Demand Constraint - Broken
for i in products:
m += ((demand[i]-prev_demand[i])/prev_demand[i]) == sum(elasticity[i] * ( price - prev_price[i]) / prev_price[i])我得到的错误是: TypeError:'ProductExpression‘对象不可迭代
正确的答案应该是苹果和橙子的价格应该在4.87美元左右。
发布于 2019-10-11 22:05:45
# Price Elasticity
from pyomo.contrib.simplemodel import *
# Input Variables
products = {'Apples','Oranges'}
prev_demand = {'Apples':60, 'Oranges':30}
elasticity = {'Apples':-2.5, 'Oranges':-1.5}
prev_price = {'Apples':5.00, 'Oranges':5.00}
supply = 100
# Create empty model
m = SimpleModel(maximize=True)
# Variables
price = m.var('price', within=NonNegativeReals)
demand = m.var('demand', products, within=NonNegativeReals)
# Objective
m += sum(price*demand[i] for i in products)
# Demand Constraint - Broken
for i in products:
m += (demand[i]-prev_demand[i])/prev_demand[i] == sum(elasticity[i] * ( price - prev_price[i]) / prev_price[i] for i in products)
#Supply Constraint
m += sum(demand[i] for i in products) <= supply
# Optimize
status = m.solve('ipopt')
# Print the status of the solved NLP
print("Status = %s" % status.solver.termination_condition)
print("Objective = %f" % value(m.objective()))
for i in products:
print("%s = %f" % (demand[i], value(demand[i])))
print("%s = %f" % (price, value(price)))这使我得到了以下输出:
状态=最佳,目标= 486.111115,demandApples = 66.666667,demandOranges = 33.333334,价格= 4.86111
足够接近,我相信像XPRES而不是IPOPT这样的商业求解器可能会输出不同的答案。
https://stackoverflow.com/questions/58333008
复制相似问题