可变数量的集合之间的模糊选择

时间:2011-06-25 02:23:25

标签: algorithm probability fuzzy-logic

我想知道哪种是最简单,最可配置的方式,可以在以下情况下获得我需要的东西:

  • 我有一个计数器,我们称之为X,用于提取其中一组
  • 我有可变数量的集合S1, S2, ..,它们之间可以被视为total ordered
  • 我希望以模糊方式混合这些集合,以便X = 0它会给我S1,因为,我会说X = 20它会给我S1有70%的几率,S2有30%的几率
  • 增加X会将S1的概率降低到0%,同时将S2增加到100%,然后可能会有一个区域,它总是会给我S2 } 直到S2开始减少并且S3将开始获得机会等等的新阈值

我知道如何通过对所有内容进行硬编码来实现,但由于需要进行一些调整,我想应用一个解决方案,它可以让我轻松配置我拥有的套数和单个阈值(增加概率的开始/结束)减少概率的开始/结束)。当然,我不需要每组超过2组之间的任何交叉,并且概率的线性增加/减少是好的..任何好的线索?

提前致谢!

1 个答案:

答案 0 :(得分:1)

要分配概率的分布,可以使用Bernstein多项式:

http://en.wikipedia.org/wiki/Bernstein_polynomial

使用de Casteljau的算法可以有效地计算这些算法(基本上它以递归方式显示DP):

http://en.wikipedia.org/wiki/De_Casteljau“s_algorithm

http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html

您获得的结果将是分布上的一组权重。要选择一个集合,只需在[0,1]中生成一个统一的随机变量,然后根据这些权重选择它所着的集合。

这是python中的一些代码:

import random

#Selects one of the n sets with a weight based on x
def pick_a_set(n, x):

    #Compute bernstein polynomials
    weights = [ [ float(i == j)  for j in range(n) ] for i in range(n) ]
    for k in range(n):
        for j in range(n-k-1):
            for i in range(n):
                weights[j][i] = weights[j][i] * (1.0 - x) + weights[j+1][i] * x

    #Select using weights
    u = random.random()
    for k in range(n):
        if u < weights[0][k]:
            return k
        u -= weights[0][k]
    return 0