层次分析法的C#实现


前言

看了很多层次分析法的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; 
            }
        }
    }
}


总结

源文件稍后上传。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值