找到最佳百分比的算法或技术

时间:2016-03-11 03:53:35

标签: algorithm optimization percentage

我需要一种算法,技术或任何指导来优化以下问题:

我有两家公司:

  • A公司有324名员工
  • B公司有190名员工

员工总数(A + B)为514.我需要随机选择这514名员工中的 28%

好的,让我们这样做:514的28%是143.92;哦......这很糟糕,我们在这里与人交往,所以我们不能有小数位。好的,我会尝试向上或向下舍入。

如果我向下舍入:143是27,82101167%这是不好的,因为我必须至少28%,所以我必须向上舍入到144.

所以现在我知道必须选择144名员工。

现在出现了主要问题......现在是时候检查每家公司必须使用多少百分比来获得总数144.我该怎么做才能让百分比尽可能接近每家公司28%?

我举例说明:

如果我只为每家公司申请28%:

  • A公司有324名雇主:0.28 * 324 = 90.72
  • B公司有190名雇主:0.28 * 190 = 53.2

再次,我最终得到小数位。所以我必须弄清楚哪些应该围绕,哪些应该向下舍入以获得144个。

注意:对于这个例子,我只使用了两家公司,但在真正的问题上,我有30家公司。

4 个答案:

答案 0 :(得分:1)

我的建议是,每家公司只占28%,并向最近的人员汇总。

在你的情况下,你会选择91和54.不可否认,这确实会导致超过28%。

最准确的方法如下:

  • 计算您想要的确切数字。
  • 每家公司收取28%的费用并将向下
  • 按公司的余数降序排列公司。
  • 浏览列表并选择前n个元素,直到得到您想要的数字。

答案 1 :(得分:1)

执行分配有many methods,没有客观best method

以下是州和席位而不是公司和人。可能归功于Larry Bowen博士,他在基地网站上引用了第一个链接。

  

汉密尔顿的方法
  也被称为最大余数的方法,有时也被称为Vinton的方法。

     

步骤:

     
      
  1. 计算标准除数。
  2.   
  3. 计算每个州的标准配额。
  4.   
  5. 最初为每个州分配下限配额。
  6.   
  7. 如果有多余的席位,请按照标准配额的小数部分的降序,逐个给予这些席位。
  8.   

在这里,标准除数可以通过将总人口(每个公司的人口总和)除以您想要抽样的人数(在这种情况下为144)来找到。标准配额是公司的人口除以标准除数。下限配额是这个值向下舍入。但是,这种方法存在一些缺陷。

  

问题:

     
      
  • 阿拉巴马州悖论
    要分摊的座位总数增加导致一个州失去一个席位。
  •   
  • 人口悖论
    一个州人口的增加会导致其失去一个席位。
  •   
  • 新国家悖论
    添加一个公平分享席位的新州可能会影响到其他州的席位数。
  •   

这可能是最简单的实现方法。以下是一些其他方法及其附带的实现和缺点。

  

杰斐逊的方法
也被称为最大除数的方法,在欧洲被称为Hondt或Hagenbach-Bischoff方法的方法。

     

步骤:

     
      
  1. 计算标准除数。
  2.   
  3. 计算每个州的标准配额。
  4.   
  5. 最初为每个州分配下限配额。
  6.   
  7. 检查下配额的总和是否等于要分摊的正确座位数。      
        
    • 如果下配额的总和等于要分配的正确座位数,则将每个州的座位数分配给下限配额。
    •   
    • 如果下配额的总和不等于要分摊的正确座位数,那么,通过反复试验,找到一个数字, MD ,称为修正除数用于标准除数的位置,以便当每个状态的修改配额 MQ (通过将每个州的人口除以MD而不是SD计算得出)舍入为DOWN时,所有的总和圆形(向下)修改后的配额是要分配的确切座位数。 (注意:MD将始终小于标准除数。)这些舍入(向下)修改后的配额有时称为修改后配额。将每个州分配给其修改的下限配额。
    •   
  8.         

    问题:

         
        
    • 违反配额规则。 (但是,它只能违反上配额 - 从不下限配额。)
    •   


  

韦伯斯特方法
也称为Webster-Willcox方法以及主要方法。

     

步骤:

     
      
  1. 计算标准除数。
  2.   
  3. 计算每个州的标准配额。
  4.   
  5. 如果标准配额的小数部分小于0.5,则最初为其配置下限配额。
    如果标准配额的小数部分大于或等于0.5,则最初为其配置上限配额。
    [换句话说,根据算术平均值(平均值)向下或向上舍入。]
  6.   
  7. 检查配额总和(第3步的下限和/或上限)是否等于要分摊的正确座位数。      
        
    • 如果配额总和(步骤3中的下限和/或上限)等于要分配的正确座位数,则将每个州的座位数分配给其配额(下限或上限) 3)。
    •   
    • 如果配额的总和(第3步的下限和/或上限)不等于要分配的正确座位数,那么,通过反复试验,找到一个名为MD的数字MD,称为修正除数用来代替标准除数,以便当每个状态的修改配额MQ(通过将每个州的人口除以MD而不是SD来计算)基于算术平均值(平均值)舍入时,所有舍入的修改配额是要分配的确切席位数。将每个州的修改后的圆形配额分摊。
    •   
  8.         

    问题:

         
        
    • 违反配额规则。 (但是,违规行为很少见,通常与人为的情况有关。)
    •   


  

