python - 根据可能的最短行驶距离将一组分成两部分
问题描述
我试图将一组 80 人分成两部分。每个小组都必须前往一个地点。我正在尝试拆分团队,以便人们尽可能少地旅行。我对最短的总旅行时间感兴趣,但我也希望它保持平衡,这样我们就不会有几个人旅行很远,即使这意味着其他人的距离会更短。
我的数据看起来像这样:
-------------------------------------------------------------
| Person | Distance 1 | Distance 2 |
|---------------------|------------------|------------------|
| Person 1 | 0:56:52 | 1:23:50 |
|---------------------|------------------|------------------|
| Person 2 | 0:42:55 | 0:22:45 |
|---------------------|------------------|------------------|
| Person 3 | 1:32:35 | 2:23:02 |
-------------------------------------------------------------
我想根据他们应该放在哪个组中添加另一列带有“A”或“B”的列。人员需要在两组之间平均分配,以最大限度地减少旅行时间的平方。我知道某种数学优化可能是要走的路,我只是不确定如何去做。我正在使用python(熊猫)。
解决方案
您可以像这样对数学问题进行建模。
http://mathb.in/31885?key=216f0d8271c8a65ecbce2faff12735042a4b7684
其中,如果旅行者 i 被分配到第 1 组,则 x_i 为 1;如果被分配到第 2 组,则 x_i 为 0。第 1 组的旅行者 i 的距离为 d,第 2 组的距离为 d'
然后你可以使用像 gurobi/pulp 这样的整数求解器在 python 中进行计算。
根据您如何定义“平衡”,还有其他可能的公式。我猜总旅行时间的平方会给你你想要的那种分裂。你可以解决这个问题,看看你是否喜欢你得到的解决方案。但是您可能还有其他平衡的配方。一个例子可能是,“一个旅行者应该旅行的最大值小于某个 'D_high'。在这种情况下,您将添加一个约束,例如 x_i d_i + (1-x_i)d'_i<= D_high
对于大多数现代求解器来说,这是一个相对较小的问题,您应该在几分钟内得到答案。
编辑:刚刚意识到纸浆/古罗比是线性求解器。如果您使用平方作为非线性整数的目标,则不能再使用 gurobi/pulp。你有两个选择:
坚持使用非线性公式并使用 cvxpy (据我所知,开源凸优化,也支持整数变量)
寻求线性公式,其中您的目标只是距离的总和而不是平方和。并像我之前提到的那样施加线性约束 x_i d_i + (1-x_i)d'_i<= D_high,以对某种公平性施加限制
推荐阅读
- ios - Apple Mach-O Linker - 在示例应用程序中嵌入使用 Cocoapods 的自定义框架 - xcode 9
- graphql - 通过 graphql 更新 github 存储库描述
- javascript - php 正则表达式到 js 正则表达式
- ios - 如何应用 iOS VNImageHomographicAlignmentObservation warpTransform?
- javascript - 创建具有动态变化内容的 HTML 表格
- image - 超分辨率:卷积在边缘留下痕迹
- python - Scrapy 不在 postgresql 列中写入
- xml - Liferay 6.2 rest api,内容类型为 text/xml
- ubuntu - 适用于 Linux 的 Windows 子系统在挂载时忽略元数据选项
- php - 如何使用安全规范发出 Soap 请求