首页 > 编程知识 正文

AHP权重计算公式步骤,AHP中Wj权重的计算

时间:2023-05-04 03:58:41 阅读:151849 作者:4631

一. AHP层次分析法简介

层次分析法(Analytic Hierarchy Process,简称AHP )是对一些复杂模糊问题进行决策的简单方法。

这特别适用于难以进行完全定量分析的问题。 这是美国物流学家phdyl教授在70年代初期提出的简便、

一种灵活实用的基于多准则决策方法。

1层次分析法的基本原理和步骤

人们在对社会、经济和科学管理领域问题进行系统分析时,往往面临着诸多相互联系、相互制约的因素

这是一个容易缺乏复杂定量数据的系统。 层次分析法为这类问题的决策和排序提供了一种新的、简洁实用的建模方法。

使用层次分析法的模型化大致可以通过以下4个步骤来进行。

(I )建立分层结构模型

(ii )构建各级中的所有判断矩阵

(iii )分层排序和一致性检查

(iv )分层总排序和一致性检查。

双层次结构的构建与表征

应用AHP分析决策问题时,首先要对问题进行理化、分层,建立层次结构模型。

在这个模型中,复杂的问题被分解为要素的构成要素。 这些要素还通过其属性和关系形成几个层次。

上一级要素作为基准支配下一级的相关要素。 这些级别可以分为以下三类:

) I )顶级)这个级别只有一个要素。 一般也称为目标水平,因为它是分析问题的目标或理想结果。

(ii )中间层)该层次包括参与实现目标的中间阶段,可以包括几个层次,包括要考虑的指导方针、子指导方针。

因此,也称为基准层。

(iii )最底层)此层次包括可为实现目标而选择的各种措施、决策方案等,因此也称为措施层或方案层。

分层结构中的层数与问题的复杂程度和有待分析的详细程度有关,一般地层次数不受限制。

各阶层各元素支配的元素通常不要超过9个。 这是因为,支配的元素过多会给两个比较判断带来困难。

Java代码:

package boke.ahp;

import java.math.BigDecimal;

import java.util.Arrays;

//*

*用AHP层次分析法计算权重

*

* @since jdk1.6

* @author急速的秋天

* @版本1.0

* @date 2010.05.25

*

*/

公共类ahpcomputeweight {

//*

* @param args

*/

publicstaticvoidmain (string [ ] args ) {

/** a是N*N矩阵*/

double [ ] [ ] a=new double [ ] [ ] { 1,3,5,1,3 },

{1/3.0、1、2、1/3.0、1/4.0}、

{1/5.0,1/2.0,1,1/3.0,1/2.0 },{ 1,3,3,1,1 },

{1/3.0,4,2,1,1 };

int N=a[0].length;

double[] weight=new double[N];

ahpcomputeweightinstance=ahpcomputeweight.getinstance (;

instance.Weight(a,weight,n );

system.out.println (arrays.tostring ) weight );

}

//一例

privatestaticfinalahpcomputeweightacw=newahpcomputeweight (;

//平均随机完整性指针

private double [ ] ri={ 0.00,0.00,0.58,0.90,1.12,1.21,1.32,1.41,

1.45,1.49 };

//随机一致率

专用双精度Cr=0.0;

//最大特征值

private double lamta=0.0;

//*

*私人结构

*/

private AHPComputeWeight (

}

//*

*回到单盒

*

* @return

*/

publicstaticahpcomputeweightgetinstance (

return acw;

}

//*

*计算权重

*

* @param a

* @param weight

* @param N

*/

publicvoidweight(double[][]a,double[] weight,int N ) ) ) ) ) ) ) ) 65

//初始向量Wk

double[] w0=new

double[N];
for (int i = 0; i < N; i++) {
w0[i] = 1.0 / N;
}

// 一般向量W(k+1)
double[] w1 = new double[N];

// W(k+1)的归一化向量
double[] w2 = new double[N];

double sum = 1.0;

double d = 1.0;

// 误差
double delt = 0.00001;

while (d > delt) {
d = 0.0;
sum = 0;

// 获取向量
int index = 0;
for (int j = 0; j < N; j++) {
double t = 0.0;
for (int l = 0; l < N; l++)
t += a[j][l] * w0[l];
// w1[j] = a[j][0] * w0[0] + a[j][1] * w0[1] + a[j][2] * w0[2];
w1[j] = t;
sum += w1[j];
}

// 向量归一化
for (int k = 0; k < N; k++) {
w2[k] = w1[k] / sum;

// 最大差值
d = Math.max(Math.abs(w2[k] - w0[k]), d);

// 用于下次迭代使用
w0[k] = w2[k];
}
}

// 计算矩阵最大特征值lamta,CI,RI
lamta = 0.0;

for (int k = 0; k < N; k++) {
lamta += w1[k] / (N * w0[k]);
}

double CI = (lamta - N) / (N - 1);

if (RI[N - 1] != 0) {
CR = CI / RI[N - 1];
}

// 四舍五入处理
lamta = round(lamta, 3);
CI = round(CI, 3);
CR = round(CR, 3);

for (int i = 0; i < N; i++) {
w0[i] = round(w0[i], 4);
w1[i] = round(w1[i], 4);
w2[i] = round(w2[i], 4);
}
// 控制台打印输出

System.out.println("lamta=" + lamta);
System.out.println("CI=" + CI);
System.out.println("CR=" + CR);

// 控制台打印权重
System.out.println("w0[]=");
for (int i = 0; i < N; i++) {
System.out.print(w0[i] + " ");
}
System.out.println("");

System.out.println("w1[]=");
for (int i = 0; i < N; i++) {
System.out.print(w1[i] + " ");
}
System.out.println("");

System.out.println("w2[]=");
for (int i = 0; i < N; i++) {
weight[i] = w2[i];
System.out.print(w2[i] + " ");
}
System.out.println("");
}

/**
* 四舍五入
*
* @param v
* @param scale
* @return
*/
public double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/**
* 返回随机一致性比率
*
* @return
*/
public double getCR() {
return CR;
}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。