【问题标题】:Minimize number of shops while reaching all customers在覆盖所有客户的同时最大限度地减少商店数量
【发布时间】:2020-09-25 04:10:22
【问题描述】:

在这个特定的问题中,我有一个想象中的城市被划分为正方形 - 基本上是一个 MxN 个正方形网格覆盖城市。 MN 可能比较大,所以我的案例总共有超过 40,000 个方格。

我有许多客户Z分布在这个网格中,一些单元格将包含许多客户,而其他单元格将是空的。我想找到一种方法来放置 最少 数量的商店(每个单元只有一个),以便能够为所有客户提供服务,并限制所有客户必须“触手可及”一个商店并且需要包含所有客户。

另外,我有以下限制/问题:

  1. 客户可以行驶的最大距离 - 如果商店位于太远的单元格中,则客户无法与该商店关联。 编辑:这并不是真正的距离,而是衡量顾客到达商店的难易程度,所以我不能使用圆圈...
  2. 在遵守上述条件 (1) 的同时,很可能有多个商店在到达同一客户的距离。在这种情况下,最近的商店应该会获胜。

目前我试图忽略成本问题——许多客户意味着更大的商店和更高的成本——但也许在某个时候我也会考虑这个问题。问题是,我不知道我正在研究的问题的名称,也不知道可能的算法解决方案:这可以作为线性规划问题解决吗?

我通常使用 Python 编写代码,因此非常感谢任何关于可能的算法方法和/或一些代码/库来解决它的建议。

提前谢谢你。

编辑:作为后续,我发现我可以将这个问题作为 MINLP“无能力设施问题”来解决,但我发现的所有信息都太复杂了:我不知道我不在乎知道哪家商店为哪个顾客服务,我只关心是否和在哪里建了一家商店。我有一种辅助方法 - 作为后期处理 - 将客户关联到最合适的商店。

