【问题标题】:Proportionally decrease values in a list to meet a target sum按比例减少列表中的值以满足目标总和
【发布时间】:2015-02-13 02:10:15
【问题描述】:

考虑一个整数值列表

[30, 50, 100, 50, 30]

他们的总和是 260。需要一个新的“目标”总和,例如200. 什么是按比例减少列表中的值以实现新总和的好方法?这些值应保持整数。

显然,可以通过目标总和的比率来减少它们 - 200/260 = 0.77(大约)并将结果转换为整数:

[23, 38, 77, 38, 23]

新总和:199。快到了!也许,减少随机元素的差异?

我希望这是对问题的充分解释。但是,目前的方法对我来说似乎有点不完美。还有其他建议吗?

【问题讨论】:

  • 彼此成比例?那么这将是正确的方法。我会使用随机差异,真的没有其他方法,除非你想处理浮点数。互相喜欢吗?那么这将是正确的方法。我想你可能想澄清你想要做什么(给出一些背景)。这将有助于获得“完美”的答案。
  • 两个列表之间元素之间的比率应该相似。 30/50 ≈ 23/38。背景:这是一个生物模拟,这些值代表不同类型的代理,其数量应按比例增加/减少。

标签: python algorithm list


【解决方案1】:

您可能想查看“点后的值”,即整数除法的余数:

在你的例子中:

完全成比例的值(每个元素乘以 200/260):

[23.076923076923077, 38.46153846153846, 76.92307692307692, 38.46153846153846, 23.076923076923077]

余数:

[0.07692307692307665, 0.4615384615384599, 0.9230769230769198, 0.4615384615384599, 0.07692307692307665]

如果您只是削减余数(即向下舍入到整数),则剩下 2 个单位要分配,分配给余数最大的 2 个数字。这里是 76 和 38 的(你需要打破它们之间的关系,这有点不雅)。

所以最终的解决方案是:

[23, 39, 77, 38, 23]

这旨在最小化最终整数值和“完美分割”值之间的差异。

在遗传算法中使用了类似的技巧,称为“剩余随机抽样”,剩余值随机分布,概率与余数成正比。

【讨论】:

    【解决方案2】:

    假设你的指数因子是 p。你想解决:

    2*30p+2*50p^2+100p^3 = 200

    我会让你解决p。

    编辑:如果您希望减少成比例,请解决此问题:

    2*p + 2*p^2 + p^3 = 260 -200 =60

    【讨论】:

      【解决方案3】:

      以 Rafał Dowgird 为基础

      sum_1 = [20, 30, 80, 90, 100]
      
      a = float(sum(sum_1))
      
      b = float(Desired Sum)
      
      total = 0
      
      for i in range(0, len(sum_2)):
          total += sum_1[i] * (b/a)
      
      print total
      

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 2018-11-11
        • 1970-01-01
        • 2022-10-07
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 2014-05-19
        • 2013-03-09
        相关资源
        最近更新 更多