此程序针对港口韧性系统风险因子分析,建立的一个灵活可变的模糊贝叶斯网络结构。通过每个输入结点的无条件概率得到最终的Crisp value或效用函数值。网络结构通过配置文件的方式修改,程序内部对不同的网络结构参数自适应。
此程序所有需要用到的数据以及配置文件存放在Data文件夹中,主要有三个文件组成:
- NetShape.ini : 此文件为配置文件,用于修改网络结构以及每个结点语言描述等级的个数。有如下几个变量
- Linguistic_Terms: 语言描述等级的个数
- Layer_num: 网络层数(除去输入结点)
- Layer_Node_x: 第x层结点的父节点个数(中间用Tab分割,输出层为第一层)
- InputData.CSV: 输入结点的每个语言描述等级的概率,同一节点的概率和为1
- Normalised_Weights.CSV: 每个节点对其子节点影响的权重(由FAHP得到,一个节点的所有父节点对其的影响权重的和为1)
执行FBN_main.py函数,则会输出相应的目标节点的概率,效用函数值以及进行敏感性分析后,每个节点调整不同比例的效用函数值
此程序主要包括四个文件(夹):
- Data:用于存放配置文件以及输入和参数
- FBN_main.py: 程序主函数文件(执行文件)
- Init.py: 存放了读取文件或加载文件的子函数
- Lib.py: 存放所有与计算或处理有关的子函数
- class Node: 定义输入节点类, 其有一个属性为输入结点的概率prob, 初始化时需对其概率赋值,否则概率为空
- class CalNode(Node): 定义了中间节点以及输出结点,是Node的子类, 比Node类多了两个属性分别为cpt(该结点与其父节点构成的条件概率表), joint(该节点的父节点所有可能的概率乘积)
- load_input: 将从文件读取到的输入概率赋值给网络的输入结点
- cal_cpt: 计算条件概率表:
根据symmetric model方法以及FAHP的到的权重计算条件概率表。
$$P(Z|Y_1, Y_2, ..., Y_n) = \Sigma_{r=1}^nw_r $$ 对于一个有y个父节点的节点,若其与其父节点描述等级为N个级别,则他的条件概率表一共有$N^{y+1}$个参数。例如R1有5个父节点,每个结点有5个等级的描述级别,则其cpt共有$5^6$个参数,为了方便运算和查询,用一个5x5x5x5x5x5的6维矩阵存储,则查询是其矩阵下标及为对应的条件概率。 - cal_joint_prob: 计算结点的父节点所有可能的概率乘积组合(针对输入结点的下一层结点)。 如:结点$X_1, X_2$分别有两种状态,则可能的概率乘积组合为4中 $$ P(X_1=1)P(X_2=1), P(X_1=0)P(X_2=1),P(X_1=1)P(X_2=0),P(X_1=0)P(X_2=0)$$ 若某个结点有5个父节点, 并且有5个语言等级描述,则此函数的输出应为5x5x5x5x5的矩阵
主程序的执行流程为:
- 从文件中读取语言描述等级的个数,网络层数,每层结点个数,权重以及输入等信息
- 创建一个空数组用于存储节点, 根据读取的网络结构分层次向此空数组中添加结点, 构成网络模型,输入层节点为Node类, 中间层以及输出层为CalNode类
- 根据读取的权重计算除输入层结点外每个结点相应的条件概率表cpt
- 将读取到的输入概率加载到输入层的节点中
- 计算输入结点下一层的joint(即调用cal_joint_prob)
- 计算该结点的概率(贝叶斯网络图中用联合概率表示各节点之间的依赖关系)
即利用公式
$$P(A,B,C) = P(A|B,C)P(B)P(C)$$ 只需将条件概率表对应的条件概率矩阵与cal_joint_prob得到的概率矩阵相乘再求和,得到的值即为节点在该状态下的概率 - 将此层计算的结果作为下一层的输入再计算,直到得到最终结果