建模实战|第四期:乳制品定价问题建模和求解-python调用gurobi求解器

1.问题概要

这个案例我们将学习如何使用数学优化来解决一个常见但关键的农业定价问题:确定一个国家乳制品的价格和需求,以使这些产品的销售总收入最大化。我们会将问题建模为二次优化问题,并使用gurobi求解器解决它。

2.乳制品定价问题描述

一个国家的政府想要决定乳制品的价格:牛奶、黄油和奶酪。所有这些产品都是(直接或间接)由该国的原料奶生产业务生产的。这种原料奶分为两种主要成分:脂肪和干物质。每年用来生产牛奶、黄油和两种奶酪的脂肪总量为600,000吨干物质为750,000吨。生产牛奶、黄油和两种奶酪这几种产品的组成百分比如下表所示:

Composition(成分)Fat(脂肪)Dry matter(干物质)
Milk49
Butter802
Cheese 13530
Cheese 22540

下表显示了去年乳制品的国内消费(需求)和价格:

乳制品种类MilkButterCheese 1Cheese 2
Deamand(去年的需求量)1000吨4.820.320.210.07
Price(去年的价格)美元/吨2977201050815

需求价格弹性需求交叉价格弹性如下表所示:

MilkButterCheese 1Cheese 2Cheese 1 to Cheese 2Cheese 2 to Cheese 1
0.42.71.10.40.10.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.相关阅读

Gurobi-modeling-examples

相关视频会在后续发布,欢迎关注我的bilibili:无形忍者的个人空间-无形忍者个人主页-哔哩哔哩视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值