1. 实际应用场景与痛点
场景
- 家庭每月固定采购米、面、油、牛奶、鸡蛋等易耗品
- 超市经常有不同商品的促销活动(打折、买一送一、满减)
- 商品有不同保质期,囤多了会过期浪费
- 想在保证不断货的前提下,最大化利用促销节省开支
痛点
- 人工计算囤货量复杂,容易算错
- 忽略促销时间窗口,错过优惠
- 囤货过多导致过期浪费
- 不同商品消耗速度不同,难以统一管理
- 缺乏数据驱动的决策支持
2. 核心逻辑讲解
1. 数据输入
- 常买商品列表(名称、保质期、月消耗量)
- 超市促销信息(商品、折扣、开始结束日期)
2. 数据处理
- 计算安全库存(考虑运输、补货周期)
- 计算最大可囤数量(基于保质期和消耗速度)
3. 促销分析
- 识别促销时间窗口
- 计算折扣后的单位成本
4. 优化模型
- 目标:在满足不断货条件下,总成本最低
- 约束:保质期、库存上限、促销时间
- 方法:贪心算法或线性规划(PuLP)
5. 输出推荐
- 每种商品的建议购买数量与时间
3. 项目结构
grocery_optimizer/
├── data_loader.py # 加载商品数据与促销信息
├── optimizer.py # 核心优化逻辑
├── models.py # 数据模型定义
├── config.py # 配置参数
├── requirements.txt # 依赖
├── README.md # 使用说明
└── sample_data/ # 示例数据
├── products.csv
└── promotions.json
4. 代码实现
"config.py"
# 安全库存天数
SAFETY_STOCK_DAYS = 3
# 最大库存天数(基于最短保质期)
MAX_STOCK_DAYS = 30
"models.py"
class Product:
def __init__(self, name, shelf_life_days, monthly_consumption):
self.name = name
self.shelf_life_days = shelf_life_days
self.monthly_consumption = monthly_consumption # kg 或 件
class Promotion:
def __init__(self, product_name, discount_rate, start_date, end_date):
self.product_name = product_name
self.discount_rate = discount_rate # 0.0 ~ 1.0
self.start_date = start_date
self.end_date = end_date
"data_loader.py"
import csv
import json
from models import Product, Promotion
def load_products(filepath):
products = []
with open(filepath, newline='', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
products.append(Product(
row['name'],
int(row['shelf_life_days']),
float(row['monthly_consumption'])
))
return products
def load_promotions(filepath):
with open(filepath, encoding='utf-8') as f:
data = json.load(f)
promotions = []
for item in data:
promotions.append(Promotion(
item['product_name'],
float(item['discount_rate']),
item['start_date'],
item['end_date']
))
return promotions
"optimizer.py"
from datetime import datetime, timedelta
from models import Product, Promotion
from config import SAFETY_STOCK_DAYS, MAX_STOCK_DAYS
def days_until_expiry(purchase_date, shelf_life_days):
expiry_date = purchase_date + timedelta(days=shelf_life_days)
return (expiry_date - datetime.now()).days
def recommend_purchase(product, promotions, current_stock):
daily_consumption = product.monthly_consumption / 30
safety_stock = daily_consumption * SAFETY_STOCK_DAYS
max_stock_days = min(product.shelf_life_days - SAFETY_STOCK_DAYS, MAX_STOCK_DAYS)
max_stock_amount = daily_consumption * max_stock_days
# 查找可用促销
best_discount = 1.0
promo_start = None
for p in promotions:
if p.product_name == product.name and p.discount_rate < best_discount:
best_discount = p.discount_rate
promo_start = datetime.strptime(p.start_date, "%Y-%m-%d")
# 计算建议购买量
need_to_buy = max(0, max_stock_amount - current_stock)
if need_to_buy <= 0:
return 0, None
# 如果有促销且在未来一周内开始,建议等到促销日购买
if promo_start and (promo_start - datetime.now()).days <= 7:
purchase_date = promo_start
else:
purchase_date = datetime.now()
return round(need_to_buy, 2), purchase_date.strftime("%Y-%m-%d")
主程序
"main.py"
from data_loader import load_products, load_promotions
from optimizer import recommend_purchase
products = load_products("sample_data/products.csv")
promotions = load_promotions("sample_data/promotions.json")
current_stock = {
"牛奶": 2.0,
"鸡蛋": 10,
"大米": 5.0
}
for p in products:
qty, date = recommend_purchase(p, promotions, current_stock.get(p.name, 0))
if qty > 0:
print(f"{p.name}: 建议购买 {qty} (单位),最佳购买时间 {date}")
else:
print(f"{p.name}: 库存充足,无需购买")
5.
"requirements.txt"
pandas
6. README.md
# 超市囤货最优解程序
基于大数据与商务智能,计算家庭囤货最优数量与时间,避免过期浪费。
## 功能
- 加载商品数据与促销信息
- 计算安全库存与最大可囤量
- 结合促销时间窗口推荐购买计划
- 输出最优购买数量与时间
## 安装
bash
pip install -r requirements.txt
## 使用
1. 在 `sample_data/` 中填写商品信息与促销信息
2. 修改 `current_stock` 字典为当前库存
3. 运行:
bash
python main.py
## 数据格式
products.csv:
name,shelf_life_days,monthly_consumption
牛奶,7,14
鸡蛋,30,60
大米,180,30
promotions.json:
json
[
{"product_name": "牛奶", "discount_rate": 0.8, "start_date": "2026-02-01", "end_date": "2026-02-07"}
]
7. 核心知识点卡片
知识点 说明
安全库存 防止补货延迟导致断货
保质期约束 库存不能超过保质期允许的最大天数
促销分析 识别折扣窗口,优化购买时机
贪心算法 在满足约束下优先利用促销
数据建模 用类表示商品与促销,便于扩展
CSV/JSON 数据加载 标准化输入输出
8. 总结
本程序通过数据驱动的方式,结合商品保质期、消耗速度和促销信息,计算出最优囤货方案,解决了家庭采购中的浪费与断货问题。
未来可扩展:
- 接入超市 API 实时获取促销信息
- 使用线性规划(PuLP)做全局优化
- 增加可视化报表(Matplotlib/Plotly)
- 开发 Web/GUI 界面方便日常使用
如果你需要,还可以做一个简单的 Flask Web 版本,让用户在线输入商品和库存,实时生成囤货计划并导出 Excel 报表。
利用AI高效解决实际问题,如果你觉得这个工具好用,欢迎关注我!