zoukankan      html  css  js  c++  java
  • [研究总结]ACM中一类基于Markov链模型的期望问题

    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[n])*E(s[n])。=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论文集
    梅诗珂 《信息学竞赛中概率问题求解初探》
    汤可因 《浅析竞赛中一类数学期望问题的解决方法》

  • 相关阅读:
    好玩/感人的小事
    本周最新文献速递20200207
    (史上最全)SNP位点与转录因子结合特异性数据库:GVATdb
    本周最新文献速递20210131
    【Python高级编程029 ● http协议 ● URL】
    【Python高级编程028 ● http协议 ● http协议介绍】
    【Python高级编程027 ● 网络编程 ● socket之send和recv原理剖析】
    【Python高级编程026 ● 网络编程 ● 多任务版TCP服务端程序开发】
    【Python高级编程025 ● 网络编程 ● 开发TCP网络程序注意点】
    【Python高级编程024 ● 网络编程 ● TCP服务端程序开发】
  • 原文地址:https://www.cnblogs.com/jffifa/p/2291075.html
Copyright © 2011-2022 走看看