我发现的所有代码都设置了这个庞大的线性系统,将每个客户每个商店的约束关联起来(此处“解释”为:https://en.m.wikipedia.org/wiki/Facility_location_problem#Uncapacitated_facility_location),所以在像我这样的情况下,我很容易得到一个有数百万的线性系统行和列,整数/二进制变量将需要大约宇宙的年龄来解决。

必须有更简单的方法来处理这个......

【问题讨论】:

  • “必须有更简单的方法来处理这个问题”。著名的遗言。
  • 感谢您的链接。我对我的问题进行了一些编辑,对于措辞不佳的原始问题感到抱歉。这并不是真正的距离,而是衡量顾客到达商店的难易程度,所以我不能使用圆圈...

标签: python algorithm optimization linear-programming numerical-methods


【解决方案1】:

我认为这可以表述为集合覆盖问题link

你说:

在像我这样的情况下,我很容易得到一个线性系统 具有数百万行和列,具有整数/二进制变量 大约需要宇宙的年龄来解决

那么让我们看看这是否是真的。

第一步:生成一些数据

我生成了一个 200 x 200 的网格,产生了 40,000 个单元格。我随机放置 M=500 个客户。这看起来像:

----     22 PARAMETER cloc  customer locations

                  x           y

cust1            35          75
cust2           169          84
cust3           111          18
cust4            61         163
cust5            59         102
...
cust497         196         148
cust498         115         136
cust499          63         101
cust500          92          87

第 2 步:计算每个客户的覆盖面

下一步是为每个客户 c 确定可到达的允许位置 (i,j)。我为此创建了一个大型稀疏布尔矩阵 reach(c,i,j)。我使用了规则:如果曼哈顿距离是

  |i-cloc(c,'x')|+|j-cloc(c,'y')| <= 10

那么 (i,j) 的商店可以为客户 c 提供服务。我的数据如下:

(不存储零)。这个数据结构有 106k 个元素。

步骤 3:形成 MIP 模型

我们形成一个简单的 MIP 模型:

不等式约束表示:我们需要至少有一家商店在每位顾客的触手可及的范围内。这是一个非常易于制定和实施的模型。

第 4 步:求解

这是一个大而简单的 MIP。它有 40,000 个二进制变量。它解决得非常快。在我的笔记本电脑上,使用商业求解器只需不到 1 秒(使用开源求解器 CBC 只需 3 秒)。

解决方案如下:

----     47 VARIABLE numStores.L           =          113  number of stores

----     47 VARIABLE placeStore.L  store locations

              j1          j6          j7          j8          j9         j15         j16         j17         j18

i4                                                                                                             1
i18                                                            1
i40                                                                                    1
i70            1
i79                                                                                                1
i80                        1
i107                                                                                   1
i118                                   1
i136                                                                       1
i157                                               1
i167                                                                       1
i193                                               1

   +         j21         j23         j26         j28         j29         j31         j32         j36         j38

i10                                    1
i28                                                                        1
i54                                                            1
i72                                                                                    1
i96                                                1
i113                       1
i147                                                           1
i158                                                                                                           1
i179                                                                                               1
i184                       1
i198           1

   +         j39         j44         j45         j46         j49         j50         j56         j58         j59

i5                                                                                                             1
i18                                                1
i39            1
i62                                                            1
i85                        1
i102                                                                       1
i104                                   1
i133                                               1
i166                                                                                               1
i195                                                                                   1

   +         j62         j66         j67         j68         j69         j73         j74         j76         j80

i11                                                                                                1
i16                                                1
i36                                                            1
i61                                                                                    1
i76                                                                        1
i105                                                                       1
i112           1
i117                                                                                                           1
i128                                   1
i146                                               1
i190                       1

   +         j82         j84         j85         j88         j90         j92         j95         j96         j97

i17                                    1
i26            1
i35                                                                                                1
i48                                    1
i68                                                                        1
i79                                                                                                            1
i97            1
i136                       1
i156                                               1
i170                                   1
i183                                                                                   1
i191                                                           1

   +         j98        j102        j107        j111        j112        j114        j115        j116        j118

i4                                                                         1
i22                                                                                    1
i36                                                            1
i56                        1
i63                                                1
i68                                                                                                            1
i88                                                                                                1
i100                                                                                   1
i101           1
i111                                                                                                           1
i129                                                           1
i140                                   1

   +        j119        j121        j126        j127        j132        j133        j134        j136        j139

i11                                                            1
i30                                    1
i53                                                1
i72                                                                                                1
i111                                                                                                           1
i129                                                                                   1
i144                                                                       1
i159           1
i183                                                                                               1
i191                       1

   +        j140        j147        j149        j150        j152        j153        j154        j156        j158

i14                                                            1
i35                        1
i48                                                                        1
i83                                                                                                1
i98                                                1
i117                                                                                                           1
i158                                                                                   1
i174                                   1
i194           1

   +        j161        j162        j163        j164        j166        j170        j172        j174        j175

i5                                                                         1
i32            1
i42                                                                                                1
i61                                                                                    1
i69                                                                        1
i103                                                           1
i143                                   1
i145                                                                                                           1
i158                                                                                               1
i192                       1
i198                                               1

   +        j176        j178        j179        j180        j182        j183        j184        j188        j191

i6                                                                         1
i13                                                                                                            1
i23                                                1
i47                                                                                                            1
i61                                                                                    1
i81                        1
i93            1
i103                                                                                                           1
i125                                   1
i182                                                           1
i193                                                                                               1

   +        j192        j193        j196

i73                                    1
i120           1
i138           1
i167                       1

我认为我们已经揭穿了您关于 MIP 模型不是解决此问题的可行方法的说法。

请注意,宇宙的年龄是 137 亿年或 4.3e17 秒。所以我们实现了大约 1e17 的加速。这是我的记录。

请注意,此模型并未找到商店的最佳位置,而只是找到了一种能够最大限度地减少为所有客户提供服务所需的商店数量的配置。从这个意义上说,它是最优的。但该解决方案不会最大限度地缩短顾客与商店之间的距离。

【讨论】:

  • 谢谢 Erwin,这看起来像是一种潜在的方法:我不清楚的一件事是:这是否保证商店和客户之间存在一对一的对应关系?我的要求之一是不能有两家商店为同一客户提供服务。如果是这种情况-我不确定,因为我不是这方面的专家,我必须找到一种方法将您的方法转换为 Python 和 lpsolve,因为我不确定 CBC 是我们设置中支持的工具,更不用说一个商业软件...
  • 可能有不止一家商店可以到达。客户可以选择最好的。请注意,LpSolve 不是一个非常强大的 MIP 求解器。
  • 谢谢,它似乎在使用适当的求解器 (CBC) 做正确的事情。在我的问题上,它需要更长的时间——55 秒——但肯定比宇宙的年龄要好。 lpsolve 需要几个小时才能找到一些东西。
  • 出于好奇,您在回答中显示的是什么图形用户界面?我正在尝试从命令行使用 CBC,尝试了解我可以输出什么以及我不能输出什么有点痛苦......
  • 我使用 GAMS 作为建模工具。
猜你喜欢
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多