前言
看了很多层次分析法的C#实现,很多都是把算法和窗体界面联系到了一起,对单纯的想学习层次分析法的C#实现步骤的人十分不友好,因此本文只介绍了具体的C#实现步骤,不涉及多余的部分。
一、层次分析法的介绍
有关层次分析法的原理和实现步骤,可以参考 https://zhuanlan.zhihu.com/p/118594058.
二、源码
1.主函数
需要安装Accord.Math以及Accord.Statistics程序包,具体安装方法可以参考: https://blog.csdn.net/qq_43517528/article/details/120079973.:
using System;
using Accord.Math;
namespace 层次分析法测试
{
class Program
{
static void Main(string[] args)
{
double[,] data = new double[,] { { 1, 0.5, 0.5, 0.25 ,0.2}, { 2, 1, 0.5, 0.25,0.2 }, { 2, 2, 1, 1 ,0.2}, { 4, 4, 1, 1,0.2 } ,{ 5,5,5,5,1} };
ahp ahp1 = new ahp();//新建一个ahp对象
double[] weight = new double[data.Rows()];
bool result = ahp1.AHP(data, ref weight);
}
}
}
2.AHP函数
代码如下(示例):
using System;
using System.Collections.Generic;
using System.Text;
using Accord.Math;
using Accord.Math.Comparers;
using Accord.Math.Decompositions;
using Accord.Statistics;
using Accord.Statistics.Analysis;
namespace 层次分析法测试
{
class ahp
{
public bool AHP(double[,] data, ref double[] weight)
{
var evd = new EigenvalueDecomposition(data);
double[] eigenvalues = evd.RealEigenvalues;//特征值
double[,] eigenvectors = evd.Eigenvectors;//特征向量
int index = 0;//index为最大特征值的下标
double max = eigenvalues[0];//max中为最大的特征值
for (int i = 0; i < eigenvalues.Length; i++)
{
if (eigenvalues[i] > max)
{
max = eigenvalues[i];
index = i;
}
}
//求权重:最大特征值对应的特征向量做标准化即为权重
double sum = 0;
for (int i = 0; i < eigenvectors.Rows(); i++)
{
sum = sum + eigenvectors[i, index];
}
for (int i = 0; i < eigenvectors.Rows(); i++)
{
weight[i] = eigenvectors[i, index] / sum;
}
//判断是否通过一致性检验
double CI = (max - data.Rows()) / (data.Rows() - 1);
double[] RI = new double[] { 0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51, 1.54, 1.56 };
double CR = CI / RI[data.Rows()];
if (CR < 0.1)
{
return true;
}
else
{
return false;
}
}
}
}
总结
源文件稍后上传。