根据可能的最低行驶距离将一组分为两部分

时间:2019-03-02 18:41:38

标签: python pandas math mathematical-optimization

我正试图将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(pandas)。

1 个答案:

答案 0 :(得分:1)

您可以像这样对数学问题进行建模。

http://mathb.in/31885?key=216f0d8271c8a65ecbce2faff12735042a4b7684

如果将旅行者i分配给组1,则x_i为1,如果将旅行者i分配给组2,则x_i为0。对于旅行者i,组1的距离为d,组2的旅行者的距离为d'

然后,您可以使用gurobi / pulp之类的整数求解器在python中进行计算。

根据定义“平衡”的方式,还有其他可能的表达方式。我猜想总旅行时间的平方会给你你想要的拆分方式。您可以解决此问题,看看您是否喜欢得到的解决方案。但是可能还有其他公式可以使您达到平衡。一个例子可能是,“一个旅客最多可以旅行的次数少于某个'D_high'。在这种情况下,您将添加一个约束,例如x_i d_i +(1-x_i)d'_i <= D_high

对于大多数现代求解器来说,这是一个相对较小的问题,您应该在几分钟之内得到答案。

编辑:刚意识到纸浆/果粒糖是线性求解器。如果您使用平方作为非线性整数的目标,则不能再使用gurobi / pulp。您有两种选择:

  1. 坚持使用非线性公式,并使用cvxpy(据我所知,开放源凸优化,也支持整数变量)

  2. 选择一个线性公式,其中您的目标只是距离之和而不是平方和。并像我在x_i d_i +(1-x_i)d'_i <= D_high之前提到的那样施加线性约束,以对某种公平性施加约束