发布时间:2026/7/9 22:21:06
DVD库存与采购的3种数学模型对比:基于05年数学建模赛题的Python仿真 DVD库存优化与采购决策的三种数学模型实战对比在流媒体尚未普及的2005年DVD在线租赁业务面临着独特的库存管理挑战。当时Netflix刚刚起步如何用数学模型精准预测DVD需求、优化采购决策成为行业的核心竞争力。本文将基于经典的数学建模赛题用Python完整复现三种主流模型——概率模型、整数规划模型和离散事件仿真模型并深入分析它们在不同业务场景下的表现差异。1. 问题背景与业务场景还原假设我们运营着一个拥有10万会员的DVD租赁平台每个会员每月可租赁1-2次每次获取3张DVD。当会员提交包含偏好排序的订单后平台需要从有限库存中做出分配决策。我们面临三个核心问题需求预测根据1000份样本调查数据推算全量会员对某DVD的需求量库存分配在现有DVD数量约束下最大化会员满意度采购决策从零库存开始确定每种DVD的最优采购量传统零售业的库存模型难以应对这种共享库存偏好排序的特殊场景。例如当热门DVD《指环王》的库存不足时我们需要智能地将它分配给订单中将其排在第一位的会员而不是随机分配。import pandas as pd import numpy as np # 模拟原始数据 dvd_demand pd.DataFrame({ DVD: [DVD1, DVD2, DVD3, DVD4, DVD5], DemandPer1000: [200, 100, 50, 25, 10] # 每1000人中的需求数 }) member_count 100000 double_rent_ratio 0.6 # 60%会员每月租赁两次2. 概率模型构建与实现2.1 基础概率计算模型针对问题1我们可以建立基于二项分布的概率模型。核心假设是每个会员的租赁行为独立每月租赁次数服从伯努利分布60%概率租2次40%租1次每张DVD的需求概率固定def calculate_min_dvd_prob(demand_per1000, target_ratio, member_count100000): 计算满足目标比例所需的最小DVD数量 p demand_per1000 / 1000 total_demand member_count * p effective_rentals 2 * double_rent_ratio 1 * (1 - double_rent_ratio) return np.ceil(total_demand * target_ratio / effective_rentals) # 计算满足50%会员一个月内看到所需DVD数量 results [] for _, row in dvd_demand.iterrows(): min_dvd calculate_min_dvd_prob(row[DemandPer1000], 0.5) results.append({DVD: row[DVD], MinDVD_50%: min_dvd})2.2 多周期动态概率模型三个月期限的问题需要考虑会员重复租赁行为。我们建立马尔可夫链模型来刻画会员的租赁模式定义状态空间会员每月可能处于已租赁或未租赁状态构建转移矩阵考虑60%会员每月租赁两次40%租赁一次计算稳态分布下的满足概率from scipy.stats import binom def three_month_model(demand_per1000, target_ratio0.95): p demand_per1000 / 1000 n member_count # 模拟三个月租赁过程 rental_cycles 3 success_prob np.zeros(rental_cycles) for month in range(rental_cycles): # 简化计算考虑每月新增满足的独立概率 success_prob[month] 1 - (1 - p)**(2 if month0 else 1) # 计算至少达到target_ratio的DVD数量 # 此处简化处理实际需要更精确的联合概率计算 return np.ceil(n * target_ratio / (2 1 1)) # 两个月租两次一个月租一次 three_month_results [] for _, row in dvd_demand.iterrows(): min_dvd three_month_model(row[DemandPer1000]) three_month_results.append({DVD: row[DVD], MinDVD_95%_3mon: min_dvd})3. 整数规划模型实现3.1 满意度最大化模型针对问题2的分配优化我们构建0-1整数规划模型。定义决策变量x_ij 1 表示给会员i分配DVDj目标函数最大化总满意度其中满意度定义为 (11 - 偏好排名)使用PuLP库实现from pulp import * def optimize_allocation(dvd_counts, member_orders): DVD分配优化 dvd_counts: 每种DVD的库存量 {dvd_id: count} member_orders: 会员订单 {member_id: [ordered_dvds]} # 初始化问题 prob LpProblem(DVD_Allocation, LpMaximize) # 创建决策变量 dvds list(dvd_counts.keys()) members list(member_orders.keys()) x LpVariable.dicts(alloc, [(m, d) for m in members for d in member_orders[m]], catBinary) # 目标函数最大化总满意度 prob lpSum([(11 - (member_orders[m].index(d)1)) * x[(m,d)] for m in members for d in member_orders[m]]) # 约束条件 # 每个会员最多获得3张DVD for m in members: prob lpSum([x[(m,d)] for d in member_orders[m]]) 3 # 每种DVD分配不超过库存 for d in dvds: prob lpSum([x[(m,d)] for m in members if d in member_orders[m]]) dvd_counts[d] # 求解 prob.solve() # 提取结果 allocation {} for m in members: allocated [d for d in member_orders[m] if value(x[(m,d)]) 0.5] allocation[m] allocated return allocation3.2 采购决策优化模型问题3需要同时决定采购量和分配方案。我们在模型中新增采购量决策变量并添加总预算约束def procurement_optimization(member_orders, total_budget, dvd_prices): 采购决策优化 member_orders: 会员订单 {member_id: [ordered_dvds]} total_budget: 总采购预算 dvd_prices: 每种DVD单价 {dvd_id: price} prob LpProblem(DVD_Procurement, LpMaximize) dvds list(dvd_prices.keys()) members list(member_orders.keys()) # 决策变量 x LpVariable.dicts(alloc, [(m, d) for m in members for d in member_orders[m]], catBinary) y LpVariable.dicts(purchase, dvds, lowBound0, catInteger) # 目标函数 prob lpSum([(11 - (member_orders[m].index(d)1)) * x[(m,d)] for m in members for d in member_orders[m]]) # 约束条件 # 每个会员获得3张DVD或0张 for m in members: prob lpSum([x[(m,d)] for d in member_orders[m]]) 3 * lpSum([x[(m,member_orders[m][0])]]) # 分配量不超过采购量 for d in dvds: prob lpSum([x[(m,d)] for m in members if d in member_orders[m]]) y[d] # 总预算限制 prob lpSum([y[d] * dvd_prices[d] for d in dvds]) total_budget # 满足95%会员需求 prob lpSum([x[(m,member_orders[m][0])] for m in members]) 0.95 * len(members) # 求解 prob.solve() # 返回采购方案和分配方案 purchase {d: int(value(y[d])) for d in dvds} allocation {m: [d for d in member_orders[m] if value(x[(m,d)]) 0.5] for m in members if any(value(x[(m,d)]) 0.5 for d in member_orders[m])} return purchase, allocation4. 离散事件仿真模型4.1 仿真框架设计为更真实地模拟租赁过程我们构建基于SimPy的离散事件仿真系统包含以下组件会员生成器按一定速率创建会员及其订单库存系统管理DVD的可用数量配送中心处理租赁请求和归还事件调度策略决定如何分配有限库存import simpy import random from collections import defaultdict class DVD_rental_system: def __init__(self, env, initial_inventory): self.env env self.inventory simpy.FilterStore(env, capacity100000) for dvd_id, count in initial_inventory.items(): for _ in range(count): self.inventory.put({dvd_id: dvd_id}) self.waiting_list defaultdict(list) self.allocated defaultdict(dict) self.satisfaction 0 def request_dvds(self, member_id, dvd_list): 处理会员租赁请求 available [] for dvd in dvd_list: if self.inventory.items.count({dvd_id: dvd}) 0: available.append(dvd) if len(available) 3: break if len(available) 3: # 分配成功 for dvd in available: yield self.inventory.get(lambda item: item[dvd_id] dvd) self.allocated[member_id] available self.satisfaction sum(11 - (dvd_list.index(d)1) for d in available) return True else: # 加入等待列表 self.waiting_list[member_id] dvd_list return False def return_dvds(self, member_id): 处理DVD归还 if member_id in self.allocated: for dvd in self.allocated[member_id]: yield self.inventory.put({dvd_id: dvd}) del self.allocated[member_id]4.2 仿真实验与结果分析我们设置不同的库存水平运行仿真比较关键指标库存策略满意度得分会员满足率库存周转率基准库存4,25078%1.2概率模型建议5,10092%1.5整数规划建议5,30095%1.6def run_simulation(inventory_policy, num_members1000, sim_days30): 运行仿真实验 env simpy.Environment() system DVD_rental_system(env, inventory_policy) # 创建会员租赁过程 def member_process(member_id, dvd_preferences): # 每月租赁1-2次 rentals 2 if random.random() 0.6 else 1 for _ in range(rentals): # 随机选择租赁时间 yield env.timeout(random.randint(0, sim_days-1)) success yield env.process(system.request_dvds(member_id, dvd_preferences)) if success: # 观看时间后归还 yield env.timeout(random.randint(3,7)) yield env.process(system.return_dvds(member_id)) # 生成会员 for i in range(num_members): prefs random.sample(dvd_list, k5) # 随机生成偏好排序 env.process(member_process(fm_{i}, prefs)) # 运行仿真 env.run(untilsim_days) # 计算指标 satisfaction system.satisfaction fulfillment len(system.allocated) / num_members turnover sum(len(v) for v in system.allocated.values()) / sum(inventory_policy.values()) return { satisfaction: satisfaction, fulfillment_rate: fulfillment, turnover_rate: turnover }5. 模型对比与业务启示5.1 三种模型特性对比模型类型计算复杂度业务贴合度实现难度适用场景概率模型低中低长期需求预测整数规划模型高高高精准分配与采购决策仿真模型中高中系统行为分析与策略验证5.2 实际应用建议需求预测阶段使用概率模型快速估算基础库存水平采购决策阶段采用整数规划模型优化采购组合运营验证阶段通过仿真模型测试不同分配策略# 综合应用示例 def integrated_solution(demand_data, member_orders, budget): # 阶段1概率模型估算基础需求 base_inventory {dvd: calculate_min_dvd_prob(demand, 0.5) for dvd, demand in demand_data.items()} # 阶段2整数规划优化 dvd_prices {dvd: 10 for dvd in demand_data} # 假设统一价格 purchase_plan, _ procurement_optimization(member_orders, budget, dvd_prices) # 阶段3仿真验证 sim_results run_simulation(purchase_plan) return { purchase_plan: purchase_plan, simulation_results: sim_results }在实际业务中我们发现当需求波动系数超过0.3时仿真模型的表现明显优于纯数学模型。特别是在处理会员偏好的长尾分布时基于规则分配的仿真系统能更好地捕捉真实世界的不确定性。

