选址问题、模型与算法

背景音乐:Demons - Imagine Dragons

最近在研究选址问题,顺便就做了一个归纳整理。
这篇文章是第一部分,关于传统的、基于统计学的选址。
之后会有另一篇,是关于机器学习、深度学习在现代的选址问题的应用。

以下内容纯理论~~

1 选址问题

【来自百度】选址问题是运筹学中经典的问题之一。选址问题在生产生活、物流、甚至军事中都有着非常广泛的应用,如工厂、仓库、急救中心、消防站、垃圾处理中心、物流中心、导弹仓库的选址等。选址是最重要的长期决策之一,选址的好坏直接影响到服务方式、服务质量、服务效率、服务成本等,从而影响到利润和市场竞争力,甚至决定了企业的命运。好的选址会给人民的生活带来便利,降低成本,扩大利润和市场份额,提高服务效率和竞争力,差的选址往往会带来很大的不便和损失,甚至是灾难,所以,选址问题的研究有着重大的经济、社会和军事意义。

所谓选址问题,就是指在规划区域里选择一个或多个设施的位置,使得目标最优
PS:这个“设施”可以是工厂、饭店等实体,为了统一,我们都称呼它为设施。

从它的定义,我们可以抓住四个要素:设施、规划区域、位置(距离)、目标,我们来一个个分析:

1.1 设施

按照设施的空间维度划分,可以将选址问题分为:

  1. 立体选址问题:设施的高度不能被忽略,如集装箱装箱问题。
  2. 平面选址问题:设施的长、宽不能被忽略,如货运站的仓位布局问题。
  3. 线选址问题:设施的宽度不能被忽略,如在仓库两边的传送带布局问题。
  4. 点选址问题:设施可以被简化为一个点,绝大多数时候我们遇到的都是这类问题。

还有,按照设施的规划数量划分,可以将选址问题分为:

  1. 单设施选址
  2. 多设施选址

1.2 规划区域

按照规划区域的结构划分,可以将选址问题分为:

  1. 连续选址问题:设施可以在给定范围的任意位置选址,设施的候选位置为无穷多。
  2. 离散选址问题:设施的候选位置是有限且较少的,实际中最常遇到这类问题。
  3. 网格选址问题:规划区域被划分为许多的小单元,每个设施占据其中有限个单元。

1.3 位置

或许说距离会更合适,因为我们确定设施位置的目的,就是为了获得设施与其他需求点的距离。
按照设施与需求点位置的关系,可以将所要获取的距离分为:

  1. 间接距离
    如下赋权有向图,从点v1到点v7有许多条路径,上面的数字代表了距离,不考虑中途的成本、时间等因素,如何选择路线使得距离最短?(学过运筹学的同学应该都知道标号法吧)
    8888511-763f678651629c8a.png
  2. 直接距离:
    如果没有向上图那样特别给出,我们需要根据两点坐标自行计算,一般可以选择Lp距离作为两点之间的距离,又称闵式距离(Minkowski Distance)。Lp距离计算方式如下:
    d = (Σ(x1i-x2i)p)1/p

特别地,当:

  • p=1:L1范式,又称曼哈顿距离,在二维平面上 d=|x1-x2|+|y1-y2|。假设在曼哈顿街区乘坐出租车从 P 点到 Q 点,白色表示高楼大厦,灰色表示街道,则下图中红线、蓝线、黄线的行驶距离都是一样的,都是曼哈顿距离。
    8888511-afec6a7a53d9c01e.png
  • p=2:L2范式,又称欧氏距离,定义于欧几里得空间中,是最常见的距离度量方式,在二维平面上 d=((x1-x2)2+(y1-y2)2)1/2,即两点间的直线距离,上图中的绿线。
    上面两种距离用得最多,再介绍一个不太常用的距离:
  • p=∞:切比雪夫距离(Chebyshev distance),在二维平面上 d=max(|x1-x2|, |y1-y2|)。玩过国际象棋的都知道,国王走一步能够移动到相邻的8个方格中的任意一个位置,那么国王从格子(x1,y1)走到格子(x2,y2)最少的步数就是切比雪夫距离。可以试试看,下图已经标注国王到达任意位置所需要的步数。
    8888511-8bc67902838d774a.png

1.4 目标

我们的目标是找到最好的位置,那么什么是最好的位置呢,换句话说,该如何量化这个目标呢?距离最短、费用最少、利润最大,或者其他定制的目标?
按照目标的数量,可以将选址问题分为:

  1. 单目标选址问题:这个很好理解。
  2. 多目标选址问题:实际的问题往往都是多目标规划问题,比如既想距离尽可能短,又想要费用尽可能少,如何均衡这些多目标呢。

2 三个基本问题与模型

可能洋洋洒洒看了上面一堆,对于选址问题还是没有一个清晰的概念,所以我整理了三个选址问题中的基本问题。而目前选址问题里的一些难题,都是它们的拓展(或者说延伸),比如无容量限制设施选址问题。

2.1 P中值问题 P-Median Problem

研究:在备选设施集合里,如何选择p个设施,使所有需求点得到服务,并且需求点到其最近设施的加权距离总和最小。

这是一个MinSum问题,可由以下整数规划模型表示:

8888511-67619fa556d420e8.png
8888511-b0ce13d39ab445e2.png

应用场景:在物流领域应用得非常广泛,加权距离代表了运输成本,目标是总成本最少。

2.2 P中心问题 P-Center Problem

研究:在备选设施集合里,如何选择p个设施,使所有需求点得到服务,并且每个需求点到其最近设施的最大距离最小。

