层次分析法java实现
做毕设时因为恐惧层次分析法的计算量,所以通过程序实现了.
层次分析法计算过程的程序化实现代码
package e_5_28;
/*
?* author 曾绍涛
?* time 2009-5-29
?* function 层次分析法的程序化计算
?*/
import java.util.HashMap;
class Caltest1
{
?static int n;//矩阵的阶数
?double cal[][];//层次比较矩阵,归一化后的
?double cal1[][];//层次比较矩阵
?static HashMap hm=null;//将12阶的成对比较矩阵的平均随机一致性指标值保存在哈希映射表里
?//设置平均随机一致性指标值
?public static void setHm()
?{
??hm=new HashMap();hm.put(1, 0);hm.put(2, 0);
??hm.put(3, 0.58);hm.put(4, 0.89);hm.put(5, 1.12);
??hm.put(6, 1.24);hm.put(7, 1.32);hm.put(8, 1.41);
??hm.put(9, 1.45);hm.put(10, 1.49);hm.put(11, 1.52);
??hm.put(12, 1.54);
?}
?public int getN(){
??return n;
?}
?public void setN(int n){
??this.n = n;
?}
?//原始成对比较矩阵列向量的归一化
public void colvectortoone(double arr[])//列向量的归一化
?{
??arr=new double[n];
??System.out.println("*****************每列求加和开始*****************");
??for(int j=0;j<n;j++)
??{
???for(int i=0;i<n;i++)
???{
????arr[j]+=cal[i][j];//每列求加和
???}
??}
??System.out.println("*****************每列求加和完毕*****************");
??System.out.println("*****************打印行值和进行验证开始*****************");
??for(int i=0;i<n;i++)
??{
???System.out.println(arr[i]);//打印行值和进行验证
??}
??System.out.println("*****************打印行值和进行验证完毕*****************");
??System.out.println("*****************列向量归一化开始*****************");
??for(int j=0;j<n;j++)
??{
???for(int i=0;i<n;i++)
???{
????cal[i][j]=cal[i][j]/arr[j];//列向量归一化
???}
??}
??System.out.println("*****************列向量归一化完毕*****************");
??System.out.println("*****************打印归一化后的数组开始*****************");
??for(int j=0;j<n;j++)//打印归一化后的数组
??{
???for(int i=0;i<n;i++)
???{
????System.out.print(cal[j][i]+"\t");//列向量归一化
???}
???System.out.println();
??}
??System.out.println("*****************打印归一化后的数组结束*****************");
?}
?//得到归一化矩阵各行的行和
?public double [] rowsum(double arr1[])//按行求和,并返回求得的数组
?{
??arr1=new double[n];
??for(int j=0;j<n;j++)
??{
???for(int i=0;i<n;i++)
???{
????arr1[j]+=cal[j][i];//每行求加和
???}
??}
??System.out.println("*****************行和打印验证开始*****************");
??for(int j=0;j<n;j++)
??{
???System.out.println(arr1[j]);
??}
??System.out.println("*****************行和打印验证结束*****************");
??//以下对arr1[]进行归一化
??double sum=0;
??
??for(int i=0;i<n;i++)
??{
???sum+=arr1[i];
??}
??System.out.println("*****************向量归一化计算开始*****************");
??for(int i=0;i<n;i++)//得到权重
??{
???arr1[i]=arr1[i]/sum;
??}
??System.out.println("*****************向量归一化计算结束*****************");
??System.out.println("*****************打印权重开始*****************");
??for(int j=0;j<n;j++)
??{
???System.out.println(arr1[j]);
??}
??System.out.println("*****************打印权重结束*****************");
??return arr1;
?}
?//求最大特征值
?public double getnamda(double arr1[],double arr2[])
?{
??arr2=new double[n];
??for(int j=0;j<n;j++)
??{
???for(int i=0;i<n;i++)
???{
????arr2[j]+=cal1[j][i]*arr1[i];//得到A*w
???}
??}
??System.out.println("*****************打印A*w开始*****************");
??for(int i=0;i<n;i++)
??{
???System.out.println(arr2[i]);//打印权重向量
??}
??System.out.println("*****************打印A*w结束*****************");
??double L=0;//5*namda
??for(int i=0;i<n;i++)
??{
???L+=arr2[i]/arr1[i];
??}
??double namda=L/n;
??return namda;
?}