AHP层次分析法java实现

层次分析法(AHP)
       美国运筹学家A.L.Saaty于本世纪70年代提出的层次分析法(Analytical Hierar-chy Process,简称AHP方法),是一种定性与定量相结合的决策分析方法。它是一种将决策者对复杂系统的决策思维过程模型化、数量化的过程。

具体的方法介绍在这个ppt上有详细的解释。

PPT:https://files.cnblogs.com/files/mansiisnam/AHP%28%E5%B1%82%E6%AC%A1%E5%88%86%E6%9E%90%E6%B3%95%29%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B.ppt

本例的影响因素有6个,属单层分析。

特征编码为0,1,2,3,4,5。代码:

package crawlerTest;
public class Ahq_test {
    /**
     * 
     *@author LJ
     *2016-3-30
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Double[][] matrix=new Double[6][6];
        for(int i=0;i<6;i++){
            matrix[i][i]=1.0;
        }
        //数组0,1 位置存放的是影响因素0相对于影响因素1的重要程度 。
        //0.25代表 影响因素0的重要程度为影响因素1的重要程度的4分之1。
        matrix[0][1]=0.25;            
        matrix[0][2]=0.5;
        matrix[0][3]=1.0;
        matrix[0][4]=1.0;
        matrix[0][5]=0.5;
        matrix[1][2]=0.5;
        matrix[1][3]=1.0;
        matrix[1][4]=2.0;
        matrix[1][5]=1.0;
        matrix[2][3]=1.0;
        matrix[2][4]=0.5;
        matrix[2][5]=0.5;
        matrix[3][4]=2.0;
        matrix[3][5]=1.0;
        matrix[4][5]=0.5;
        //根据输入值填写矩阵剩余项
        for(int i=5;i>=0;i--){
            for(int j=5;j>=0;j--){
                matrix[i][j]=1/matrix[j][i];
            }
        }
        Double[] column=new Double[6];
        for(int j=0;j<6;j++){
            for(int i=0;i<6;i++){
                if(column[j]!=null){
                    column[j]=column[j]+matrix[i][j];
                }else{
                    column[j]=matrix[i][j];
                }
            }
            
        }
        //矩阵归一化
        Double[][] matrixColumn= new Double[6][6];
        for(int j=0;j<6;j++){
            for(int i=0;i<6;i++){
                matrixColumn[i][j]=matrix[i][j]/column[j];
            }
            
        }
        //获得行数组
        Double[] line=new Double[6];
        for(int i=0;i<6;i++){
            for(int j=0;j<6;j++){
                if(line[i]!=null){
                    line[i]=line[i]+matrixColumn[i][j];
                }else{
                    line[i]=matrixColumn[i][j];
                }
            }
            
        }
        //行归一化获得特征向量
        Double[] w=new Double[6];
        Double sum=0.0;
        for(int i=0;i<6;i++){
            sum=sum+line[i];
        }
        for(int i=0;i<6;i++){
            w[i]=line[i]/sum;                    //特征向量
        }
        Double[] bw=new Double[6];
        for(int i=0;i<6;i++){
            for(int j=0;j<6;j++){
                if(bw[i]!=null){
                    bw[i]=bw[i]+matrix[i][j]*w[j];
                }else{
                    bw[i]=matrix[i][j]*w[j];
                }    
            }
        }
        Double sumR=0.0;                        //最大特征跟R
        for(int i=0;i<6;i++){
            sumR=sumR+bw[i]/(6*w[i]);
        }
        Double ci=(sumR-6)/(6-1);                //矩阵一致性指标
        System.out.println("计算出的矩阵一致性指标"+ci+"\n");
        Double cr=ci/1.24;                        //随机一致性比率 1.24为6阶矩阵的平均一致性指标
        if(cr>=0.1){
            System.out.println("权重设置不合理");
        }else{
            //输出特征向量
            for(int i=0;i<6;i++){
                System.out.println("特征"+i+"的权重:"+w[i]);
            }
        }
    }

}

运行结果:

posted @ 2016-03-30 12:24  mansiisnam  阅读(2268)  评论(0编辑  收藏  举报