多仓库选址-MIP问题建模及求解

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 多仓库选址-MIP问题建模及求解

物流公司经常遇到选址的问题,其实选址主要解决两个问题,1.选哪几个仓库。2.各网点分配至哪个仓库。本文介绍如何建立模型对离散选址问题进行求解。这是一个典型的混合整数规划问题(MIP),该问题在各个领域应用极其广泛。问题描述:有15个需要配送的网点。有三个配送中心可供选择。已知三个配送中心到各个网点的成本(是否货量加权,按实际情况修改数据。)

传入数据

本文使用pulp库进行求解。本例是小规模选址问题,无需调用第三方求解器,若规模较大,建议调用gurobi、cplex或者scip等求解器。

from pulp import *
Customer = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]#15个需配送的网点
Facility = ['Fac-1', 'Fac-2', 'Fac-3']#3个备选配送选址点
#从三个备选点运输过去的成本。成本可以是根据距离计算的运费,或者是根据货量计算的加权运费,可自行修改。
transportation_cost = {'Fac-1' : {1 : 4, 2 : 5, 3 : 6, 4 : 8, 5 : 10,6 : 1, 7 : 5, 8 : 1, 9 : 8, 10 : 10,11 : 14, 12 : 1, 13 : 1, 14 : 1, 15 : 1},
                       'Fac-2' : {1 : 1, 2 : 1, 3 : 3, 4 : 5, 5 : 8,6 : 2, 7 : 1, 8 : 16, 9 : 1, 10 : 1,11 : 1, 12 : 15, 13 : 1, 14 : 8, 15 : 7},
                       'Fac-3' : {1 : 1, 2 : 1, 3 : 1, 4 : 1, 5 : 4,6 : 1, 7 : 12, 8 : 1, 9 : 8, 10 : 1,11 : 14, 12 : 15, 13 : 16, 14 : 1, 15 : 1}
                      }
                      #每个选址点对应的日均成本
fixed_cost = {'Fac-1' : 20, 'Fac-2' : 30, 'Fac-3' : 100}

定义决策变量

决策变量一共有两类。第一类3个,是否选择该选址点。0-1变量。第二类45个,该网点分配到哪个选址点。0-1变量。

# 定义决策变量
use_facility = LpVariable.dicts("Use Facility", Facility, 0, 1, LpBinary)#是否使用该选址点(0-1离散变量)
ser_customer = LpVariable.dicts("Service", [(i,j) for i in Customer for j in Facility], 0)#

设定目标函数

目标函数为仓库成本与选址点到各网点的运输成本之和。

# 设定目标函数
cflp += (lpSum(fixed_cost[j]*use_facility[j] for j in Facility) + 
         lpSum(transportation_cost[j][i]*ser_customer[(i,j)] for j in Facility for i in Customer))

设定约束

约束条件主要包括:1.每个网点仅选择一个选址点。2.仓库数量选择。3.仓库是否选择与网点之间的判断关联关系。

# 设定约束
for i in Customer:
    cflp += lpSum(ser_customer[(i,j)] for j in Facility) == 1#每个网点有且仅有一个选址点服务。
cflp+=lpSum(use_facility[j] for j in Facility) <=3#三个仓库最多选3个,
cflp+=lpSum(use_facility[j] for j in Facility) >=1#三个仓库最少选1个,
for i in Customer:                                #若超过1个分配至某个仓库,则需选择该仓库,对应的use_facility[j]取1
    for j in Facility:
        cflp += ser_customer[(i,j)] <= use_facility[j]

求解

找到一个最优解。

打印结果

# 打印结果
Tolerance = 0.0001
for j in Facility:
    if use_facility[j].varValue > Tolerance:
        print(use_facility[j].varValue)
        print("选址点= ", j)

# 打印网点分配结果
for v in cflp.variables():
     if v.varValue>0:
        print(v.name, "=", v.varValue)

#打印目标结果
print("Total Cost = ", value(cflp.objective))

以上是一个经典的多仓库选址的整数规划问题,可衍生至许多复杂的问题建模。比如如果网点数超过1000个,选址点超过100个,增加货量仓库及网点货量需求约束,模型将会变得越来越复杂,但其建模逻辑不会有太大的变化,难点是大规模问题需要使用高效的求解器或启发式算法。

目录
相关文章
|
4月前
|
算法
基于ACO蚁群优化的UAV最优巡检路线规划算法matlab仿真
该程序基于蚁群优化算法(ACO)为无人机(UAV)规划最优巡检路线,将无人机视作“蚂蚁”,巡检点作为“食物源”,目标是最小化总距离、能耗或时间。使用MATLAB 2022a版本实现,通过迭代更新信息素浓度来优化路径。算法包括初始化信息素矩阵、蚂蚁移动与信息素更新,并在满足终止条件前不断迭代,最终输出最短路径及其长度。
|
8月前
|
算法 调度
【免费】基于模型预测算法的含储能微网双层能量管理模型(MATLAB)
【免费】基于模型预测算法的含储能微网双层能量管理模型(MATLAB)
|
8月前
|
存储
R语言分解商业周期时间序列:线性滤波器、HP滤波器、Baxter滤波器、Beveridge Nelson分解等去趋势法
R语言分解商业周期时间序列:线性滤波器、HP滤波器、Baxter滤波器、Beveridge Nelson分解等去趋势法
|
编解码 计算机视觉
在网格化数据集上轻松执行 2D 高通、低通、带通或带阻滤波器研究(Matlab代码实现)
在网格化数据集上轻松执行 2D 高通、低通、带通或带阻滤波器研究(Matlab代码实现)
151 0
|
算法 自动驾驶 数据挖掘
【鲁棒优化】基于联合聚类和定价的鲁棒功率控制方法(Matlab代码实现)
【鲁棒优化】基于联合聚类和定价的鲁棒功率控制方法(Matlab代码实现)
136 0
|
存储 算法 Java
建筑工地的水泥分配和料场选址问题(Cplex求解线性规划模型+粒子群搜索算法)【Java实现】
建筑工地的水泥分配和料场选址问题(Cplex求解线性规划模型+粒子群搜索算法)【Java实现】
98 0
|
算法
基于马科维茨与蒙特卡洛模型的资产最优配置模型(Matlab代码实现)
基于马科维茨与蒙特卡洛模型的资产最优配置模型(Matlab代码实现)
152 0
基于马科维茨与蒙特卡洛模型的资产最优配置模型(Matlab代码实现)
|
算法 数据挖掘 调度
数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)
数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)
162 0
|
机器学习/深度学习 算法
基于粒子群优化算法的p-Hub选址优化(Matlab代码实现)
基于粒子群优化算法的p-Hub选址优化(Matlab代码实现)
252 0
|
机器学习/深度学习 传感器 算法
基于集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)求解单目标优化问题附matlab代码
基于集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)求解单目标优化问题附matlab代码