FAHP算法C语言实现

层次分析法(Analytic Hierarchy Process,简称AHP)是二十世纪70年代,美国运筹学家T. L. Saaty教授提出的一种决策方法,该方法将定性与定量相结合。目前常被运用于多目标、多准则、多要素、多层次的非结构化的复杂决策问题,尤其是战略决策问题,具有十分广泛的实用性。
它的思想是将复杂问题中个因素分成相互联系的有序层次,运用数学方法分别计算每一层元素的权重,然后通过层次间总排序计算所有元素的权重,每层权重计算过程为根据专家意见和分析者客观判断,构建两两比较的矩阵进行定量表述。 层次分析法具有的优点是清楚呈现各层、各准则与各要素的关系,计算过程简单易懂,但仍具有一定问题,层次分析法在某层的评价指标较多时(如:4个指标及以上), 检验判断矩阵是否一致时将出现困难,且检验判断矩阵具有一致性的标准C.R.<0.1缺乏科学及数理的依据。
模糊层次分析法(fuzzy analytic hierarchy process,简称FAHP)将模糊数学和层次分析法结合起来,引入模糊数据是在层次分析法上的一种改进,能更好地确定层次分析法中的权重问题,FAHP建立的模糊矩阵满足一致性检验,弥补了缺陷。

定义1:设矩阵,若满足0≤≤1,(i=1,2,…,n;j=1,2,…,n),则称F是模糊矩阵。
定义2: 若模糊矩阵 满足,(i=1,2,…,n;j= 1,2,…,n),则称模糊矩阵F是模糊互补矩阵。
定义3:若模糊互补矩阵R=满足:i,j,k,,则称模糊矩阵R是模糊一致矩阵。
FAHP算法实现步骤:
(1) 建立层次结构模型
根据实际情况,需达到的目标、关键指标因素按他们之间的互相关系,可分为目标层、准则层和方案层,形成层次结构模型。
(2)构建模糊互补判断矩阵
使用 FAHP 赋权法的标度原则(表 4-1) ,对每一层两两要素的重要程度进行打分,构建判断矩阵构建模糊互补矩阵,即:
(4-1)
表4-2重要性标度含义
标度 含 义

0.5 两个元素相比,前者与后者具有同等重要性
0.6 两个元素相比,前者比后者稍微重要
0.7 两个元素相比,前者比后者明显重要
0.8 两个元素相比,前者比后者非常重要
0.9 两个元素相比,前者比后者极端重要
0.1-0.4 若元素i与元素j的重要性之比为aij,则元素j与元素i的重要性之比为aji=1-aij
(3)转换模糊一致性矩阵
将模糊判断矩阵F 做一致化处理,构造模糊一致性矩阵:
R= (4-2)
式中,, ,n为各准则层对应措施层个数。
(4)计算单层次权重
对于规整后的模糊一致矩阵, 利用特征根法(幂积法):
①对矩阵R每一行元素进行乘积,即
②计算的n次方根,即 ,对 归一化,得到单层的权重向量。
(4-3)
(5) 计算层次总权重
, (4-4)
其中,为准则层单层权重,为准则层对应措施层单层权重,为准则层对应措施层总权重。

#include<stdio.h>
#include<math.h>
#define N 5

int main(void)
{
    int i,j;     //A1记录模糊互补矩阵每行和,R1记录一致性矩阵每行积
    double R[N][N],A1[N]= {0},R1[N]= {1},W[N],sum =0; //R[][]记录模糊一致性矩阵
    double A[N][N]= {{0.5,	0.78,	0.625,	0.625,	0.5625},
                    {0.22,	0.5,	0.4	,0.4,	0.3215},
                    {0.375,	0.6	,0.5,	0.5,	0.495},
                    {0.375,	0.6,	0.5,	0.5,	0.495},
                    {0.4375,	0.6785,	0.505,	0.505,	0.5}
    };  //模糊互补矩阵
    for(i = 0; i < N; i++)        //A1记录每行的和
    {
        A1[i]
            = 0;
        for(j = 0; j < N; j++)
            A1[i]+=A[i][j];
    }
    for(i = 0; i < N; i++)         //转换成模糊一致性矩
    {
        for(j = 0 ; j < N; j++)
            R[i][j] = (A1[i]-A1[j])/(2*N) + 0.5;
    }
    printf("\n");
    for(i = 0; i < N; i++)     //幂积法求单层权重
    {
        R1[i]
            = 1;
        for(j = 0 ; j < N; j++)
            R1[i] *= R[i][j];    //每行元素进行相乘
        W[i] = pow(R1[i],0.2);      //求n次方根
        sum += W[i];
    }
    for(i = 0; i < N; i++)            //权重归一化
    {
        W[i]
            = W[i]/sum;
        printf("%.4f ",W[i]);
    }
    printf("\n");
    return 0;
}




  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值