故障树最小割集程序化设计方案

故障树这一技术在针对工业设备的故障分析中应用较多,一个顶事件通常对应着一个故障,而这个故障可能包含有多个事件组合。最小割集指的是一系列组合事件的集合,这个集合中的每个事件组合是该故障发生的最小事件组合。如何求解最小割集是故障树算法应用的重要问题之一。
下面就对最小割集的求解方法进行简述,并说明哪些方法适合用作程序设计。
1、行列法
又称为下行法。从顶事件开始,用下一层事件代替上一层事件,把“与门”连接的事件,按行横向排列;把“或门”连接的事件,按列纵向排开。这样,逐层向下,直至各基本事件,列出若干行,最后利用布尔代数化简,得出若干最小割集。
该方法的实例及求解过程见文献【1】。另,文献【3】中也可以查阅行列法的求解过程。需要强调的是,文献【3】还提供了程序化设计方案,附带了可执行的Java源码,在此感谢该作者的知识共享。文献【3】中的手写稿存在部分错误,现将其修正如下:
故障树最小割集程序化设计方案_第1张图片
故障树最小割集程序化设计方案_第2张图片
故障树最小割集程序化设计方案_第3张图片
2、结构法
从顶至下,将故障树结构直接用逻辑表达式进行化简。该方法的实例及求解过程见文献【1】,其故障树如下所示。
故障树最小割集程序化设计方案_第4张图片
求解过程如下:
故障树最小割集程序化设计方案_第5张图片
3、布尔代数化简法
该方法其实与结构法相似,不同的是用“+”代替“∪”。单从手动求解的角度考虑,布尔代数法应该是最直观易用的方法。该方法的实例及求解过程见文献【1】。
求解过程如下:
故障树最小割集程序化设计方案_第6张图片
关于布尔代数化简法的程序化设计方案,笔者有这样一种思路与君共勉。
首先,从底至顶,列出各个事件的逻辑表达式,然后依次带入顶事件中,得出顶事件发生的逻辑表达式,形如上图中的倒数第二步。然后通过字符串操作,用"+"分割各个事件集合;对每一个事件集合,去除重复项;遍历各个事件集合,当遇到x1x2包含x1x2x3的情况时,剔除后者,直到遍历结束。此时的事件集合即为最小割集。
以文献【1】中的故障树为例,笔者提供一下逻辑表达式带入求解的python代码,可以参考文献【5】,后续的字符串处理部分请大家自行完成。

from sympy import *
# 指定各个事件为数学公式字符
x1, x2, x3, x4, x5, x6 = symbols("x1 x2 x3 x4 x5 x6")
A1, A2, B1, B2, C = symbols("A1 A2 B1 B2 C")
# 列出各事件逻辑关系,从底至顶
C = x4 * x5
B2 = C + x6
B1 = x1 + x3
A2 = x4 * B2
A1 = x1 * B1 * x2
Y = A1 + A2
print(Y)
result = simplify(Y)
# 打印标准格式
pprint(result, use_unicode=True)
a100 = expand(Y)
pprint(a100, use_unicode=True)

这个思路是笔者自己设计的,如果有更好的办法,愿洗耳恭听。
4、关联矩阵法
构建关联矩阵,将故障树中的各个事件按照行排开,各个逻辑门按照列排开,如果事件i为逻辑门kj的输入,则aij=-1;如果事件i为逻辑门kj的输出,则aij=1;如果事件i与逻辑门kj无关,则aij=0,按照这个规则填充关联矩阵。之后,按照文献【2】中方法化简关联矩阵,最终得到最小割集。
该方法通过化简一个关联矩阵即可得到最小割集,简便。正如该文摘要中所述–“为计算机辅助事故树分析的程序设计提供新的途径”。
综上,如果是手写推算最小割集,布尔代数化简法>结构法>行列法>关联矩阵法;如果是设计程序实现最小割集求解,行列法>布尔代数化简法>关联矩阵法,因为行列法已经有源码,所以优先级最高!

参考文献:
【1】https://wenku.baidu.com/view/7aa0b516ab00b52acfc789eb172ded630a1c9811.html
【2】单亚飞. 用关联矩阵求解最小割集方法[J].阜新矿业学院学报(自然科学版), 1997, 16(3): 352-355.
【3】https://blog.csdn.net/conquerwave/article/details/8240886
【4】http://www.safehoo.com/item/5714.aspx#section(故障树国标)
【5】https://blog.csdn.net/shuangguo121/article/details/86611948(使用sympy进行表达式化简)

你可能感兴趣的:(算法,算法,故障树)