发布时间:2026/8/30 8:46:39
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/8/29 17:48:31

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

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

2026/8/28 1:05:54

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

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

2026/8/30 8:44:30

基于Rust的零分配预测遥测引擎:从拓扑关系到实时数据流分析

Topological Horizon 这个项目名听起来很偏研究,但它实际要解决的问题非常工程化:在持续涌入的遥测数据上做预测性分析时,既要保证低延迟、低抖动,又要让内存占用可控、行为可预期。直白地说,这是一个以零分配为目标、…

2026/8/30 8:44:30

基于微信小程序云开发的活动报名系统设计与实践

简介:这是一套面向微信小程序初学者与实战开发者的在线活动报名系统源码,聚焦轻量级活动管理场景,解决线下活动组织方线上化报名、支付与通知的全流程需求。资源包含74个文件,涵盖13个JS逻辑层、10个WXML视图层、11个WXSS样式层及…

2026/8/30 8:44:30

论坛主题与回复显示异常排查:从数据链路到根因修复

1. 是bug还是错觉:topics与replies页面到底发生了什么 1.1 三类能直接复现的异常现象 我刚接手一个论坛项目的维护工作时,收到的第一条用户反馈就是关于“topics”和“replies”的。用户说得很含糊:“论坛好像有bug,主题和回复对…

2026/8/30 8:44:30

MCP支付流程中signer不可达的完整处理方案

MCP(Model Context Protocol)这几年在 agent 开发里出现频率很高,尤其是把工具能力通过 MCP server 暴露给大模型之后,很多自动化流程都开始尝试用 agent 来串联。真正落地时你会发现,工具能调通只是起点,业…

2026/8/30 8:44:30

STM32 USB DP/DM引脚被“抢占”之谜:从底层机制到完美释放方案

做嵌入式这些年,STM32几乎是我离不开的MCU。最近在调试一个USB虚拟串口项目时,又被一位读者问到特别典型的疑问:为什么我明明把DP/DM引脚“共享”给了别的外设,USB却能直接把它们接管?这个问题看似基础,背后…

2026/8/30 8:39:30

5G多载波波形PAPR抑制技术:OFDM、FBMC与UFMC的工程实践对比

简介:本资源聚焦5G通信系统中OFDM、FBMC与UFMC三类关键多载波波形的峰均功率比(PAPR)抑制技术,面向通信工程专业高年级本科生、研究生及无线物理层算法研发工程师,解决高PAPR导致功放效率下降、硬件成本上升与非线性失…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…