AHP算法--java版

一个自己写的AHP简单算法,其实就是一些循环计算而已,记录下来,以后或许会用到:

首先了解下什么是AHP

层次分析法(Analytic Hierarchy Process,简称AHP)是美国运筹学家、匹兹堡大学T. L. Saaty教授在20世纪70年代初期提出的,
AHP是对定性问题进行定量分析的一种简便、灵活而又实用的多准则决策方法。它的特点是把复杂问题中的各种因素通过划分为相互联系的有序层次,使之条理化,根据对一定客观现实的主观判断结构(主要是两两比较)把专家意见和分析者的客观判断结果直接而有效地结合起来,将一层次元素两两比较的重要性进行定量描述。而后,利用数学方法计算反映每一层次元素的相对重要性次序的权值,通过所有层次之间的总排序计算所有元素的相对权重并进行排序。该方法自1982年被介绍到我国以来,以其定性分析定量分析相结合地处理各种决策因素的特点,以及其系统灵活简洁的优点,迅速地在我国社会经济各个领域内,如能源系统分析、城市规划、经济管理、科研评价等,得到了广泛的重视和应用。

以下是简单实现,包含一致性判断

import java.util.Scanner;

public class AHP {

	/*
1	2	3
1/2	1	2/3
1/3	3/2	1

	 *
6
1  1  1  4  1  1/2
1  1  2  4  1  1/2
1  1/2  1  5  3  1/2
1/4  1/4  1/5  1  1/3  1/3
1  1  1/3  3  1  1
2  2  2  3  1  1
	 */
	public static void main(String[] args) {
		System.out.println();
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		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("列相加结果");

		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("和积法第一步求出的结果");
		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("行相加结果");

		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("特征向量求解第一步 : 将上面的行相加的所有结果相加:");
		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 相除 得出结果为 :  ");
		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("用和积法计算其最大特征向量为:W = ");
		// 以下是校验
		System.out.printf("(");
		for (int i = 0; i < n; i++) {
			System.out.printf("%.2f ,", w3[i]);
		}
		System.out.printf(")");

		System.out.println("\nBW = ");
		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("%.3f \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("最大的特征向量为 :  ");

		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.32  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.32;
			break;

		default:
			break;
		}
		System.out.printf("C.R =  %.2f \n", CI / RI);

		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);
	}
}

这个题目是因为自己有个作业需要用到,为了避免每次都进行大量的运算,特此写了个程序来实现,有需要的同学自己复制代码进行计算(⊙o⊙)哦。

时间: 2024-10-10 04:59:43

AHP算法--java版的相关文章

MapReduce原理——PageRank算法Java版

Page Rank就是MapReduce的来源,下文是一个简单的计算PageRank的示例. import java.text.DecimalFormat; /**  * Created by jinsong.sun on 2014/7/15.  */ public class PageRankCaculator {     public static void main(String[] args) {         double[][] g = calcG(genS(), 0.85);  

扎金花大小比较算法(Java版)

注:以下算法说明仅限一副牌(不包含大小王)的情况 1.扎金花规则说明(大家都懂的,这里做简单描述): 1)玩家每人3张牌: 2)牌面大小2.3.4.5.6.7.8.9.10(用T表示),J.Q.K.A,大小依次递增: 3)牌的花色有黑桃(用H表示).红心(用X表示).梅花(用M表示).方块(用F表示),大小依次递减: 4)牌有豹子(3张牌数字大小相同).同花顺.同花(此种未实现,有兴趣的玩家可以自己加上,或者欢迎和我交流).顺子.对子.散牌几种类型,大小依次递减: 5)玩家先比牌的类型,如先按照

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

A*(也叫A star, A星)寻路算法Java版

寻路算法有很多种,A*寻路算法被公认为最好的寻路算法. 首先要理解什么是A*寻路算法,可以参考这三篇文章: http://www.gamedev.net/page/resources/_/technical/artificial-intelligence/a-pathfinding-for-beginners-r2003(英文) http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html(中文) http://www.cnblog

数据结构和算法(Java版)

主要内容:(内容来自互联网以及李刚著作的<突破程序员基本功的16课>) 1.数据结构:线性表.栈.队列.树&二叉树 2.算法:常用内部排序(选择.插入.交换.归并) 目录: 1. 线性表(顺序存储.链式存储单链表.双向链表)-------------2014/10/15 2. 栈(顺序栈.链栈)                                        -------------2014/10/15 线性表(顺序存储.链式存储):一对一松耦合关系.(List就是线性

snowflake算法(java版)

 转自:http://www.cnblogs.com/haoxinyue/p/5208136.html 1. 数据库自增长序列或字段 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2)数字ID天然排序,对分页或者需要排序的结果很有帮助. 缺点: 1)不同数据库语法和实现不同,数据库迁移的时候或多数据库版本支持的时候需要处理. 2)在单个数据库或读写分离或一主多从的情况下,只有一个主库可以生成.有单点故障的风险. 3)在性能达不到要求的情况下,比较难于扩展.

常见的排序算法--java版

个人总结的常见的排序算法 public class Sort { // 1.冒泡:稳定,最优O(n) 最差O(n^2) 平均O(n^2) private static void sort1(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = ar

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪

微博URL短网址生成算法原理及(java版、php版实现实例)

短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更容易的分享链接. 例如:http://t.cn/SzjPjA 短网址服务,可能很多朋友都已经不再陌生,现在大部分微博.手机邮件提醒等地方已经有很多应用模式了,并占据了一定的市场.估计很多朋友现在也正在使用. 看过新浪的短连接服务,发现后面主要有6个字符串组成,于是第一个