python - 以最公平的方式分配资源

标签 python algorithm scipy scipy-optimize

在进行个人项目时,我遇到了一个问题,我将在此处进行概括。

给定一个不同值的资源列表(例如 resources = [1, 0.8, 1.5, 0.8, 1.2...]),我想在一组 N 个人之间共享它们一种尽可能公平的方式(即没有人最终囤积过多的值(value),而其他人则囤积得太少)。

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

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

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

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

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

最佳答案

这是 Partition Problem 的通用变体(优化变体是 NP-hard)。

你的情况的不同之处:

    1. 你得到的是实数而不是整数
    1. 你寻找一个n路分区
    1. 您有不同的损失指标(二次与线性 | l2 范数与 l1 范数)

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

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

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

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

关于python - 以最公平的方式分配资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56709473/

相关文章:

Python:从 NxM 正态分布中抽取的 NxM 样本数组

android - 在 Windows 中将 MonkeyRunner 导入 Python 脚本失败

python - 查找所有使用 easy_install/pip 安装的软件包?

python - 如何找到 3 个大集合的交集的 100 个元素的列表?

android - 使用 Android 手机气压计的楼层计数器

java - Java问题中的蛮力数独求解器算法

Python - 地球移动距离

python - 安装 scipy 缺少的依赖项

python - Python 文件输出中的空格

python - 循环缓冲区Python实现