【问题标题】:Allocate resources in the fairest way possible以最公平的方式分配资源
【发布时间】:2019-06-21 19:35:45
【问题描述】:

在做个人项目时,遇到了一个问题,我将在这里尝试概括。

给定一份​​不同价值的资源列表(例如resources = [1, 0.8, 1.5, 0.8, 1.2...]),我想以尽可能公平的方式在一组 N 人中分享它们(即没有人最终囤积太多价值,而其他人太少了)。

我认为解决这个问题的一个好方法是最小化函数:

f(r1,...,rN) = (avg - r1)^2 + (avg - r2)^2 + ... + (avg - rN)^2

其中avg = sum(resources) / Nrx 是分配给人员x 的资源。

我偶然发现了scipy.optimize.minimize,我认为它可能会有所帮助,但我无法弄清楚如何描述r1, ..., rn 的值不能是任意值而是需要取自@987654328 的约束@ (并且在解决方案中不会将相同的资源提供给多个人),因为我没有此模块的任何经验,也没有适用于此类问题的强大数学背景。

有没有用scipy 解决这个问题的简单方法?

【问题讨论】:

  • 把人放在最小的堆里。对于每个资源,为堆顶部的人提供下一个可用资源,将它们从堆中删除并重新插入。这个想法是资源最少的人总是在顶部
  • 您还应该对资源进行从大到小排序,以确保最终获得最佳分布

标签: python algorithm scipy scipy-optimize


【解决方案1】:

这是Partition Problem 的广义变体(优化变体是NP-hard)。

你的情况的不同之处:

    1. 你得到的是实数而不是整数
    1. 您正在寻找一个 n 路分区
    1. 您有不同的损失度量(二次与线性 | l2-norm 与 l1-norm)

现在我会毫不犹豫地说,您的问题仍然是 NP 难题,尽管在需要证明时可能会处理上述差异(1. 在温和条件下通常很容易;例如,在您的情况下:乘以 10 ; 2. 容易 3. 不知道我会如何解决这个问题)。

wikis Partition article 开始,它概述了基本结果和方法(您将看到:2 分区和 n>2 分区复杂性之间存在差异)。

由于这是一个离散优化问题(例如,公式化为二元二次规划),scipy 在精心选择的方法方面没有提供任何东西:例如没有(二进制)整数编程。

与 wiki 链接一起提到的内容也将表明,评论中的方法并不能保证最佳解决方案。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    相关资源
    最近更新 更多