zoukankan      html  css  js  c++  java
  • PRISM概率模型检测器初使用骰子模型

    

    PRISM—probabilistic model checker概率模型检测器

    骰子模型 The dieexample

    http://www.prismmodelchecker.org/tutorial/die.php  与马尔科夫链有关

    PRISM code

    dtmc

     

    moduledie

     

          //local state

          s : [0..7]init0;

          //value of the die

          d : [0..6]init0;

          

          []s=0 -> 0.5 : (s'=1) + 0.5 : (s'=2);

          []s=1 -> 0.5 : (s'=3) + 0.5 : (s'=4);

          []s=2 -> 0.5 : (s'=5) + 0.5 : (s'=6);

          []s=3 -> 0.5 : (s'=1) + 0.5 : (s'=7) & (d'=1);

          []s=4 -> 0.5 : (s'=7) & (d'=2) + 0.5 : (s'=7) & (d'=3);

          []s=5 -> 0.5 : (s'=7) & (d'=4) + 0.5 : (s'=7) & (d'=5);

          []s=6 -> 0.5 : (s'=2) + 0.5 : (s'=7) & (d'=6);

          []s=7 -> (s'=7);

          

    endmodule

    代码解释:

    module die … endmodule一个骰子模块

    两个变量,设s来指定算法当前要执行哪个步骤,d则为骰子的值(为0时表示还没开始选)

    s : [0..7]init0;s是骰子模块里的一个整数变量,范围是07,初始值(initial)设为0

    []s=0 -> 0.5: (s'=1)+0.5 : (s'=2);s=0时,有0.5的可能性s跳到1并接着执行s=1后的动作,即(s’=1),有0.5的可能性s跳到2并执行s=2,即(s’=2)。注意当可能性的和不为1时,会报错。

    []s=7 -> (s'=7);s=7时,继续执行s=7。看起来像循环,但是PRISM的模拟器在循环进行第二步就停止了。所以可以看作是用来停止该算法的。

    代码用法具体网址:http://www.prismmodelchecker.org/manual/ThePRISMLanguage/Commands

    http://www.prismmodelchecker.org/manual/ThePRISMLanguage/ModulesAndVariables

     

    操作解释:

    Exploring the model in PRISM PRISM探索模型

    1. 下载模块源代码http://www.prismmodelchecker.org/tutorial/examples/die/die.pm,打开PRISM,点击上排按钮“Model”,选“Open model”,导入下好的代码。

    2. 使用模拟器(Simulator):点击下排的“Simulator”来到模拟器,在中部任意处双击(或右键),选择“Newpath”建立一个新测试路径。点击在左上方“Automatic exploration”中的“Simulate”来生成算法的一个样本。再次点击执行样本下一步骤。可多次点击直到算法执行结束(这里是s=7

    3. 手动选择路径(s值):右击并选“Reset path”可重新创建一个样本路径(path)。也可以点击“Manual exploration”中的下一执行路径来手动选择样本的路径。

    4. 设置步骤大小:把“Steps”(在“Simulate”下方)中的值改120,再重建个path,算法会由一次走一步变成走20步,但是这里的骰子算法一般68步,列在“Path”框中。

     

    Model checking with PRISM

    1. 下载属性文件http://www.prismmodelchecker.org/tutorial/examples/die/die.pctl,点上排“Properties”“Open propertieslist”导入。

    const int x;
    P=? [ F s=7 & d=x ]

    解释: const int x; 即在“Properties”框左中的“Constants”中加入整数变量x(可用操作代替代码)

    P=? [ F s=7 & d=x ];格式为P=? [ F phi ],意思是“从原始状态到令phi能为true时的状态时可能性(P)为多少?”

    1. 这里phis=7d为新变量x的状态。

    2. 计算不同x值对应的属性式的可能性值:右击“Properties”“Verify”,选一个16之间的数并“OK”,PRISM会给出x为该值时同时s=7的可能性,如x=1时同时s=7,可能性为P=0.16666650772094727。也可以点击下排“Log”来获得计算过程和结果的更多细节。

    3. 设置不同的参数,观察P值的变化:打开上排的“Options”“Options”,把“Terminationepsilon”中的参数“1.0e-6”改成“1.0e-10”,然后重新“Verify”

      如上一情况,结果变成了0.1666666666569654

    4. 把参数改回“1.0e-6”

    5. 做实验(experiments)生成概率图:右击“Properties”选“New experiment”,对变量x进行设置:Range下方点选后者“End”填入范围07Step填入步骤为1,注意左下方“Create Graph”要勾选才能生成图,“Use Simulation”先不勾。OK后,点选“New Graph”,点OK。即生成x为范围内值时的概率曲线分布图。

     

    Statistical Model checking withPRISM用统计模型验证结果

    PRISM也可以用离散事件模拟工具来生成近似验证结(即用给定数量的样本(samples)来模拟计算概率,样本数量越大,模拟计算的结果也就越接近上面属性公式计算的值,以此来验证可能性值的正确性)

    1. 模拟测试一定数量样本下,可能性值的变化:在Properties中重开一个experiment,在“DefineConstants”对话框内的左下方要勾选“Use Simulation”,在“NewGraph Series”对话框中选“Existing Graph”以在原图上生成新曲线(利于比较),接着,在右边的“NumberOf samples”中把1000改为10 OK。得到的曲线与之前的曲线有很大的不同(因为样本数量小)。另外,可通过改变Graph的设置(x轴,y轴等)来使曲线走向更清晰:如右击概率图,选择“Graph Options”,在“Axes”选项下找“scale type”,把“Normal”改选成“Logarithmic”,曲线变化幅度小的图的变化幅度就能被放大(放成对数曲线)。

    2. 再重开一个experiment,把sample101001000的概率曲线放在一个图上,观察曲线。结果当然是样本数量越大,曲线越接近之前模拟器的计算结果。右击选“Export Graph”可导出图(选png格式)

     

    图中(1)为1000,(2)为100,(3)为10.

    Expected termination time预估终止次数

    PRISM计算预期的步骤次数

    1. 骰子模型的次数很小,操作之前可先自己手算一下。

    2. 加一些东西进模型:在“Model”中代码的最后加上这几句:

    rewards "steps"
      true : 1;
    endrewards
    1. 回到模拟器simulator,生成一个新path,在弹出框中的“Rewardvisibility”中点右边的“1’steps’(cumulative)”并点中间的朝左箭头,然后OK。接着simulate运行,你会看到窗口右边的reward在累积。(Reward下的“Steps”是每次结果的执行步数,“Steps”(+)才是次数的累加)

      当然,以上也可以用一个form来完成:

    R=? [ F phi ]

    解释:从初始状态到满足phi状态时,所有reward累加所得的预期值是多少?

    1. 为了满足上面的运算,phi应该设成什么?

    2. Properties里,加入新property(右击选“add”,测试自己的phi,正确结果应该是11/3。如果你得到的结果是无穷大(infinity),你的phi就不是正确格式(可以查看原因:http://www.prismmodelchecker.org/manual/FrequentlyAskedQuestions/PRISMProperties#inf_rewards

    
  • 相关阅读:
    ansible部署apache
    yum换源,rpm包下载,源码包安装
    zabbix 监控apache
    分块大法 -- 优雅的暴力
    [每日一题]:建立联系 -- 最小生成树
    [每日一题]:P1016 旅行家的预算 -- 反悔贪心
    [每日一题]:[NOIP2010]关押罪犯 -- 并查集
    Python基础: 元组的基本使用
    Python基础: 列表的基本使用
    Python基础:分支、循环、函数
  • 原文地址:https://www.cnblogs.com/sriting/p/6031988.html
Copyright © 2011-2022 走看看