随机选择,特定分布,变量适用性

时间:2015-12-19 03:18:47

标签: algorithm distribution random-sample

想象一下,我有1,2,3和4人,然后我有衬衫款式A,B,C,D,我希望将衬衫款式分发给人们,这样他们中的25%会得到款式A,25%获得风格B,25%获得风格C,25%获得风格D,但有些人拒绝穿某些风格,这些人以Fs代表。我如何随意匹配所有愿意佩戴的样式的人来获得近似分布?

   A B C D
 1 T F T T
 2 T F F F 
 3 T T T T
 4 T T T F

在这种情况下,这很容易,25%可以完全实现,只需给每个人一个不同的风格。但是,我打算将这个问题超越这个简单的情况,我的解决方案必须是通用的。数量或样式,人数和分布都是可变的。有时,分配将不可能准确地创建100%,预期近似/接近/最佳效果。选择过程应该是随机的,并试图保持分配。

我对这里的语言非常不了解,我只是在寻找算法。虽然最好能够分发。

2 个答案:

答案 0 :(得分:0)

当你受到Fs的阻碍时找到解决方案是https://en.wikipedia.org/wiki/Assignment_problem。选择任意分配的一种方法是,当一个人可以接受某个样式然后让它以尽可能低的成本找到该分配时,设置随机成本。然而,这并不适合任何随机的自然定义。一个(非常低效)随机的自然定义是随机选择所有可能的任务,直到你得到一个人人都可以接受的任务。您从中获得的分布可能与您通过设置随机成本然后解决结果分配问题所获得的分布不同。

答案 1 :(得分:0)

您使用的术语是“随机匹配”,应谨慎使用。我认为,正确的解释是从所有有效解决方案的集合中随机选择,所以基本上如果我们可以列举所有有效的解决方案 - 我们可以轻松地解决问题。

您正在寻找一个足够接近的解决方案,因此我们需要更好地定义有效的解决方案。我建议定义一些阈值(最多说1%的错误)。

在您的示例中,有4个组(分配有衬衫样式A / B / C / D的组)。因此,有2 ^ 4-1个可能的人原型(爱/恨每个A / B / C / D,假设任何人都喜欢至少一种衬衫样式)。每个原型种群都有一个给定的种群大小,每个原型可以分配给4个组中的一些(1个或更多)。

目标是将每个原型的人口划分为4组,例如,每组的大小在L和H之间。

让我们正式化。

问题陈述:

  • 表示A(0001),...,A(1111):15个原型中每个原型的种群大小
  • 表示G1(0001):分配给G1等的A(0001)的大小

鉴于

  • L,H:常数
  • A(0001),...,A(1111):15个常数

我们的目标是找到

的所有整数解决方案

G1(0001),G1(0011),G1(0101),G1(0111),G1(1001),G1(1011),G1(1101),G1(1111), G2(0010),G2(0011),G2(0110),G2(0111),G2(1010),G2(1011),G2(1110),G2(1111), G3(0100),G3(0101),G3(0110),G3(0111),G3(1100),G3(1101),G3(1110),G3(1111), G4(1000),G4(1001),G4(1010),G4(1011),G4(1100),G4(1101),G4(1110),G4(1111)

受制于:

  • G1(0001)= A(0001)
  • G2(0010)= A(0010)
  • G2(0011)+ G1(0011)= A(0011)
  • G3(0100)= A(0100)
  • G3(0101)+ G1(0101)= A(0101)
  • G3(0110)+ G2(0110)= A(0110)
  • G3(0111)+ G2(0101)+ G1(0101)= A(0111)
  • G4(1000)= A(1000)
  • G4(1001)+ G1(1001)= A(1001)
  • G4(1010)+ G2(1010)= A(1010)
  • G4(1011)+ G2(1011)+ G1(1011)= A(1011)
  • G4(1100)+ G3(1100)= A(1100)
  • G4(1101)+ G3(1101)+ G1(1101)= A(1101)
  • G4(1110)+ G3(1110)+ G2(1110)= A(1110)
  • G4(1111)+ G3(1111)+ G2(1111)+ G1(1111)= A(1111)
  • L< G1(0001)+ G1(0011)+ G1(0101)+ G1(0111)+ G1(1001)+ G1(1011)+ G1(1101)+ G1(1111)< ħ
  • L< G2(0010)+ G2(0011)+ G2(0110)+ G2(0111)+ G2(1010)+ G2(1011)+ G2(1110)+ G2(1111)< ħ
  • L< G3(0100)+ G3(0101)+ G3(0110)+ G3(0111)+ G3(1100)+ G3(1101)+ G3(1110)+ G3(1111)< ħ
  • L< G4(1000)+ G4(1001)+ G4(1010)+ G4(1011)+ G4(1100)+ G4(1101)+ G4(1110)+ G4(1111)< ħ

现在我们可以使用整数编程求解器来完成这项工作。