问题
想象一个游戏,您有一个轮盘和5个面数不同的色子。轮盘有5个概率相等的结果:2、4、8、12、20。在游戏中,首先转动轮转盘,然后滚动面数与结果相同的色子。编写一个Figaro程序表现这个游戏。
a) 计算滚动12面色子的概率
b) 计算掷出数字7的概率
c) 已知掷出的是7,计算滚动的是12面色子的概率
d) 已知滚动的是12面色子,计算掷出数字7的概率
解答
import com.cra.figaro.language._
import com.cra.figaro.algorithm.factored.VariableElimination
object main {
def main(args : Array[String]): Unit = {
val sect = Select(0.2 -> 2 , 0.2 -> 4 , 0.2 -> 8 , 0.2 -> 12 , 0.2 -> 20 )
val run2 = Select(0.5 -> 1 , 0.5 -> 2 )
val run4 = Select(0.25 -> 1 , 0.25 -> 2 , 0.25 -> 3 , 0.25 -> 4 )
val run8 = Select(0.175 -> 1 , 0.2 -> 2 , 0.175 -> 3 , 0.175 -> 4 , 0.175 -> 5 , 0.2 -> 6 , 0.175 -> 7 , 0.175 -> 8 )
val run12 = Select(0.0833 -> 1 , 0.0833 -> 2 , 0.0833 -> 3 , 0.0833 -> 4 , 0.0833 -> 5 , 0.0833 -> 6 , 0.0833 -> 7 , 0.0833 -> 8 , 0.0833 -> 9 , 0.0833 -> 10 , 0.0833 -> 11 , 0.0833 -> 12 )
val run20 = Select(0.05 -> 1 , 0.05 -> 2 , 0.05 -> 3 , 0.05 -> 4 , 0.05 -> 5 , 0.05 -> 6 , 0.05 -> 7 , 0.05 -> 8 , 0.05 -> 9 , 0.05 -> 10 , 0.05 -> 11 , 0.05 -> 12 , 0.05 -> 13 , 0.05 -> 14 , 0.05 -> 15 , 0.05 -> 16 , 0.05 -> 17 , 0.05 -> 18 , 0.05 -> 19 , 0.05 -> 20 )
val resu = Chain(sect, (i: Int) => if (i == 2 ) run2; else if (i == 4 ) run4; else if (i == 8 ) run8; else if (i == 12 ) run12; else if (i == 20 ) run20; else run2)
println ("a) " +VariableElimination.probability(sect, 12 ))
println ("b) " +VariableElimination.probability(resu, 7 ))
resu .observe (7 )
println ("c) " +VariableElimination.probability(sect, 12 ))
resu .unobserve ()
sect .observe (12 )
println ("d) " +VariableElimination.probability(resu, 7 ))
}
}
结果