我正试图将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)。
答案 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。您有两种选择:
坚持使用非线性公式,并使用cvxpy(据我所知,开放源凸优化,也支持整数变量)
选择一个线性公式,其中您的目标只是距离之和而不是平方和。并像我在x_i d_i +(1-x_i)d'_i <= D_high之前提到的那样施加线性约束,以对某种公平性施加约束