首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Pyomo中实现此价格弹性问题的需求约束?

问如何在Pyomo中实现此价格弹性问题的需求约束?
EN

Stack Overflow用户
提问于 2019-10-11 09:17:39
回答 1查看 480关注 0票数 0

我目前是一名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中工作正常):

代码语言:javascript
复制
   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中,我的尝试如下所示:

代码语言:javascript
复制
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)

下面是完整的代码:

代码语言:javascript
复制
# 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’

我还尝试了这个语法:

代码语言:javascript
复制
# 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美元左右。

EN

回答 1

Stack Overflow用户

发布于 2019-10-11 22:05:45

代码语言:javascript
复制
    # 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这样的商业求解器可能会输出不同的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58333008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档