获取到达目标的概率的算法

6
好的,我会尽可能详细地解释。
假设用户可以选择一组“选项”。每次他选择时,他会得到4个不同的选项。在这4个“插槽”中可能出现更多选项。每个选项都有一定的已知概率。并非所有选项出现的概率相等,有些选项需要先前选择了其他选项 - 在一个复杂的相互依赖树中(这一点我已经定义好了)。
当用户选择其中一个选项时,他将被呈现另外4个选项的选择。选项池再次定义,并且可能取决于用户先前选择的内容。
在所有可能出现的“选项”中,有一些是特殊的,称之为关键选项。
程序启动时,用户会看到第一组4个选项。对于这4个选项中的每一个,程序需要计算用户在N次选择期间“实现”所有关键选项的总概率。
例如,如果总共有4个选项,则实现其中任何一个的概率恰好为1,因为它们全部在开始时就出现了。
如果有人能告诉我应该从哪个逻辑开始,我将非常感激。我正在考虑计算所有可能的选择序列,并计算在N步内选择关键选项的那些序列的数量,但问题是它们出现的概率不是均匀的,并且选项池会随着用户的选择和积累而改变。
我很难将选项的明确定义的概率和依赖关系实现为能够给出合理总概率的算法。因此,用户每次都知道哪个选项可以使他最终获得关键选项。
有什么想法吗?
编辑: 以下是一个例子:
假设选项池中有7个选项。option1, ..., option7 option7需要option6;option6需要option4和option5; 选项1到5不需要任何东西,可以立即出现,分别具有option1.p,...,option5.p的概率; 关键选项是option7; 用户从1-5中随机(但带权重地)获得4个选项,程序需要说类似于: “如果你选择(第一个),你有##%的概率在最多N次尝试中获得option7。”其他3个选项也是如此。
自然地,对于一些较低的N值,获得option7是不可能的,而对于一些较大的N值,则是肯定的。N可以选择,但是是固定的。
编辑:所以,这里的重点不是用户随机选择。重点是 - 程序建议选择哪个选项,以最大化在N步之后,用户将被提供所有关键选项的概率。
对于上面的例子,假设我们选择 N = 4。那么程序需要告诉我们,在出现的前4个选项中(包括 option1-5 的任意4个),选择哪一个会获得获得 option7 的最佳机会。由于要获得 option7,需要 option6,而为了获得 option6,需要 option4 和 option5,因此很明显你必须在第一组选择中选择 option4 或 option5 中的一个。当然,其中一个肯定会出现。
假设我们在第一次选择中得到了 {option3,option5,option2,option4}。然后程序会说:
如果你选择 option3,在4步内你永远不会获得 option7。p = 0; 如果你选择 option5,你可能会获得 option7,p = ....; ... option2,p = 0; ... option4,p = ...;
无论我们选择什么,对于接下来的4个选项,概率 p 都会重新计算。很明显,如果我们选择了 option3 或 option2,每个进一步的选择都有恰好 0 的概率使我们到达 option7。但是对于 option4 和 option5,p > 0。
现在清楚了吗?我不知道如何获得这些概率 p。

1
也许您可以添加一个简短的示例,以使其更加清晰明了? - Jim Clay
你认为用户会随机选择吗? - Beta
根据先前的选择,是否有规则定义选项池的外观? - Ricky Bobby
@Ricky 是的,规则都非常明确,有一个函数(args),当args是已选择的选项时,它会返回可用选项列表。而这些选项本身是带有概率字段的对象。@Jim 添加了一个例子。 - vedran
1
你可能会对Dr. Dobb的期刊上关于概率计算的一些最近 专栏感兴趣。 - harpo
2个回答

2
这听起来像是一个中等难度的马尔科夫链问题。为每个状态创建一个节点;状态没有历史记录,仅依赖于可能的路径(每个路径都带有一些概率权重)。您可以在每个节点上放置一个概率,表示用户在该状态下的可能性,因此,在第一步中,他的起始节点将为1,其他地方为0。然后,根据相邻节点和到达它们的概率,通过更新每个顶点上的概率,迭代到下一步。因此,您可以轻松计算出用户可能在15步内着陆的状态及其相关概率。如果您对渐近行为感兴趣(如果他能一直玩下去会发生什么),则可以制作一大堆线性同时方程,并直接解决它们或使用一些技巧(如果您的树或图具有整洁的形式)。您经常会得到循环解决方案,其中用户可能陷入循环等情况。

1
但是如果一个状态没有历史记录,你如何处理选择之间的依赖关系呢?也许每个状态都代表了先前选择的所有选项的集合? - smackcrane
好的,这已经是一个很大的帮助,因为现在我有了一个合理的想法来应对这个问题。但仍有一件事情需要解决——用户在N步中需要实现不止一个目标...所以如果节点代表单个选项,我需要计算连接起点和所有目标选项的所有可能路径。我是正确的吗?或者像@discipulus所说的那样,状态是否代表先前选择的集合? - vedran
@discipulus:你来自哪里通常是无关紧要的;重要的是前进的可能选择,这些选择通过向前的边界进行区分,以此类推。如果历史确实很重要,那么是的,你需要克隆节点。 - Nicholas Wilson
@vedran:抱歉,之前似乎你只是想让用户到达其中一个终止的KEY节点;现在看来你想让他经过所有这些节点。如果它们是有序的,那么很容易;只需找到他到达第一个KEY的n步机会;然后对下一个KEY做同样的事情,以此类推。如果KEY可以以任何顺序出现,那么你需要稍微修改一下算法,但基本思路仍然相同:布置转换图,并不断迭代它。 - Nicholas Wilson
1
区别在于每个节点都由v(n,k1,k2,k3)来标识,其中n定义了转换(查找矩阵),我们将是否已经遍历各种关键字作为参数存储。然后,您可以迭代并不断检查用户是否能够到达任何一个状态v(_, 1,1,1),并且只需将您放置在每个节点上的概率相加即可。如果您的图中存在循环(即用户可以选择返回起始点的选项),那么这是唯一会使问题变得复杂的事情,因为这是回答“他最终能够达到目标吗?”这个问题变得困难的原因。 - Nicholas Wilson

1
如果您认为用户随机选择选项,并且在节点上始终呈现相同的选项分布,那么您可以将其建模为图上的随机游走。最近,在Mathematica博客上有一篇很好的文章计算特定随机游走的终止概率

用户在程序计算出开始给予的4个选项的概率之前,实际上并没有选择任何东西。然后他进行选择,并获得另外4个选项,程序再次计算新4个选项的概率。 - vedran
@vedran 没错,但 @rrenaud 的观点是,由于用户的选择会影响他们实现所需结果的实际机会,因此您需要做出一些关于用户行为的假设,以便计算概率。 - Nick Johnson
1
事实上,如果您无法预先计算出用户选择“Y”时获得“选项X”的概率,那么您无法通过分析方法解决问题。 - Dr. belisarius
@belisarius 您可以计算选择X出现在用户可选择的4个选项中的概率。然后程序进行计算,用户随意选择其中任何一个选项。接下来的一组4个选项,程序会重新计算。 - vedran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接