做毕设时因为恐惧层次分析法的计算量,所以通过程序实现了.
层次分析法计算过程的程序化实现代码
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;
}