我目前是一个使用Python的SAS用户,我正在尝试转换一个程序,该程序可以根据先前的需求,价格和弹性系数来优化价格。
但是,我在制定需求约束时遇到了麻烦。
在这个问题上,我卖苹果和/或橙子;但是,我总共只能卖出100件商品。而且,因为我只允许一个价格,所以两个项目的价格必须相同。
[以前,我以5.00美元的价格卖出60个苹果,以5.00美元的价格卖出30个橙子,其弹性系数分别为-2.5和-1.5;但是,我以前卖了90个水果,但我总共允许卖100个水果。那么优化收入所需的价格是多少?
我正在使用pyomocontrib-simplemodel从https://pyomocontrib-simplemodel.readthedocs.io/en/latest/和我正在使用的求解器是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:“发电机”对象没有属性“ 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美元左右。
我目前是一个使用python的SAS用户,我正尝试转换一个程序,该程序可以根据先前的需求,价格和弹性系数来优化价格。但是,我遇到了一些...
# 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()))
print("%s = %f" % (price, value(price)))
for i in products:
print("%s = %f" % (demand[i], value(demand[i])))