|
没想到小组题目会成为第一篇文章。写得不好请见谅
选取的是算是最简单的基于层次分析法的模型,说它简单因为有现成的层次分析法软件yaahp,简单明了容易上手。
先附上yaahp9.0链接:http://pan.baidu.com/s/1pKLUR03 解压后安装
主要参考文献:
基于层次分析法的信息安全风险评估量化方法研究_李鹏宇
基于层次分析法的信息安全风险评估应用研究_赵越
一个是层次分析法的模型,一个是基于层次分析法结合模糊理论的扩展模型。
首先我们介绍风险,它存在两个属性:导致的损失和发生的可能性。
风险对组织的影响也就是两个属性权衡的结果,因此通过对系统的资产、威胁、脆弱性评估,计算威胁利用脆弱性导致安全事件发生的可能性以及评估安全事件发生对资产造成的损害程度,就可以计算出系统的风险。
其计算原理就描述为 R=f(A, V, T)
其中:R代表风险,A代表资产,V代表脆弱性,T代表威胁
层次分析法(Analytic Hierarchy Process,简称 AHP)。它是一种定量与定性相结合的综合性分析方法,核心是将复杂的问题进行层次化,将原问题简单化并在层次基础上进行分析;它把决策者的主观判断量化,以数量形式进行表达和处理,通过定量形式的数据将定性和定量分析相结合从而帮助决策者进行决策。
层次分析法的基本原理是把要决策的问题看成是由很多影响因素组成的一个大系统,这些因素之间在一定程度上是相互关联和制约的,而且这些因素根据彼此之间的隶属关系可以组合成若干个层次,再利用相关数学方法对各个因素层进行排序,最后通过对排序结果的分析来辅助决策。
层次分析法分为四个步骤:(1)建立层次结构;(2)构造各层次间的两两对比较判断矩阵;(3)计算单个矩阵的权重向量;(4)计算各层元素对目标层的合成权重向量。
(1)首先我们要对目标问题进行剖析,将问题一般分为三层:
目标层(Goal):在该层只有一个元素,是待解决问题所设定的目标。
准则层(Criteria):该层包含了要实现预定目标所涉及的一系列中间环节,包涵了需要考虑的准则和子准则,因此可以有若干个层次组合而成。
方案层(Alternatives):该层包含了可供选择的各种方案和措施等。

(2)然后由层次图构造判断矩阵。对比较判断矩阵是指相对上一层某一准则而言,与该准则有关联的本层各要素之间的相对重要性。例如:方案层B(b1,b2,……,bn)相对上一层某一准则A而言有关联。
矩阵数据是沿对角线对称的,下三角是上三角数据的倒数。

风险评估的数据需要专家和目标领域中资深的多年从业者给出,再进行进一步分析,所以下文引用的是参考论文中给出的例子。
(3)计算单个矩阵的权重向量。

看着这个也许不太理解,ω为权重。举个简单的例子:
这是直接截取的软件的矩阵,2x2的矩阵所以只需要输入一个数据,因为对角线始终为1,而以对角线对称的下三角数据为上三角的倒数。
于是,我们进行权重计算:
首先进行列归一化,再求行和列归一化。0.2365就是A1对于A的权重,0.7635是A2对于A的权重。
学了线性代数应该知道如何求最大特征值λ,不过太麻烦,所以我们用这种方法求λmax。
但实际构造出的对比较判断矩阵要满足所有以上的等式和要求是不可能的。因此退而允许对比较判断矩阵在一定程度可以存在不一致,但对比较判断矩阵也要有一定的一致性。
过程截取结课报告上的:
计算量不算大,可以手动完成。
(4)计算各层元素对目标层的合成权重向量。将计算出来得到的各层次单排序,即每一层相对于上一层各个元素的相对权重,通过将各层的单排序结果进行进一步的计算就可得到层次结构模型中每一层的所有因素相对于目标层的组合权重,由上往下逐层进行最终得到方案层中的元素相对于目标层的组合权重,这一计算过程就叫层次总排序。
———————–然后如何计算风险等级:

以下是层次分析法模型实例,直接po软件截图:
判断矩阵如下:

软件会自动计算,也可导出文件。以下是结果:(Wi是对应的准则层所占的权重)
总权重表:

———-计算风险等级的模型

附:
因为有现成的软件,就没有用MATLAB做模型,以下是实现算法结果的java代码:(最好动手做一做MATLAB实现也不难,一下午上手实现风险评估的模型是绰绰有余的)
`
import java.util.Scanner;
public class ahp {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n;
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
Arr a=new Arr();
a.Arr(n);
a.Normalization();
a.rowSumAndNor();
a.arrMul();
a.avg();
a.getCR();
a.display();
}
}
`
import java.text.DecimalFormat;
import java.util.Scanner;
public class Arr{
int n;
double[][] arr;
double[][] arr1;
double[] row;
double[] row1;
double vetor;
double CR;
Scanner sc=new Scanner(System.in);
void Arr(){
}
void Arr(int n){
this.n=n;
arr=new double[n][n];
arr1=new double[n][n];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
arr[i][j]=sc.nextDouble();
}
}
for(int i=0;i<n;i++){
arr[i][i]=1;
}
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
arr[i][j]=1/arr[j][i];
}
}
row=new double[n];
row1=new double[n];
}
void Normalization(){
double sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum+=arr[j][i];
}
for(int k=0;k<n;k++){
arr1[k][i]=arr[k][i]/sum;
}
sum=0;
}
}
void rowSumAndNor(){
double sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum+=arr1[i][j];
}
row[i]=sum;
sum=0;
}
for(int i=0;i<n;i++){
sum+=row[i];
}
for(int i=0;i<n;i++){
row[i]=row[i]/sum;
}
}
void arrMul(){
double sum=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
sum+=arr[i][j]*row[j];
}
row1[i]=sum;
sum=0;
}
}
void avg(){
double sum=0;
for(int i=0;i<n;i++){
sum+=row1[i]/row[i];
}
vetor=sum/n;
}
void getCR(){
double[] RI=new double[]{0,0,0.52,0.90,1.12,1.26,1.36,1.41,1.46,1.49};
double CI=(vetor-n)/(n-1);
CR=CI/RI[n];
}
void display(){
System.out.println();
System.out.print("(");
for(int i=0;i<n;i++){
System.out.print(row[i]+" ");
}
System.out.print(")");
System.out.println();
System.out.println(vetor);
System.out.println(CR);
}
}
|