DVD库存与采购的3种数学模型对比:基于05年数学建模赛题的Python仿真

发布时间:2026/10/21 4:26:07

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/10/19 13:17:52

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

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

2026/10/17 22:54:39

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

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

2026/10/19 9:32:41

Agent开发实战:从超时故障到生产级交付的工程化路径

1. 这不是“学完100天就能造出贾维斯”,而是把Agent开发从玄学拉回工程现场“100天搞定Agent开发”——看到这个标题,我第一反应是关掉页面。不是因为不屑,而是太熟悉了:过去三年里,我带过17个AI应用落地项目&#xff…

2026/10/21 4:21:14

Gitee公钥设置与Access Token报错排查:SSH和HTTPS认证机制详解

很多人第一次接触Gitee(码云)的仓库认证,都是在某次git push报错中开始的。最常见的一类报错是:Incorrect username or password ( access token )。更迷惑的是,你明明已经把公钥配到Gitee后台了,甚至为了保…

2026/10/21 4:21:14

无GPU跑本地代码模型:Ollama+Qwen-Coder+Eclipse

如果你手头正好有一台没有独立显卡的普通电脑,又想体验一下现在很火的本地代码大模型,这篇文章大概率对你有用。我会把一条完整的流程走给你看:用Ollama在CPU上拉取并运行qwen-coder代码模型,然后在Eclipse里通过AI Coder 插件把它…

2026/10/21 4:21:14

技能修炼四步法:从知识到稳定输出的实战指南

不用把“skills”想得太玄乎。简历上写“熟练掌握”“精通”是一回事,真到用的时候能不能稳定交付,又是另一回事。我见过太多人背了一堆理论知识,开口就是专业术语,但一上手就露馅。这东西说白了,就是一个人能不能把学…

2026/10/21 4:21:14

Agent技能化架构:可插拔、可观测、可治理的能力抽象范式

1. “agent-skills”不是新词,而是能力建模的底层转向最近在多个技术社区和内部分享中,频繁看到“agent-skills”这个组合词被单独拎出来讨论——它既不指代某个开源库,也不是某家公司的专有产品名,更不是语法糖式的命名惯例。我第…

2026/10/21 4:21:14

知识工作插件:本地LLM驱动的跨工具知识调度系统

1. 项目概述:这不是插件,而是一套知识工作者的“操作系统增强层”“knowledge-work-plugins”这个标题乍看像某个开源仓库名,但拆开来看——knowledge work(知识工作)是核心场景,“plugins”(插…

2026/10/21 4:16:14

经典进程同步问题全解析:信号量与PV操作实战

并发程序跑着跑着突然“卡死”,多半不是死循环,而是多个进程或线程在互相等对方释放资源。教科书把这类现象抽象成“经典进程同步问题”,我第一次看这些题目时觉得离真实开发很远,后来做消息队列、多线程任务调度和数据库并发控制…

2026/10/19 18:06:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/21 0:00:35

交通流仿真实战:IDM跟驰与MOBIL换道模型参数调优与避坑指南

简介:这份资源是面向交通工程学习者与Python开发者的微观交通流仿真项目,核心实现智能驾驶模型(IDM)下的车辆跟驰与换道行为,可用于理解速度、密度与流量之间的动态关系,适合具备Python基础、希望深入交通模…

2026/10/21 0:00:35

揭穿智能体表面顺从:用追踪代码重建任务执行确定性

1. 表面顺从不是智能体的“礼貌”,而是任务执行链路上的隐性断点最近在调试一个跨平台长周期任务调度系统时,我反复遇到一种令人困惑的现象:智能体在用户指令发出后,几乎秒级响应“已收到”“正在处理”“请稍候”,UI上…

2026/10/21 0:00:35

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