将if-then-else映射到概率

时间:2014-06-21 13:37:40

标签: algorithm probability

我需要一种算法来将游戏规则(p& p角色扮演)转换为概率,特别是使用if-then-else构建的条件构造,条件由布尔(not,and,or)和关系运算符构成(== ,> =,< =,<,>)和骰子滚动和布尔值。

示例:

var a = diceRoll(d8,d10,d12) // a shaker full of dices
                             // a 8 sides, a 10 sided and a 12 sided dice
                             // values added together
var w = true
var result = (
  if (a>=20) then 10.3994
  else if (a>=14 and w) then 8.23
  else if (a>=8 and diceRoll(d6)>3) then 5.22
  else 0
)

应该以编程方式转换为预期平均结果的公式,如

var result = diceProbabilityGreaterThan(a,20)*10.3994 
+(diceProbabilityGreaterThan(a,14)-diceProbabilityGreaterThan(a,20))*8.23 
+ ..

我知道如何将单个diceRoll上的单个关系运算符映射到概率(diceProbabilityGreaterThan),我知道如何手动转换这个特定的简单示例,但是我找到了任何给定的一般转换方案的问题规则。对我来说这个问题的难点在于依赖概率(比如> 20 ... a> 10)。

更多背景资料:

  • 我知道我可以使用monte carlo方法,但我尝试过它就是这样 我的用例太慢了。
  • 规则已经是数据结构,所以 不需要解析。
  • 骰子可能爆炸,意思是6 落在6上的双面骰子将再次滚动并加起来,所以 最大振动器结果不受有限数的限制。
  • 规则不包含循环控制结构,例如while或for,它们只是形成 一个可能嵌套的if-then-else-tree。
  • 中的布尔值和数字值 条件是常数。
  • 解决方案可以仅限于一个 依赖概率变量(如示例中的a),但我是 对任何数字的通用解决方案的存在感兴趣 依赖变量。

此问题是来自https://math.stackexchange.com/questions/842458/map-if-then-else-to-probability的克隆,因为它标记为offtopic。

1 个答案:

答案 0 :(得分:1)

您想要的是计算函数的期望值。这可以递归完成。

我假设您在树状数据结构中有规则。然后,初始调用将是root.CalculateExpectedValue()

有三种节点:

  1. 叶节点(指定实际值)。 CalculateExpectedValue()应为叶节点返回此值。
  2. 变量定义。这些节点有一个子节点并返回child.CalculateExpectedValue()。但是,他们必须引入变量声明及其概率质量函数。必须将所有活动变量的概率质量函数作为参数传递给CalculateExpectedValue()。有关下面概率质量函数的更多信息。
  3. 决定。这些节点有两个孩子。考虑到活动变量的概率质量函数,可以计算两种情况的概率。然后这些节点应该返回p * trueChild.CalculateExpectedValue() + (1 - p) * falseChild.CalculateExpectedValue()。此外,他们必须调整所涉及变量的概率质量函数。
  4. 变量的概率质量函数定义了此变量成为特定值的可能性。对于一个简单的六面骰子,这将是1 -> 1/6, 2 -> 1/6, 3 -> 1/6 ...。将此函数存储为字典或地图可能最简单。

    对于具有多个骰子的diceRoll函数,我们必须能够添加两个概率质量函数(例如df的pmf + d10的pmf,以及d12的pmf)。为此,我们创建了一个新的空pmf。对于两个输入分布的每对元素,我们计算结果总和(element1.Value + element2.Value)及其概率(element1.probability * element2.probability)。

    现在我们可以为变量声明节点创建和修改PMF。我们仍然需要决策节点的行为。

    首先要计算决定的概率。这很容易。选择相应变量的PMF,迭代所有条目,并在条件适用于元素时对概率求和。

    对于true子级,我们必须以这种方式修改PMF,以便删除条件为false的所有条目。对于false孩子,我们必须删除其他条目。之后我们必须重新标准化PMF(即除以剩余概率的总和)。一定要创建新的PMF。您不希望这些修改干预树的其他部分。

    您还可以将累积概率传播到叶节点。但是,这不是计算预期值所必需的。