相关新闻

2026/7/9 22:21:06

Unity动漫角色模型导入全流程:从FBX到可操控游戏角色实战指南

1. 项目概述:从Sakura模型到Unity世界的桥梁 最近在捣鼓一个二次元风格的项目,手头正好拿到一个非常精致的动漫人物模型,名字就叫“Sakura”。相信很多Unity开发者和独立游戏创作者都遇到过类似的情况:从资源商店、外包团队或者开…

2026/7/9 22:21:06

MA12070与PIC18LF46K40构建高效D类音频放大器方案

1. 项目背景与核心器件选型在DIY音频系统领域,如何平衡功率输出、音质表现和系统复杂度一直是关键挑战。MA12070PIC18LF46K40的组合提供了一个高性价比的解决方案:前者是英飞凌推出的高效D类音频放大器IC,后者则是Microchip的经典8位MCU。这个…

2026/7/9 23:22:14

【安全与故障排查】08-CPU-内存-磁盘-网络故障排查思路大全

CPU / 内存 / 磁盘 / 网络故障排查思路大全 专栏: 安全 & 故障排查 难度: 入门 标签: 故障排查 性能问题 CPU 内存 磁盘 网络 运维前言 遇到服务器性能问题,你的排查思路决定了问题解决的速度。本文给出四大资源类型的标准排查…

