您的位置:首页 > Web前端

ACM中一类基于Markov链模型的期望问题(概率DP)

2012-08-07 09:07 232 查看


Abstract

本文要讨论的是一类期望问题的解,基于以下限制:

1.状态空间为一有限集合S。

2.转移F:S->S是从S到S的一个映射,且该映射存在环。或者说将S画做一张图,任一状态s∈S对应图中一个点,则F为图的一个有向边集,且该图存在环。

3.转移的代价C(F)为一个常量c(通常c=1)。或者说对于上面的图,任一条边的权为c。

4.求从某一状态ss至另一状态st的代价期望。

 


Body

水平粗浅,成文仓促,欢迎指正。

本文不做概念普及,请对着tag翻wikipedia。

本文要讨论的是一类期望问题,基于以下限制:

1.状态空间为一有限集合S。

2.转移F:S->S是从S到S的一个映射,且该映射存在环。或者说将S画做一张图,任一状态s∈S对应图中一个点,则F为图的一个有向边集,且该图存在环。

3.转移的代价C(F)为一个常量c(通常c=1)。或者说对于上面的图,任一条边的权为c。

4.求从某一状态ss至另一状态st的代价期望。

5.(任意s∈S,s的出边概率和为1,当然这是概率论的基本条件)

这样说比较抽象,还是举两个题:

POJ2096 Collecting Bugs

题意大概是说一个人找程序bug,每天找一个。bug有两种属性:Category和Subcomponents,因此一种bug可以描述为(c,s)。共有C个Category与S个Subcomponents。此人每天发现的bug的属性分布是随机的,即任一种bug(c,s)等可能被发现。问他发现的所有bug覆盖所有C个Category与S个Subcomponents的期望天数。

对于此题我们设状态sta=(c,s)表示此人发现的bug覆盖了c个Category及s个Subcomponents。则状态空间S为sta的所有可能取值共(c+1)*(s+1)个元素。容易知道sta=(c,s)可以转移到(c,s),(c,s+1),(c+1,s),(c+1,s+1),转移代价为1。起始状态ss=(0,0),终止状态st=(C,S)。

TopCoder SRM488 Div1 250

题意大概是说有两个无聊的人A与B和另外N+M个人,其中N个人不无聊,M个人无聊。每小时A和B任选这n+m个人中两个人(a,b)聊天,任意有序数对(a,b)被选到的概率相等。不无聊的人“被聊天”后变成无聊。问把所有人都变无聊所需的时间期望。

对于此题我们设状态s=(n,m)表示当前有n个不无聊人及m个无聊人。则状态空间S为s的所有可能取值共n+m+1个元素(注意到总是有n+m=N+M,因此此状态看似为2维实际上是1维的)。容易知道s=(n,m)可以转移到(n,m),(n+1,m-1),(n+2,m-2),转移代价为1。起始状态ss=(n,m),终止状态st=(0,N+M)。

以上两题都是此类问题对于F仅存在自环的特例。

如何解此类问题呢?

根据马尔可夫链,我们当然可以通过画出从以起始状态为根的转移树,树是无穷大的,但我们可以通过迭代的方式求无穷级数和,使其收敛至给定精度从而给出解。

但实际操作之后你会发现,除非对于小数据情况,求级数的难度非常大,且迭代的精度很不可靠。

此处直接给出另一种方法:

设E(s)为s状态下转移至st的代价期望值。则显然有边界条件E(st)=0。对于任意s[i]∈S,有

E(s[i])=c(转移代价)+P(s[i] to s[1])*E(s[1])+P(s[i] to s[2])*E(s[2])+...+P(s[i] to s[j])(转移概率)*E(s[j])+...+P(S[i] to s
)*E(s
)。=c+sigma(j from 1 to n)(P(S[i] to s[j])*E(s[j]))

所有方程构成一线性方程组,本来矩阵的秩为n-1不可解,但通过边界条件E(st)=0使得矩阵满秩,用高斯消元,可以求E(ss)。

对于F仅存在自环的情况,方程可化为:

(1-P(s[i] to s[i]))*E(S[i])=c+sigma(j from 1 to n, j != i)(P(S[i] to s[j])*E(s[j]))

则s[i]仅依赖于非s[i]的状态,自环得以消掉,由于F仅存在自环,则图变为了DAG,可以通过记忆化搜索/dp的方式求E(ss)。

举例说明,对于上面的第一题。

设E[i,j]为发现了i个Category,来自j个软件Subcomponents的bug的前提下,到达终点(也就是发现来自所有Category,所有Subcomponents的bug)的天数的数学期望。显然E[C,S]为0,E[0,0]为所求。

有如下递推式

E[i,j] =

1

+ E[i+1,j+1] * (C - i)(S - j) / CS

+ E[i,j+1] * i * (S - j) / CS

+ E[i+1,j] * (C - i) * j / CS

+ E[i,j] * ij / CS

则可以移项解出E[i,j]。通过dp可解出E[0,0]。

对于不是F仅存在自环的情况,Reference第五篇文章中的第二部分。

对于另外一种类型,即F不存在环的情况,可以用Bayes公式同样依据图的DAG性质用记忆化搜索/dp的方式求解。参见Reference第三篇RoBa神的文章。

 


Reference

http://acmicpc.org.cn/wiki/index.php?title=2004_Northeastern_Europe_Northern_Subregion_Collecting_Bugs_Solution
http://kicd.blog.163.com/blog/static/126961911200910168335852/
http://roba.rushcj.com/?p=192

国家集训队2009论文集

梅诗珂 《信息学竞赛中概率问题求解初探》

汤可因 《浅析竞赛中一类数学期望问题的解决方法》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  reference c bugs 聊天 div n2