这是一个MinMax问题,可由以下整数规划模型表示(符号说明与上面类似):

8888511-21ab530b73ed3d4c.png

应用场景:应急设施的选址,比如警局、消防局、医院,要求尽可能快地到达任意位置。

2.3 覆盖问题 Covering Problem

覆盖问题分为最大覆盖问题和集覆盖问题两类。

  1. 集覆盖问题
    研究:在备选设施集合里,已知每个设施的服务范围,如何选择设施,使所有需求点得到服务,并且设施数p最小或成本最小。
8888511-dc2b6cfc42d2318c.png
  1. 最大覆盖问题
    研究:在备选设施集合里,已知每个设施的服务范围,如何选择p个设施,使得服务的需求点数最多或需求量最大。

应用场景:追求覆盖面的场景,比如移动基站的选址、物流中心的选址。

3 算法

对于算法的解释,我总是比较偷懒的,因为解释起来很麻烦,所以就做个总结,感兴趣的话再自行搜索哈。

按照求解的方式,可以分为:

3.1 定性求解

“定性”很好理解,不要求具有统计意义,但是凭借研究者的经验以及有关的技术,能有效地洞察研究对象的性质,以及可能带来的影响等。

一般是如下步骤:

  1. 建立一套基于某些指标的、普适的评价体系
  2. 对给定的多种方案进行综合评价
  3. 基于评价结果,选出相对最优方案

常用的评价方法有:加权因素评分法、模糊综合评判法、风险型方法、德尔菲法(Delphi)

定性方法有着明显的缺点——受主观影响极大。可实际过程中,很多东西都是无法定量的,比如政策、环境的影响~因此定性分析具有非常强的实际意义,往往与定量分析相辅相成。

3.2 定量求解

  1. 解析解
    求解纯数学模型,找到最优方案。
    上述三个基本问题都是NP-Hard问题,在规模较小时可行,但随着规模的增大,在多项式时间内无法获得解析解。

  2. 近似解
    常用的有松弛算法:将约束吸收到目标函数中。

  3. 启发式算法
    在状态空间不断搜索局部最优,并更新状态,循环往复直至无法再更新。

  4. 仿真法
    对于大型、复杂的选址问题,通过仿真重现系统活动。

  5. 其他……
    有一些算法被证明是可以较好地逼近最优解,比如模拟退火、遗传算法、神经网络等。

3.2.1 贪婪取走启发式算法

给大家介绍一个效率挺高的算法,不一定最好,但我看了还不错,很多作者靠它水了一些文章哈哈哈~

目标是从N个备选位置里,选择p个位置建设施,使得目标最优。

  1. 步骤1:初始化p个设施的位置,并计算目标函数值。
  2. 步骤2:选择一个设施点i,i∈p,和一个设施点j,j∉p,交换组合新设施集合,计算目标函数。
  3. 步骤3:循环步骤2,找到最优交换组合,使得目标函数值减小最多,永久交换并更新状态。
  4. 步骤4:循环步骤3,直到再也无法找到最优交换组合。

该算法的优点和缺点:

  • 优点
    可并行,运算快。

  • 缺点:由于每次都找局部最优,因此算法的效果受初始位置影响很大。解决方法是循环整个算法n次,再选择最优组合。

因为时间太短,没时间研究得太深,其他算法就不班门弄斧了~

下回试试用Python解决几个实际问题。

  • 38
    点赞
  • 287
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
选址问题是指在一定范围内,选择一个最佳的位置,使得该位置能够满足某种需求,并且满足其他一些限制条件。这类问题在实际生活中非常常见,如选址新的工厂、商场、医院等。 在Java中实现选址问题,可以采用一些经典的算法,如贪心算法、动态规划算法等。下面我们以贪心算法为例,简单介绍如何实现一个选址问题算法。 1. 确定目标函数 选址问题目标函数是指,在一定范围内,最大化某种指标,如利润、效益等。我们需要先确定选址问题目标函数。 2. 确定限制条件 选址问题的限制条件是指,在一定范围内,需要满足某些限制条件,如距离、交通等。我们需要先确定选址问题的限制条件。 3. 确定贪心策略 贪心策略是指,在每一步中,我们选择当前最优的方案,以期望最终能够达到全局最优解。具体实现中,我们可以按照目标函数对可选位置进行排序,然后依次选择前k个位置进行评估,并选择其中最优的位置。 4. 实现算法 根据以上步骤,我们可以实现一个简单的选址问题的贪心算法,具体实现如下: ```java public class SiteSelection { public static int[] selectSite(int[][] sites, int k) { int[] result = new int[k]; int n = sites.length; int[] scores = new int[n]; for (int i = 0; i < n; i++) { scores[i] = sites[i][1] / sites[i][0]; // 计算利润密度,即目标函数 } for (int i = 0; i < k; i++) { int maxIndex = 0; for (int j = 1; j < n; j++) { if (scores[j] > scores[maxIndex]) { maxIndex = j; } } result[i] = maxIndex; scores[maxIndex] = -1; // 标记已经被选中 } return result; } } ``` 以上代码中,`sites`数组是一个二维数组,其中每个元素表示一个位置,第一列表示距离,第二列表示利润。`k`表示需要选取的位置个数。`selectSite`方法返回一个长度为`k`的数组,表示选取的位置在`sites`数组中的下标。 以上仅是一个简单的示例,实际应用中可能需要考虑更多的限制条件和目标函数,具体实现也需要根据实际情况进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值