【问题标题】:Constrained optimization over a grid while maintaining proportions在保持比例的同时对网格进行约束优化
【发布时间】:2020-09-03 20:03:58
【问题描述】:

假设我有一个这样的用户/项目网格:

         item_1  item_2
user_1    v_11    v_12
user_2    v_21    v_22
user_3    v_31    v_32

每个用户/项目对都有一个值,如网格中捕获的那样。目标是为每个用户分配一个项,以使值的总和最大化。

而且,必须保持“先前”的比例。例如,如果过去 item_1 分配给 3 个用户中的 2 个,而 item_2 仅分配给 1 个用户,那么今后我们要么必须:

  1. item_1 被分配给 3 个用户中的 2 个(可能与过去的用户不同!),item_2 被分配给剩余的用户,或者

  2. item_2 分配给 3 个用户中的 2 个,item_1 分配给其余用户

这两个项目都不能分配给每个用户。这就是“保持”比例的意思。我应该如何分析处理这样的问题?在 Python 中以编程方式怎么样?如果我能进一步澄清,请告诉我。假设我们知道所有的值(v)。谢谢。

【问题讨论】:

  • 我建议使用预期的解决方案创建一个小型数据集(至少 3 项)。

标签: python python-3.x optimization linear-programming mixed-integer-programming


【解决方案1】:

让我试一试。

我假设我们有以下包含 10 个项目和 20 个用户的数据集:

----     23 SET i  items

item1 ,    item2 ,    item3 ,    item4 ,    item5 ,    item6 ,    item7 ,    item8 ,    item9 ,    item10


----     23 SET j  users

user1 ,    user2 ,    user3 ,    user4 ,    user5 ,    user6 ,    user7 ,    user8 ,    user9 ,    user10,    user11
user12,    user13,    user14,    user15,    user16,    user17,    user18,    user19,    user20


----     23 PARAMETER x0  initial allocations

             user1       user2       user3       user4       user5       user6       user7       user8       user9

item1                                                                                                            1
item2            1
item3                                                            1           1
item4                                                1                                   1
item6                                    1
item9                        1                                                                       1

     +      user10      user11      user12      user13      user14      user15      user16      user17      user18

item2                                                                        1                       1
item3                                                                                                            1
item6            1                       1
item7                                                                                    1
item8                                                            1
item10                       1                       1

     +      user19      user20

item5                        1
item7            1


----     23 PARAMETER n  sum initial allocations

item1  1,    item2  3,    item3  3,    item4  2,    item5  1,    item6  3,    item7  2,    item8  1,    item9  2
item10 2


----     23 PARAMETER v  values

             user1       user2       user3       user4       user5       user6       user7       user8       user9

item1        4.237       4.163       2.183       2.351       6.302       8.478       3.077       6.992       7.983
item2        4.720       2.059       3.828       1.419       4.047       2.639       6.812       6.047       7.930
item3        1.655       2.581       5.731       7.752       2.603       1.307       6.266       6.591       4.504
item4        2.818       1.046       3.427       5.499       2.362       2.568       3.976       3.852       3.899
item5        1.463       1.054       4.611       5.679       6.660       3.032       4.565       3.484       2.371
item6        1.915       4.455       3.917       2.729       2.011       6.369       5.603       1.406       8.048
item7        9.880       3.053       7.081       7.991       9.392       2.811       3.674       2.775       3.217
item8        8.612       6.514       9.784       1.242       2.687       1.784       5.864       2.142       7.606
item9        1.222       2.600       1.552       1.150       8.521       6.415       1.243       2.765       9.556
item10       9.395       4.139       1.075       9.540       6.147       4.003       9.854       7.898       1.991

     +      user10      user11      user12      user13      user14      user15      user16      user17      user18

item1        3.733       1.994       5.521       2.442       8.852       3.386       3.572       6.346       7.504
item2        3.680       6.950       7.802       6.647       3.555       1.778       1.923       6.771       5.908
item3        4.228       3.187       3.218       2.175       9.401       4.419       8.051       3.700       2.129
item4        9.676       9.942       4.329       4.356       7.948       4.570       9.218       2.076       7.619
item5        9.427       4.804       2.212       4.475       4.372       3.416       9.535       2.700       3.678
item6        9.512       6.368       6.466       4.263       6.347       7.119       5.559       2.433       6.912
item7        6.818       7.615       1.769       2.353       4.908       2.682       7.234       7.867       2.393
item8        2.019       5.395       8.160       5.428       5.802       1.096       5.895       5.060       9.778
item9        4.020       6.348       3.333       6.766       2.397       5.140       4.540       8.249       5.869
item10       9.953       6.223       2.498       6.790       4.099       9.211       9.101       1.146       4.318

     +      user19      user20

item1        6.654       5.174
item2        1.284       8.131
item3        7.740       1.623
item4        1.499       6.187
item5        1.671       4.612
item6        5.715       2.120
item7        4.504       7.259
item8        2.655       2.472
item9        4.516       6.020
item10       6.979       6.340

----     23 PARAMETER z0                   =       97.192  initial total value

问题是找到一个新的项目分配给用户x(i,j)

  • 每个用户只收到一件物品。
  • 每个项目的总数是每个项目的原始数量的排列。因此,如果我们有 3 个项目并且总数为 1、2、3,那么我们现在可以拥有 3、2、1(或 1、2、3 的任何其他排列)。

为此我们定义了两个二进制变量:

 x(i,j) = 1  if user j receives item i
          0  otherwise

 p(i,k) : a permuted identity matrix

我们可以开发以下混合整数规划 (MIP) 模型:

这是一个简单的 MIP 模型,可以使用任何 MIP 求解器求解。最优解如下:

----     49 VARIABLE x.L  

             user1       user2       user3       user4       user5       user6       user7       user8       user9

item1                                                                        1                       1
item7            1                                               1
item8                        1           1
item9                                                                                                            1
item10                                               1                                   1

     +      user10      user11      user12      user13      user14      user15      user16      user17      user18

item2                                    1
item3                                                            1
item4                        1
item5                                                                                    1
item6            1
item8                                                                                                            1
item9                                                1                                               1
item10                                                                       1

     +      user19      user20

item2                        1
item3            1


----     49 VARIABLE z.L                   =      176.058  

----     54 PARAMETER sumitems  sum new allocations

item1  2,    item2  2,    item3  2,    item4  1,    item5  1,    item6  1,    item7  2,    item8  3,    item9  3
item10 3

最后一个向量sumitems 是我们数据集的向量n 的排列。

我们看到这个最优解的目标值是 176.058,这比我们的初始(随机)数据集的值 (97.192) 要好得多。

【讨论】:

  • 感谢您的详尽回答!这很有帮助。我以前没有做过MIP。您能推荐任何易于使用的 MIP 求解器吗?
  • 对于 Python,您可能需要查看 CVXPY 或 PuLP。
  • 谢谢!我会研究这些选项。
猜你喜欢
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多