当前位置:网站首页>干货丨数学规划视角下的分货优化解题思路
干货丨数学规划视角下的分货优化解题思路
2022-08-04 12:22:00 【InfoQ】
一、问题描述
二、构造模型
业务规则1:尽可能满足门店的需求
业务规则2:大仓优先级
业务规则3:最小分货单元
3.代码实现
from coptpy import Envr, COPT
"""
问题参数
"""
# 大仓和门店列表
WH_LIST = ["wh1", "wh2"]
STORE_LIST = ["store1", "store2", "store3"]
# 大仓总量
WH_CAPACITY = {"wh1": 100, "wh2": 300}
# 门店目标库存水平
STORE_TARGET_INV = {"store1": 100, "store2": 80, "store3": 120}
# 门店库存水平
STORE_INV = {"store1": 50, "store2": 20, "store3": 30}
# 大仓优先级
PRIORITY = {
("wh1", "store1"): 0.9,
("wh2", "store1"): 0.1,
("wh1", "store2"): 0.9,
("wh2", "store2"): 0.1,
("wh1", "store3"): 0.05,
("wh2", "store3"): 0.95,
}
# 最小分货单元
MIQ = 6
# 惩罚系数
PENALTY_ORDER = 1
PENALTY_SLACK = 100
"""
创建模型
"""
# 创建模型
env = Envr()
model = env.createModel("xiaomi")
# 生成变量
x_dict = {} # 分货量
x_slack_dict = {} # 分货之后的缺货量
x_int_dict = {} # 为了满足最小分货单元的辅助变量
for i in WH_LIST:
for j in STORE_LIST:
x_dict[i, j] = model.addVar(vtype=COPT.CONTINUOUS, lb=0, name=f"order_{i}_{j}")
x_int_dict[i, j] = model.addVar(vtype=COPT.INTEGER, lb=0, name=f"order_int_{i}_{j}")
for j in STORE_LIST:
x_slack_dict[j] = model.addVar(vtype=COPT.CONTINUOUS, lb=0, name=f"order_slack_{j}")
# 设置目标函数
obj = PENALTY_ORDER * sum([sum([PRIORITY[i, j] * x_dict[i, j] for j in STORE_LIST]) for i in WH_LIST])
obj += PENALTY_SLACK * sum([x_slack_dict[j] for j in STORE_LIST])
model.setObjective(obj, sense=COPT.MINIMIZE)
# 增加约束
for i in WH_LIST:
# 每个大仓的分货总量不能超过限制
model.addConstr(sum([x_dict[i, j] for j in STORE_LIST]) <= WH_CAPACITY[i], f"le_capacity_{i}")
for j in STORE_LIST:
# 每个门店补货之后的库存水平要尽可能超过目标库存水平
model.addConstr(STORE_INV[j] + sum([x_dict[i, j] for i in WH_LIST]) + x_slack_dict[j] >= STORE_TARGET_INV[j], f"target_inventory_{j}")
for i in WH_LIST:
for j in STORE_LIST:
# 每个大仓发给每个门店的分货量要是最小分货单元的倍数
model.addConstr(MIQ * x_int_dict[i, j] == x_dict[i, j], f"miq_{i}_{j}")
"""
模型求解
"""
model.solve()
for i in WH_LIST:
for j in STORE_LIST:
# 获取大仓i发给门店j的分货量
print(f"{i} -> {j}: {x_dict[i, j].x}")
4.总结

边栏推荐
猜你喜欢
【UML】信息系统分析与设计知识点总结
Focusing on data sources, data quality and model performance to build a credit profile of small and micro enterprises
What is DevOps?Enough to read this one!
Tarjan 求有向图的强连通分量
涨姿势了!原来这才是多线程正确实现方式
LeetCode每日一题(858. Mirror Reflection)
程序猿七夕礼物-如何30分钟给女友快速搭建专属语聊房
244 page PDF!"2022 China cloud computing ecological blue book published
考研概率论与数理统计(知识点梳理)
罗振宇的A股梦,咋这么难圆?
随机推荐
外置USB供电与内置锂电池供电自动切换电路
Neck modules of the yolo series
隐私计算与数据流通:关系、作用及功能
《独行月球》猛药,治不了开心麻花内耗
【综合笔试题】难度 4.5/5,超超超经典数学运用题
MySQL必知必会(初级篇)
【HMS core】【FAQ】Account Kit、MDM能力、push Kit典型问题合集6
七夕还没选好礼物,快送这套美妆秘籍,保准没错~~
What is DevOps?Enough to read this one!
监督和半监督学习下的多标签分类综述
【PHP实现微信公众平台开发—基础篇】第2章 微信公众账号及申请流程详解
高速电路PCB布局布线参考
技术分享| 融合调度系统中的电子围栏功能说明
独立站卖家如何使用 WhatsApp Business API 建立有意义的客户关系?
Practical sharing of distributed link tracking Jaeger + microservice Pig on Rainbond
来 TDengine 开发者大会,洞悉数据技术发展的未来趋势
使用Stream多年,collect还有这些“骚操作”?
用VbScript控制光驱
动规(16)-并查集基础题——格子游戏
考研概率论与数理统计(知识点梳理)