运筹学练习Python精解——存储论
练习1
某电子设备厂对一种元件的需求为每年2000件,不需要提前订货,每次订货费为25元。该元件每件成本为50元,年存贮费为成本的20%。如发生供应短缺,可在下批货到时补上,但缺货损失为每件每年30元。(1)求经济订货批量及全年的总费用:(2)如不允许发生供应短缺,重新求经济订货批量,并与(1)中的结果比较。
解题过程
-
允许供应短缺的情境
在允许供应短缺的情况下,我们使用以下公式来计算经济订货批量(EOQ):
其中:- 是需求量(每年2000件)
- 是订货成本(25元/次)
- 是每件的存储成本(50元的20%,即10元)
- 是每件的缺货成本(30元)
- 是每件的存储成本(10元)
-
不允许供应短缺的情境
在不允许供应短缺的情况下,我们使用传统的经济订货批量公式:
import math
def total_cost(Q, D, S, H, p, d, allow_shortage=True):
if allow_shortage:
# 计算EOQ时,允许短缺
EOQ = math.sqrt((2 * D * S) / (H * (1 - (d / (H + p)))))
shortage_cost = (D / EOQ) * (p * EOQ * (1 - (d / (H + p))))
holding_cost = (D / EOQ) * (d * EOQ / 2)
else:
# 计算EOQ时,不允许短缺
EOQ = math.sqrt((2 * D * S) / H)
shortage_cost = 0
holding_cost = (D / EOQ) * (H / 2) * EOQ
order_cost = (D / EOQ) * S
purchase_cost = D * 50 # 每件成本是50元
total = order_cost + holding_cost + purchase_cost + shortage_cost
return EOQ, total
# 参数定义
D = 2000 # 每年需求量
S = 25 # 订货成本
H = 50 * 0.2 # 年存贮费为成本的20%
p = 30 # 每件的缺货成本
d = H # 每件的存储成本
# 计算两种情境下的EOQ和总成本
EOQ_with_shortage, total_cost_with_shortage = total_cost(Q=0, D=D, S=S, H=H, p=p, d=d, allow_shortage=True)
EOQ_without_shortage, total_cost_without_shortage = total_cost(Q=0, D=D, S=S, H=H, p=p, d=d, allow_shortage=False)
print(f"(1) 允许供应短缺的经济订货批量(EOQ): {EOQ_with_shortage:.2f}")
print(f"(1) 允许供应短缺的总成本: {total_cost_with_shortage:.2f}")
print(f"(2) 不允许供应短缺的经济订货批量(EOQ): {EOQ_without_shortage:.2f}")
print(f"(2) 不允许供应短缺的总成本: {total_cost_without_shortage:.2f}")
#(1) 允许供应短缺的经济订货批量(EOQ): 115.47;允许供应短缺的总成本: 155433.01
#(2) 不允许供应短缺的经济订货批量(EOQ): 100.00;不允许供应短缺的总成本: 110500.00
练习2
某印刷厂每周需要32筒卷纸,订货费用为25元/次,存储费用为1元/筒周,供应商批发价格见下分段函数,在不允许缺货且及时供应,求最佳订货量等相关指标。
该题容易犯的错误是考虑一周的订货总成本。因为系统是动态的,必须考虑一个大周期的平均成本才是客观的理解。
import math
def annual_total_cost(Q, D, ordering_cost, holding_cost, price_per_unit):
# 每年的订货次数
order_times_per_year = D / Q
# 平均库存量
average_inventory = Q / 2
# 订货成本
order_cost = ordering_cost * order_times_per_year
# 存储成本
holding_cost_total = holding_cost * average_inventory * 52 # 每年的存储成本
# 采购成本
purchase_cost = price_per_unit * D # 一年的采购量是D
# 总成本
total = order_cost + holding_cost_total + purchase_cost
return total
# 参数定义
weekly_D = 32 # 每周需求量
annual_D = weekly_D * 52 # 每年需求量
ordering_cost = 25 # 每次订货费
holding_cost = 1 # 每简每周存储费用
# 计算经济订货批量(EOQ)
EOQ = math.sqrt((2 * annual_D * ordering_cost) / (holding_cost * 52))
# 批发价格区间和单位价格
price_ranges = [
(1, 9, 12),
(10, 49, 10),
(50, 99, 9.5),
(100, 1000, 9) # 用一个足够大的整数代替 float('inf')
]
# 初始化最小成本和最佳订货量
min_cost = float('inf')
best_order_quantity = 0
# 遍历所有价格区间
for price_range in price_ranges:
start, end, price_per_unit = price_range
# 计算当前价格区间端点的总成本
for Q in [start, end]:
if Q >= start and Q <= end:
cost = annual_total_cost(Q, annual_D, ordering_cost, holding_cost, price_per_unit)
if cost < min_cost:
min_cost = cost
best_order_quantity = Q
# 计算经济订货批量在当前价格区间内的总成本
if EOQ >= start and EOQ <= end:
Q = round(EOQ)
cost = annual_total_cost(Q, annual_D, ordering_cost, holding_cost, price_per_unit)
if cost < min_cost:
min_cost = cost
best_order_quantity = Q
print(f"经济订货批量(EOQ): {EOQ}")
print(f"最优订货量: {best_order_quantity}")
print(f"最小总成本: {min_cost}")
#经济订货批量(EOQ): 40.0
#最优订货量: 50,最小总成本: 17940.0
练习3
某工厂计划从国外进口150台设备,关键部件的备件必须在进口设备时一同购买,不能单独订购。该种备件订购单价为500元,无备件时导致的停产损失和修理费用合计为10000元。据有关资料计算,在计划使用期内,150台设备因关键部件损坏而需要的备件概率如下表,计算工厂应购买多少关键部件备件。
备件数量r | 0 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 9以上 |
---|---|---|---|---|---|---|---|---|---|---|
概率P(r) | 0.47 | 0.20 | 0.07 | 0.05 | 0.05 | 0.03 | 0.03 | 0.03 | 0.03 | 0.02 |
# 概率分布表
probabilities = [0.47, 0.20, 0.07, 0.05, 0.05, 0.05, 0.03, 0.03, 0.03, 0.02, 0.02]
# 参数定义
cost_per_part = 500 # 备件单价
loss_without_part = 10000 # 无备件时的损失
# 计算总成本函数
def calculate_total_cost(R, probabilities, cost_per_part, loss_without_part):
total_cost = 0
for r, prob in enumerate(probabilities):
if r > R:
# 停产损失成本
total_cost += prob * loss_without_part
else:
# 备件采购成本
total_cost += prob * cost_per_part * (R - r)
return total_cost
# 找出最优备件数量
min_cost = float('inf')
best_R = 0
for R in range(len(probabilities)): # 从0到10个备件
cost = calculate_total_cost(R, probabilities, cost_per_part, loss_without_part)
if cost < min_cost:
min_cost = cost
best_R = R
print(f"最优备件数量: {best_R}")
print(f"最小总成本: {min_cost:.2f}")
#最优备件数量: 5;最小总成本: 3055.00
练习4
某工厂生产一种产品,每吨成本为220元,每吨售价为320元,且每吨产品每月的存储费用为10元。该产品的月销售量服从正态分布,平均销售量为60吨,标准差为3吨。为了最大化获利的期望值,需要确定工厂每月应生产多少吨该产品。
该工厂生产某种产品,具体信息如下:
- 成本:220元/吨
- 售价:320元/吨
- 每月存贮费:10元/吨
- 月销售量:正态分布
- 平均值:60吨
- 标准差:3吨
问题:工厂应每月生产该产品多少,以使获利的期望值最大?
from scipy.stats import norm
# 参数定义
cost = 220 # 成本(元/吨)
price = 320 # 售价(元/吨)
holding_cost = 10 # 存货费用(元/吨)
mean_demand = 60 # 需求量平均值(吨)
std_dev_demand = 3 # 需求量标准差(吨)
# 计算关键的统计量z*
critical_ratio = (price - cost) / (price + holding_cost - cost)
z_star = norm.ppf(critical_ratio)
# 计算最优生产量Q*
optimal_production = mean_demand + z_star * std_dev_demand
print(f"最优生产量: {optimal_production:.2f} 吨")
#最优生产量: 64.01 吨
练习5
已知某物品的需求量的概率密度函数 表达为。其中,短缺成本为=115 元/件,持有成本为 =10 元/件。我们需要求解的最佳库存量 应满足经济订货量的条件。需求量 的值从 0 变化至 200,而概率密度函数 随 的增加而递减。
- 寻找最优库存量 Q*
给定需求的概率密度函数,以及短缺成本 元/件和持有成本 元/件,我们需要找到最优的库存量 - 计算临界比率 CR
首先,根据新闻订报模型的基本原理,计算临界比率:
- 确定最优库存量 Q*
然后,我们需要利用这个临界比率在需求分布中找到相应的需求量,满足累计分布函数 。 - 计算累计分布函数 F(x)
概率密度函数 对应的累计分布函数可以通过积分得到:
- 求解
然后我们找到所对应的
from scipy.optimize import fsolve
# 给定的参数
Cs = 115 # 短缺成本(元/件)
Ch = 10 # 持有成本(元/件)
# 计算临界比率
CR = Cs / (Cs + Ch)
# 定义累计分布函数 F(x)
def F(x):
return 0.02 * x - 0.00005 * x**2
# 定义方程 F(Q) - CR = 0
def equation(Q):
return F(Q) - CR
# 使用 fsolve 求解方程
Q_star = fsolve(equation, 0)[0]
print(f"最优库存量 Q*: {Q_star:.2f} 件")
#最优库存量 Q*: 53.03 件
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!