层次分析法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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值