当前位置:网站首页>干货丨数学规划视角下的分货优化解题思路
干货丨数学规划视角下的分货优化解题思路
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.总结

边栏推荐
猜你喜欢
COVID-CT新冠肺炎检测(DenseNet网络)
How to develop small program plug-ins to achieve profitability?
“蔚来杯“2022牛客暑期多校训练营5 B、C、F、G、H、K
Hit the interview!The latest interview booklet of Ali Jin, nine silver and ten is stable!
UMA & Hong Kong Polytechnic & Ali propose SP-ViT to learn 2D space prior knowledge for visual Transformer!
【PHP实现微信公众平台开发—基础篇】第2章 微信公众账号及申请流程详解
03 多线程与高并发 - ReentrantLock 源码解析
ECCV 2022 | Towards Data Efficient Transformer Object Detectors
yolo系列的head模块
《独行月球》猛药,治不了开心麻花内耗
随机推荐
来 TDengine 开发者大会,洞悉数据技术发展的未来趋势
The head module of the yolo series
博云入选 Gartner 中国 DevOps 代表厂商
break与continue超详解!!!
如何做好企业数字化转型?这10份靠谱案例收藏了(附下载)
数据中台建设(九):数据中台资产运营机制
新SCADA 系统:集成边缘计算、MQTT 和云平台
形态学(膨胀、腐蚀)
基于BiLSTM的回归预测方法
微信服务号调用API实现微信报警
【综合笔试题】难度 4.5/5,超超超经典数学运用题
集群监控——Zabbix
exness:美联储重现鹰派口吻,黄金承压面临转跌信号
缓存中间件技术选型Memcached、MongoDB、Redis
涨姿势了!原来这才是多线程正确实现方式
年轻人为什么不喜欢买蒙牛、伊利了?
如何让 WPF 程序更好地适配 UI 自动化
什么是 DevOps?看这一篇就够了!
Chinese valentine's day of young people crazy to make money, earn 140000 a week
力扣每日一题-第48天-345. 反转字符串中的元音字母