python - 使用权重和最小值分配整数?

标签 python algorithm greedy non-greedy

similar question 中我问如何使用权重分配整数。我很好奇如果对每个分布“桶”施加最小值,人们将如何解决这个问题。通过施加最小值,这似乎是一个更困难的问题。这是我贪婪的尝试,但没有用:

def distribute(available, weights_and_mins):
    distributed_amounts = []
    total_weight = sum([i[0] for i in weights_and_mins])
    for weight, minimum in weights_and_mins:
        weight = float(weight)
        p = weight / total_weight
        distributed_amount = round(p * available)
        if distributed_amount < minimum:
            distributed_amount = minimum
        distributed_amounts.append(distributed_amount)
        available -= distributed_amount
        total_weight -= weight
    return [int(i) for i in distributed_amounts]

print distribute(10, ((10,1), (2,5), (2,4)))
print distribute(1000, ((10,1), (2,5), (2,4)))

目前,这些值被分配为 [7, 5, 4],即 16,比我们必须分配的多了 6。输出应为 [1, 5, 4],因为这满足所有列的最低要求。随着我们必须分配的值(value)的增长,分布应该越来越接近正确的加权分布。例如,通过分配 1000,算法正确地将值分配为 [714, 143, 143]。

附带说明一下,我的目的是在多个列之间分配可用空间(宽度)。所有列都具有“通过”和显示至少部分数据所需的最小大小,并且随着可用空间的增长,一些列更需要空间。我提到这是该算法在现实生活中的用途,但我不希望这是对 GUI 设计的讨论。

这个问题有哪些解决方案?越简单越好。

最佳答案

您应该先分配最低金额,然后相应地进行更新。稍后您可以相应地分配剩余金额。

prior_available = available
allocated = [i[1] for i in weights_and_mins]
available = available - sum(allocated)
if available < 0:
    The hell breaks loose
total_weight = float(sum([i[0] for i in weights_and_mins]))
for i in len(weights_and_min):
    v = round( weights_and_min[i][0]*prior_available/total_weight )
    nv = min( available, max(v-allocated[i],0) )
    allocated[i] += nv
    available -= nv

关于python - 使用权重和最小值分配整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9103906/

相关文章:

C 轮函数抛出错误 : "undefined reference to ` round'. ..”

java - Java 上的正则表达式 : avoiding unnecessary "greedy" strategy by Matcher class

python - 使用正则表达式捕获以下捕获组,然后在检测到模式时使用 re sub 方法对它们重新排序

c++ - 求出 1 到 N 之间所有数字的总和可被 x 或 y 整除

python - 来自 LeetCode 给定一个整数数组,返回两个数字的索引,使它们加起来等于一个特定的目标

c - 为什么Newton-Raphson方法在计算1.0E21和1.0E23的平方根时不收敛?

algorithm - 使所有数组元素为零的最少 AND 运算次数

python - 如何搜索并替换 soup 对象中的文本?

python - SQLALchemy:查询 Postgres JSONB 列的单个键或键的子集

python - 在 Python 中保存二维数组或列表的 CSV 文件的最佳方法?