以最公平的方式分配资源

时间:2019-06-21 19:35:45

标签: python algorithm scipy scipy-optimize

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

给出了一系列具有不同价值的资源(例如resources = [1, 0.8, 1.5, 0.8, 1.2...]),我想以一种尽可能公平的方式在一组N个人之间共享它们(即,没有人会ho积太多价值)而其他的则太少了。

我认为解决此问题的一种好方法是最小化功能:

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

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

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

有没有一种简单的方法可以使用scipy解决此问题?

1 个答案:

答案 0 :(得分:0)

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

您的情况的不同:

    1. 您得到的是实数而不是整数
    1. 您正在寻找n路分区
    1. 您有不同的损耗度量(二次方与线性| l2范数与l1范数)

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

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

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

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