Huntington-Hill方法
也称为等比例方法。

     
      
  • 目前用于分摊美国众议院的方法
  •   
  • 由人口普查局首席统计师Joseph A. Hill和力学教授Edward V. Huntington于1911年左右开发。数学,哈佛
  •   
  • 初步术语:几何平均值
  •   
     

步骤:

     
      
  1. 计算标准除数。
  2.   
  3. 计算每个州的标准配额。
  4.   
  5. 如果标准配额的小数部分小于标准配额之间的两个整数的几何平均值(例如,16.47直接在16和17之间),则最初为其下限配额分配一个州。
    如果标准配额的小数部分大于或等于标准配额之间的两个整数的几何平均值,则最初为其上部配额分配一个州(例如,16.47立即在16和之间) 17)。
    [换句话说,根据几何平均值向下或向上舍入。]
  6.   
  7. 检查配额总和(第3步的下限和/或上限)是否等于要分摊的正确座位数。      
        
    • 如果配额总和(步骤3中的下限和/或上限)等于要分配的正确座位数,则将每个州的座位数分配给其配额(下限或上限) 3)。
    •   
    • 如果配额的总和(第3步的下限和/或上限)不等于要分配的正确座位数,那么,通过反复试验,找到一个名为MD的数字MD,称为修正除数用于代替标准除数,以便当每个状态的修改配额MQ(通过将每个州的人口除以MD而不是SD计算)基于几何平均值进行舍入时,所有舍入的总和修改后的配额是要分摊的座位的确切数量。将每个州的修改后的圆形配额分摊。
    •   
  8.         

    问题:

         
        
    • 违反配额规则。
    •   

供参考,配额规则:

  

配额规则

     

总是仅分配下限和/或上限的分配方法遵循配额规则。


答案 2 :(得分:1)

该问题可归结为寻找与一组比率最接近的整数近似值。例如,如果要分别分配3个组中的A,B,C≥0个成员以匹配比率a,b,c≥0(a + b + c = N> 0),其中N = A + B + C> 0是所需的总分配,那么您用(A,B,C)近似(a,b,c),而A,B和C限制为整数。

解决此问题的一种方法可能是将其设置为最小二乘问题-将| a-A |²+ | ​​b-B |²+ | ​​c-C |²最小化;受制于A + B + C = N且A,B,C≥0。

最优的必要条件是就离散单位变化而言它是局部最优。例如,如果B> 0 ...(A,B,C)→(A + 1,B-1,C),则条件(A-B≥a-b-1或B = 0)。

针对当前情况,优化问题是:

| A-a |²+ | ​​B-b |²
a = 144×324 /(324 + 190)≅90.770,b = 144×190 /(324 + 190)≅53.230

会导致以下情况:

A-B≥a-b-1 +36.541或B = 0
B-A≥b-a-1≅-38.541或A = 0
A + B = 144

由于它们是整数,所以不等式可以得到加强:

A-B≥+37或B = 0
B-A≥-38或A = 0
A + B = 144

排除了边界情况A = 0和B = 0,因为它们不满足所有三个条件。因此,您剩下的是37≤A-B≤38,或者因为A + B = 144:181≤2A≤182或A = 91 ...并且B = 53。

这种解决问题的方式很可能等同于结果,相当于先前答复中引用的一种算法。

答案 3 :(得分:0)

自从我最初发布此问题以来,我在Martin Fowler的书“企业应用程序体系结构的模式”(第489页和第490页)中遇到了对该确切问题的描述。

马丁谈论的是“马特·福梅尔的简单难题”,即在两个帐户之间分配5美分,但必须服从70%和30%的分配。这以一种简单得多的方式描述了我的问题。

这是他在书中提出的解决该问题的方法:

  
      
  • 也许最常见的是忽略它-毕竟这里只是一分钱   在那里。但是,这容易使会计师感到不安。
  •   
  • 分配时,您总是通过从中减去   您到目前为止分配的金额。这样可以避免损失几分钱,但是您可以   上次分配的累计便士金额。
  •   
  • 允许Money类的用户在调用时声明舍入方案   方法。这使程序员可以说70%的情况会四舍五入,   30%舍入。当您分配十个时,事情可能会变得复杂   帐户,而不是两个。您还必须记住四舍五入。为了鼓励人们记住,我已经看到一些Money类将舍入参数强制为   乘法运算。这不仅迫使程序员思考   她需要什么取整,这也可能使她想起要编写的测试。然而,   如果您有很多以相同方式四舍五入的税收计算方法,那就太麻烦了。
  •   
  • 我最喜欢的解决方案:拥有一个分配器功能。的   分配器的参数是一个数字列表,代表要分配的比率(看起来像aMoney.allocate([7,3]))。分配器返回   货币清单,保证零钱不会因掉落而掉落   从外部看起来是伪随机的,跨分配的资金。分配器有缺点:您必须记住使用它以及任何精确的方法   有关便士去向的规则很难执行。
  •