赞
踩
目录
假定现需要购置一批冰箱,由于市场上冰箱种类参差不齐,其性能及性价比也存在很大差异,现有一批冰箱待选择,请考虑冰箱的容积、功耗、外观、噪声、寿命、价格、保修时间等因素,建立模型,确定性价比最高的购买方案。
量化后冰箱参数:
以冰箱A为基准,若该项性能优于A则其值加1,且每优一级都加1,反之亦然。
容积 | 功耗 | 外观 | 噪声 | 寿命 | 价格 | 保修时间 | |
A | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
B | 6 | 8 | 3 | 8 | 7 | 9 | 7 |
C | 2 | 4 | 8 | 2 | 8 | 5 | 10 |
标度 | 含义 |
---|---|
1 | 两个要素相比,重要性相同 |
3 | 两要素相比,前者比后者稍微重要或有优势 |
5 | 两要素相比,前者比后者比较重要或有优势 |
7 | 两要素相比,前者比后者十分重要或有优势 |
9 | 两要素相比,前者比后者绝对重要或有优势 |
2,4,6,8 | 为上述标度之间的中间值 |
若要描述后者与前者比较,则用倒数为标度。例如 1/3 描述的是,后者比前者稍微重要。
属性 | 容积 | 功耗 | 外观 | 噪声 | 寿命 | 价格 | 保修时间 |
容积 | 1 | 3 | 2 | 1/2 | 1/3 | 1/6 | 1/2 |
功耗 | 1/3 | 1 | 5 | 1 | 1/3 | 1/2 | 1/2 |
外观 | 1/2 | 1/5 | 1 | 1/3 | 1/3 | 1/4 | 1/3 |
噪声 | 2 | 1 | 3 | 1 | 1/3 | 1/3 | 1/3 |
寿命 | 3 | 3 | 3 | 3 | 1 | 1/2 | 1/2 |
价格 | 6 | 2 | 4 | 3 | 1 | 1 | 3 |
保修时间 | 2 | 2 | 3 | 3 | 2 | 1/3 | 1 |
具体的计算方法见推荐阅读的两篇文章。
经过计算得到C.R=0,025<0.1,故一致性检验成功。
得到七种属性的权值如下:
属性 | 容积 | 功耗 | 外观 | 噪声 | 寿命 | 价格 | 保修时间 |
权值 | 0.09 | 0.10 | 0.05 | 0.10 | 0.18 | 0.29 | 0.19 |
属性 | 容积 | 功耗 | 外观 | 噪声 | 寿命 | 价格 | 保修时间 | 评分 |
权值 | 0.09 | 0.10 | 0.05 | 0.10 | 0.18 | 0.29 | 0.19 | |
A | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
B | 6 | 8 | 3 | 8 | 7 | 9 | 7 | 7.49 |
C | 2 | 4 | 8 | 2 | 8 | 5 | 10 | 5.97 |
由此可见评分:B>C>A。故冰箱B对顾客来说性价比最高。
- package AHP;
-
- import java.util.Scanner;
-
- public class AHP {
- public static void main(String[] args) {
- System.out.println("输入矩阵阶数:");
- Scanner scanner = new Scanner(System.in);
- int n = scanner.nextInt();
- System.out.println("按行输入:");
- double d[][] = new double[n][n];
- double temp[][] = new double[n][n];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- double sToD = SToD(scanner.next());
- d[i][j] = sToD;
- temp[i][j] = sToD;
- }
- }
-
- System.out.println("以下是判断矩阵");
- // 得到判断矩阵
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- System.out.printf("%.2f\t", d[i][j]);
- }
- System.out.println();
- }
-
- // 1.对判断矩阵进行求和
- System.out.println("列相加结果w1");
-
- double w1[] = new double[n];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- w1[i] = w1[i] + d[j][i];
- }
- System.out.printf("%.2f\t", w1[i]);
- }
-
- // 2.相除
- System.out.println();
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- d[i][j] = d[i][j] / w1[j];
- }
- }
- System.out.println("和积法第一步求出的结果d(即对列向量归一化):");
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- System.out.printf("%.2f\t", d[i][j]);
- }
- System.out.println();
- }
-
- System.out.println("对第一步求出的结果进行 行相加");
-
- System.out.println("行相加结果w2:");
-
- double w2[] = new double[n];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- w2[i] = w2[i] + d[i][j];
- }
- System.out.printf("\t%.2f\n", w2[i]);
- }
-
- System.out.println("特征向量求解第一步 : 将上面的行相加的所有结果相加sum:");
- double sum = 0.0;
- for (int i = 0; i < n; i++) {
- sum += w2[i];
- }
- System.out.printf("结果为sum = \t%.2f\n", sum);
-
- System.out.println("将行结果与 sum 相除 得出结果为w3: ");
- double w3[] = new double[n];
- for (int i = 0; i < n; i++) {
- w3[i] = w2[i] / sum;
- System.out.printf("\t%.2f\n", w3[i]);
- }
-
- System.out.println();
- System.out.println("************************************************");
- System.out.println("用和积法计算其最大特征向量为(即权重):W = ");
- // 以下是校验
- System.out.printf("(");
- for (int i = 0; i < n; i++) {
- System.out.printf("%.2f ,", w3[i]);
- }
- System.out.printf(")");
-
- System.out.print("\nBW(w4) = ");//BW即行相加结果
- double w4[] = new double[n];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- w4[i] = w4[i] + temp[i][j] * w3[j];
- }
- System.out.printf("%.5f \t", w4[i]);
- }
- System.out.println("\n----------------------------------------");
- double sum2 = 0.0;
- for (int i = 0; i < n; i++) {
- sum2 = sum2 + w4[i];
- }
- System.out.printf("得到最大特征值sum2:\t %.2f\n", sum2);
- System.out.println("************************************************");
- System.out.println("最大的特征向量为 : ");
-
- double result = 0.0;
- for (int i = 0; i < n; i++) {
- result = result + w4[i] / (6 * w3[i]);
- }
- System.out.printf(" %.2f \n", result);
-
- System.out.println("\n判断矩阵一致性指标C.I.(Consistency Index)");
- double CI = (result - n) / (n - 1);
- System.out.printf(" %.2f \n", CI);
-
- System.out.println("随机一致性比率C.R.(Consistency Ratio)");
-
- /*
- *
- n 1 2 3 4 5 6 7 8 9 10 11
- RI 0 0 0.58 0.90 1.12 1.24 1.36 1.41 1.45 1.49 1.51
- 一般,当一致性比率 <0.1 时
- 的不一致程度在容许范围之内,可用其归一化特征向量
- 作为权向量,否则要重新构造成对比较矩阵,对 加
- 以调整
- */
- double RI = 0.0;
- switch (n) {
- case 0:
- RI=0;
- break;
- case 1:
- RI=0;
- break;
- case 2:
- RI=0;
- break;
- case 3:
- RI=0.58;
- break;
- case 4:
- RI=0.90;
- break;
- case 5:
- RI=1.12;
- break;
- case 6:
- RI=1.24;
- break;
- case 7:
- RI=1.36;
- break;
-
- default:
- break;
- }
- double CR=CI / RI;
- if(CR<0.1) {
- System.out.printf("一致性检验成功! C.R = %.2f \n", CR);
- }
- else
- System.out.printf("一致性检验失败! C.R = %.2f \n", CR);
-
-
- scanner.close();
- }
-
- public static double SToD(String s) {
- String[] p = s.split("/");
- if (p.length > 1) {
- return Double.parseDouble(p[0]) / Double.parseDouble(p[1]);
- }
- return Double.parseDouble(s);
- }
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。