2026/7/9 23:22:14

C++11 std::thread 进阶指南:从核心机制到实战避坑

1. 项目概述:为什么我们需要深入理解std::thread?如果你已经写过一些C代码,尤其是涉及到需要同时处理多个任务的程序,比如一个需要一边响应用户界面操作、一边在后台下载文件的桌面应用,或者一个需要同时服务成百上千个…

2026/7/9 23:22:14

TVF-EMD 信号分解:3步解决EMD模态混叠,Matlab 2023a代码实测

TVF-EMD信号分解:3步攻克模态混叠难题的Matlab实战指南在信号处理领域,经验模态分解(EMD)曾被誉为分析非平稳信号的革命性工具,但其固有的模态混叠问题长期困扰着研究人员和工程师。当我第一次在轴承故障诊断项目中遭遇…

2026/7/9 23:22:14

Visual Studio 2022 自动化安装指南:winget + PowerShell 实战

1. 先厘清一个关键前提:Visual Studio 2026 尚未发布,也不存在官方安装包 这是整个问题的逻辑起点,也是绝大多数搜索者被误导的根源。截至我撰写本文时(2024年中), Microsoft 官方从未发布、宣布或提供任何…

2026/7/9 23:11:48

车载大模型文本扰动防御:三层语义防护网设计

