如何针对这个价格弹性问题在Pyomo中实施需求约束?

问题描述 投票:0回答:1

我目前是一个使用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用户,我正尝试转换一个程序,该程序可以根据先前的需求,价格和弹性系数来优化价格。但是,我遇到了一些...

python pyomo nonlinear-optimization ipopt
1个回答
0
投票
    # 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])))
© www.soinside.com 2019 - 2024. All rights reserved.