1.问题概要
这个案例我们将学习如何使用数学优化来解决一个常见但关键的农业定价问题:确定一个国家乳制品的价格和需求,以使这些产品的销售总收入最大化。我们会将问题建模为二次优化问题,并使用gurobi求解器解决它。
2.乳制品定价问题描述
一个国家的政府想要决定乳制品的价格:牛奶、黄油和奶酪。所有这些产品都是(直接或间接)由该国的原料奶生产业务生产的。这种原料奶分为两种主要成分:脂肪和干物质。每年用来生产牛奶、黄油和两种奶酪的脂肪总量为600,000吨,干物质为750,000吨。生产牛奶、黄油和两种奶酪这几种产品的组成百分比如下表所示:
Composition(成分) | Fat(脂肪) | Dry matter(干物质) |
---|---|---|
Milk | 4 | 9 |
Butter | 80 | 2 |
Cheese 1 | 35 | 30 |
Cheese 2 | 25 | 40 |
下表显示了去年乳制品的国内消费(需求)和价格:
乳制品种类 | Milk | Butter | Cheese 1 | Cheese 2 |
---|---|---|---|---|
Deamand(去年的需求量)1000吨 | 4.82 | 0.32 | 0.21 | 0.07 |
Price(去年的价格)美元/吨 | 297 | 720 | 1050 | 815 |
需求价格弹性和需求交叉价格弹性如下表所示:
Milk | Butter | Cheese 1 | Cheese 2 | Cheese 1 to Cheese 2 | Cheese 2 to Cheese 1 |
---|---|---|---|---|---|
0.4 | 2.7 | 1.1 | 0.4 | 0.1 | 0.4 |
问题的约束:价格指数不能高于去年,去年总需求成本的价格指数是1.939(以千美元计算)。
问题的目标:确定什么样的价格和需求能使总收入最大化。
PS~这里对经济学中名词解释一下。
需求价格弹性是需求变动率与引起其变动的价格变动率的比率,反映商品价格与市场消费容量的关系,表明价格升降时需求量的增减程度,通常用 需求量变动的百分数与价格变动的百分数的比率来表示。智库解释 参见这里
需求交叉价格弹性反映了相应于其他商品价格的变动,消费者对某种商品需求量变动的敏感程度,其 弹性系数定义为需求量变动的百分比除以另外商品价格变动的百分比。 交叉弹性系数可以大于0、等于0或小于0,它表明两种商品之间分别呈替代、不相关或互补关系。智库解释 参见这里
1.需求价格弹性的计算公式:
3.乳制品定价问题建模
4.python调用gurobi进行求解
部分代码展示:
import pandas as pd
import gurobipy as gp
from gurobipy import GRB
# List of I products.
I = ['milk', 'butter', 'cheese1', 'cheese2']
J = ['fat', 'dryMatter']
# Create a dictionary to capture the percentage composition of the products.
ji, t = gp.multidict({
('fat','milk'): 0.04,
('fat','butter'): 0.8,
('fat','cheese1'): 0.35,
('fat','cheese2'): 0.25,
('dryMatter','milk'): 0.09,
('dryMatter','butter'): 0.02,
('dryMatter','cheese1'): 0.3,
('dryMatter','cheese2'): 0.4
})
# Create a dictionary to capture the yearly availability of J (1000 tons).
J, c = gp.multidict({
('fat'): 600,
('dryMatter'): 750
})
# Create a dictionary to capture last year's domestic dlast and prices
I, dlast, dprice, e = gp.multidict({
('milk'): [4.82, 297, 0.4],
('butter'): [0.32, 720, 2.7],
('cheese1'): [0.21, 1050, 1.1],
('cheese2'): [0.07, 815, 0.4]
})
e12 = 0.1
e21 = 0.4
p_index = 1939
model = gp.Model('AgriculturalPricing')
# Set global parameters.
model.params.nonConvex = 2
# Quantity of I products.
d = model.addVars(I, name="d")
# Price of I products.
p = model.addVars(I, name="p")
# Capacity constraint.
fatCap = model.addConstrs( (gp.quicksum(t[j,i]*d[i] for i in I) <= c[j] for j in J ),
name='fatCap')
5.结果输出
total revenue: 2066.4080457081627
price and demand:
Products Price Demand
milk $322.00 4,659.00
butter $422.00 677.00
cheese1 $833.00 265.00
cheese2 $1,111.00 54.00
(⊙o⊙)…本来打算用ortools求解的,发现ortools居然不支持二次规划QP
6.相关阅读
相关视频会在后续发布,欢迎关注我的bilibili:无形忍者的个人空间-无形忍者个人主页-哔哩哔哩视频