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

简介: 多仓库选址-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个,增加货量仓库及网点货量需求约束,模型将会变得越来越复杂,但其建模逻辑不会有太大的变化,难点是大规模问题需要使用高效的求解器或启发式算法。

目录
相关文章
|
JavaScript 前端开发 数据安全/隐私保护
vue element plus Input 输入框
vue element plus Input 输入框
1419 0
|
API 语音技术 Python
Python 技术篇-百度语音识别API接口调用演示
Python 技术篇-百度语音识别API接口调用演示
899 0
Python 技术篇-百度语音识别API接口调用演示
|
10月前
|
边缘计算 安全 前端开发
【内有限时惊喜活动】阿里云边缘安全加速ESA中国站免费版站点套餐重磅上线!
阿里云ESA中国站免费版上线!真·无限流量、永久免费、无需信用卡,专为开发者、学生及初创团队打造。支持全球加速、基础安全防护、边缘函数与Pages静态托管,一键部署博客、文档与Demo。
|
9月前
|
缓存 数据可视化 算法
【LED室内定位系统仿真软件:基于Python的高性能可视化仿真平台】
本文介绍基于Python与PyQt6开发的LED室内定位系统仿真软件,支持可见光通信(VLC)场景下的交互式仿真、实时信号分析与轨迹记录。提供时域、频域可视化、多参数配置及数据导出功能,适用于教学、科研与算法验证。项目开源,便于二次开发与扩展。
437 6
|
人工智能 安全 API
2025电商API新特性:实时数据流、GraphQL接口与隐私合规
2025年电商API迎来技术与合规双重革新,实时数据流、GraphQL接口、隐私合规成为核心突破方向,推动全息电商、动态定价、供应链协同等场景升级,实现性能优化与用户隐私保护的协同发展。
|
存储 关系型数据库 分布式数据库
客户说|古茗选用阿里云PolarDB,以云端之力解锁茶饮数字化新高度
阿里云PolarDB将持续以“业务价值”为锚点,通过技术迭代与场景化解决方案,让每一笔交易更流畅,让每一份数据更智能,助力古茗实现“每天一杯喝不腻”的日常化国民茶饮愿景。
|
运维 网络协议 Linux
网络故障排除的7个关键维度
网络故障排除是确保网络稳定运行的关键,能减少停机时间、提升服务质量。本文介绍7个排查步骤:1. 检查硬件连接;2. 使用ipconfig检查IP配置;3. 进行DNS检查;4. 验证网络配置;5. 用其他设备测试;6. 检查IP冲突;7. 测试网络带宽和延迟。通过这些方法,可快速定位并解决问题,保障网络顺畅运行。
2945 5
|
人工智能 Docker 索引
推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate
今天给大家推荐一个**双语对照的 PDF 翻译工具**的开源项目:PDFMathTranslate 。
推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate
|
Ubuntu Linux
Fedora 36 ARM 镜像源更换与软件安装
Fedora 36是Linux发行版,由社区开发,红帽赞助。安装软件通常用DNF(RPM包)。若需安装.deb包,先用alien转换。遇到问题时,可删除`/etc/yum.repo.d`目录内容,改用阿里云镜像源,如: 简而言之,Fedora 36的软件安装涉及DNF或alien,镜像源更换解决安装问题,阿里云镜像提供速度优化。
1222 9
|
机器学习/深度学习 人工智能 编解码
Midjourney应用场景、特点、生成图片带来影响
Midjourney应用场景、特点、生成图片带来影响