运筹学练习Python精解——存储论

练习1

某电子设备厂对一种元件的需求为每年2000件,不需要提前订货,每次订货费为25元。该元件每件成本为50元,年存贮费为成本的20%。如发生供应短缺,可在下批货到时补上,但缺货损失为每件每年30元。(1)求经济订货批量及全年的总费用:(2)如不允许发生供应短缺,重新求经济订货批量,并与(1)中的结果比较。
解题过程

  • 允许供应短缺的情境
    在允许供应短缺的情况下,我们使用以下公式来计算经济订货批量(EOQ): EOQ=2DSH(1dH+p)
    其中:

    • D 是需求量(每年2000件)
    • S 是订货成本(25元/次)
    • H 是每件的存储成本(50元的20%,即10元)
    • p 是每件的缺货成本(30元)
    • d 是每件的存储成本(10元)
  • 不允许供应短缺的情境
    在不允许供应短缺的情况下,我们使用传统的经济订货批量公式:

EOQ=2DSH

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元/筒周,供应商批发价格见下分段函数,在不允许缺货且及时供应,求最佳订货量等相关指标。

K(Q)={12if 1Q910if 10Q499.5if 50Q999.0if 100Q

该题容易犯的错误是考虑一周的订货总成本。因为系统是动态的,必须考虑一个大周期的平均成本才是客观的理解。

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

已知某物品的需求量的概率密度函数f(x) 表达为0.020.0001x。其中,短缺成本为Cs=115 元/件,持有成本为Ch =10 元/件。我们需要求解的最佳库存量 Q应满足经济订货量的条件。需求量x 的值从 0 变化至 200,而概率密度函数 f(x)x 的增加而递减。

  • 寻找最优库存量 Q*
    给定需求的概率密度函数f(x)=0.020.0001x,以及短缺成本 Cs=115元/件和持有成本Ch=10 元/件,我们需要找到最优的库存量Q
  • 计算临界比率 CR
    首先,根据新闻订报模型的基本原理,计算临界比率:

CR=CsCs+Ch

  • 确定最优库存量 Q*
    然后,我们需要利用这个临界比率在需求分布中找到相应的需求量Q,满足累计分布函数 F(Q)=CR
  • 计算累计分布函数 F(x)
    概率密度函数f(x) 对应的累计分布函数F(x)可以通过积分得到:

F(x)=0x(0.020.0001t)dt=0.02x0.00005x2

  • 求解 Q
    然后我们找到F(Q)=CR所对应的Q
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 件
posted @   郝hai  阅读(79)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示