基于Pulp的365天FC库存与订单优化模型编码问题
配送中心库存优化模型编码问题
变量定义
- $x_1,x_2,...,x_{365}$:365天内从FC(配送中心)发往客户的订单量
- $o_1,..,o_{365}$:从DC(分销中心)发往FC的补货量
- $d_1,d_2,...,d_{365}$:每日客户需求量(参数,来自final.csv文件)
- $l_1,l_2,...,l_{365}$:每日缺货量,定义为 $l_i=d_i-x_i$
- $I_1,I_2,...,I_{365}$:FC的每日库存量,库存递推关系:
- $I_1=50-x_1$(初始库存为50)
- $I_2=I_1-x_2+o_1$
- $I_3=I_2-x_3+o_2$
- $I_4=I_3-x_4+o_2$(补货需1天到达)
- ...
- $I_{365}=I_{364}-x_{365}+o_{362}$
目标函数
最小化总成本:
$$50(x_1+\dots+x_{365}) + 2(o_1+\dots+o_{365}) + 3(l_1+\dots+l_{365}) + 1(o_1+\dots+o_{365})$$
问题描述
已使用Python Pulp库实现上述优化模型,但运行后所有变量返回零值,且未满足缺货约束,需正确的编码指导。
示例需求数据(final.csv)
days orders 1 0 2 4 3 1 4 4 5 0 6 1 7 2 8 0 9 5 10 2 11 5
现有Pulp代码
import pandas as pd from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable,LpMinimize,LpInteger from pulp import LpBinary from pulp import LpSolverDefault import pulp k3=pd.read_csv("final.csv") w2=k3["orders"] demandStore=w2.tolist() model = LpProblem(name="small", sense=LpMinimize) # 每日发往客户的订单量 xs = [LpVariable("xs{}_var".format(i+1), lowBound=0, upBound=50, cat="Integer") for i in range(0,365)] # 每日从DC发往FC的补货量 os= [LpVariable("os{}_var".format(i+1), lowBound=0, upBound=50, cat="Integer") for i in range(0,365)] # 每日缺货量 ls= [LpVariable("ls{}_var".format(i+1), lowBound=0, upBound=50, cat="Integer") for i in range(0,365)] # 每日库存量 iv=[LpVariable("iv{}_var".format(i+1), lowBound=0, upBound=50, cat="Integer") for i in range(0,365)] # 缺货约束 k=[] for i in range(0,365): w=ls[i]==demandStore[i]-xs[i] k.append(w) for i in range(0,365): model+=k[i] # 库存递推约束 cons1=iv[0]==50-xs[0] cons2=iv[1]==iv[0]-xs[1]+os[0] cons3=iv[2]==iv[1]-xs[2]+os[1] model+=cons1 model+=cons2 model+=cons3 # 发货量不超过库存量约束 k2=[] for i in range(0,365): cool2=xs[i]<=iv[i] k2.append(cool2) for i in range(0,365): model+=k2[i] # 后续天数库存递推约束 k3=[] for i in range(3,365): cool=iv[i]==iv[i-1]-xs[i]+os[i-1] k3.append(cool) for i in range(0,362): model+=k3[i] # 目标函数 One=pulp.lpSum([50*xs[i]+2*os[i]+60*ls[i]+1*iv[i] for i in range(0,365)]) model+=One model.solve() # 输出变量结果 name=[] value=[] for var in model.variables(): print(var.name, " ",var.value()) name.append(var.name) value.append(var.value())
内容的提问来源于stack exchange,提问作者Fernando Martinez
相关产品推荐
相关产品推荐