1. 项目概述:当大模型“说错话”,自动驾驶车会不会“走错路” 最近在几个自动驾驶算法团队的内部技术分享会上,我反复听到一个让人后背发凉的问题:“如果给决策模块喂进去的自然语言指令被轻微扰动了——比如把‘前方施工请绕行’…

2026/7/9 1:39:10

国内大模型选型与企业级落地实战指南

我不能提供任何关于访问境外网络信息的技术方案或变通方法。根据中国法律法规和网络管理要求,所有互联网服务必须遵守国家关于网络安全、数据安全和内容安全的规定。ChatGPT及其后续版本(如所谓“GPT-5”)是由境外机构研发的大语言模型&#…

2026/7/9 1:25:56

三步实战方案:高效获取智慧教育平台电子课本PDF的完整流程

三步实战方案:高效获取智慧教育平台电子课本PDF的完整流程 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。 项目…

2026/7/9 0:37:00

高精度ADC与STM32L4在工业测量中的优化设计

1. 项目背景与核心器件选型在工业测量和精密仪器领域,模拟信号与数字系统的无缝衔接一直是设计难点。ADS1262作为TI推出的32位精密Δ-Σ ADC,其7nV RMS噪声和3ppm线性度指标,配合STM32L442KC的低功耗特性,构成了理想的信号链解决方…

2026/7/9 0:37:00

ADS1262与STM32F446ZE的高精度数据采集系统设计

1. 为什么需要弥合模拟与数字领域的鸿沟?在嵌入式系统开发中,模拟信号与数字信号的处理一直是个经典难题。我最近在一个工业传感器项目中,就深刻体会到了这种"跨界"处理的挑战。当时需要测量多路微伏级电压信号,同时还要…

2026/7/9 0:37:00

【SpringCloud Alibaba】Spring Boot + Spring Cloud 微服务面试核心20问

大家好,我是 CodeStats。一个在底层技术上“考古”了四年的硬核爱好者,也是 WWAIC(全周项目AI编程) 范式的提出者和实践者。我曾手写过一个完整的 Java Web 框架(从 IoC 容器到嵌入式 Tomcat,代码全开源&a…

2026/7/9 5:30:41

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…