这可能是这个论坛的常驻CUDD/BDD专家@DCTLib的一个问题,但如果其他人有见解,当然欢迎!
考虑一个给定的腹地,比如:0--0-0
我需要分别取每一个城域网,并将" 1“替换为P(x_i) (我正在处理变量的概率),0替换为1-P(x_i),并将"-”替换为1。然后我将腹中的因子P(X_i).(1-P(X_j))相加,以获得最高事件的概率。(与腹壁相对应的概率的和积)
我需要一个接一个地使用它们的原因是,我正在处理的大型文件会炸掉memory.Once --我有80到100个变量,您在TB OoM中拥有整个minterm文本文件转储的大小。如果可能的话,我想把每个minterm,添加到运行和,并删除它一次。
希望这是明确的,但如果不是,可能需要一些迭代。谢谢,
发布于 2020-08-09 15:07:00
你在这里有几个选择:
( a)在BDD上似乎已经有了一个输出Cudd_PrintMinterm的文本文件。计算你的值的总和实际上不是一个CUDD问题。只需逐个解析行并动态计算和:
std::ifstream inFile("minterms.txt");
std::string currentLine;
double sumSoFar = 0;
while (std::getline(inFile,currentLine)) {
// Process the line "currentLine"
};
if (inFile.fail()) throw "Oopsie";但是您也可以在python中这样做。您可能需要使用这种方法来提高数值的准确性。
( b)按照描述问题的方式,不需要在中间层迭代,而是可以为每个BDD节点n分配一个概率p(n),并计算到根BDD节点的概率。这样做的方法是将概率1赋值给真叶,将概率0赋值给假叶,对于每个内部节点(t,e,x)有真正的继承者t,否则后继e和变量x计算。
p(n) = p(t)*p(x) + p(e)*(1-p(x))那么p(根)就是你正在寻找的东西。这种方法更优雅,但要求您编写一个(通常是递归的)过程来处理BDD结构本身。这里有一个计算满意分配的示例(使用封装CUDDs自己类型的数据类型):https://github.com/VerifiableRobotics/slugs/blob/master/src/BFAbstractionLibrary/BFCudd.cpp
https://stackoverflow.com/questions/63326728
复制相似问题