旅游地选择的层次分析法Matlab代码实现

问题:目前有三个旅游地可供选择:苏杭、北戴河、桂林。考虑的指标有景色、费用、居住、饮食、旅途,试用层次分析法给出选择方案。   

注:自定义的三个函数(ConsistencyCheck、getVector、RI)在代码段末尾。

欢迎交流!

%一个准则层的AHP方法
%-----------------------------------------------------------------
%判断矩阵A
A = [
    1   1/2 4   3   3;
    2   1   7   5   5;
    1/4 1/7 1   1/2 1/3;
    1/3 1/5 2   1   1;
    1/3 1/5 3   1   1
];
%方案层对准则层不同指标的评价
A1 = [1 2 5;1/2 1 2;1/5 1/2 1];
A2 = [1 1/3 1/8;3 1 1/3;8 3 1];
A3 = [1 1 3;1 1 3;1/3 1/3 1];
A4 = [1 3 4;1/3 1 1;1/4 1 1];
A5 = [1 1 1/4;1 1 1/4;4 4 1];
%-----------------------------------------------------------------
%层次单排序&一致性检验
Ra = ConsistencyCheck(A);
Ra1 = ConsistencyCheck(A1);
Ra2 = ConsistencyCheck(A2);
Ra3 = ConsistencyCheck(A3);
Ra4 = ConsistencyCheck(A4);
Ra5 = ConsistencyCheck(A5);
Single_List = [Ra,Ra1,Ra2,Ra3,Ra4,Ra5];%单排序检验列表
flag = 1;
for i = 1:6
    if Single_List(i)>=0.1
        disp(["未通过一致性检验,NO.",num2str(i)]);
        flag = 0;
    end
end
if flag
    disp('全部通过单层次一致性检验');
end
%-----------------------------------------------------------------
%求权重向量
Wa = getVector(A);
WB = [getVector(A1) getVector(A2) getVector(A3) getVector(A4) getVector(A5)];
%-----------------------------------------------------------------
%层次总排序&一致性检验
Final_ListCI = [Ra1,Ra2,Ra3,Ra4,Ra5];
Final_ListRI = [RI(length(A1)),RI(length(A2)),RI(length(A3)),RI(length(A4)),RI(length(A5))];
CR = (Final_ListCI*Wa)/(Final_ListRI*Wa);
disp(['CR=',num2str(CR)]);
if CR<0.1
    disp('通过总层次一致性检验');
else
    disp('未通过总层次一致性检验');
end
Score = WB*Wa;
%-----------------------------------------------------------------
%给出结果
disp('打分如下:')
disp(Score);
index = find(Score==max(Score));
disp(['选择方案:',num2str(index)]);
clear
%-----------------------------------------------------------------
%functions

%计算一致性检验比率
function rate = ConsistencyCheck(A)
    max_lamda = max(eig(A));%求最大特征值
    n = length(A);      %A的维数
    CI = (max_lamda-n)/(n-1);%一致性指标
    rate = CI/(RI(n));      %一致性比率
end

%计算权重向量
function Vector = getVector(A)
%使用算术平均法求权重
    v = transpose(sum(transpose(A)));
    Vector = v./sum(v);
end

%计算RI
function RI=RI(n) 
    N=1000;
    scaler=[9 8 7 6 5 4 3 2 1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9];
    A=eye(n);
    %存放特征值
    lamda=zeros(N,1);
    %   产生times组随机正互反矩阵
    for num=1:N
        rank=ceil(17*rand(n));%指标矩阵
        %   产生一组n阶正互反矩阵
        for i=1:n-1
            for j=i+1:n
                A(i,j)=scaler(rank(i,j));
                A(j,i)=1/A(i,j);
            end
        end
        lamda(num)=max(eig(A)); %求最大特征值
    end
    RI=(sum(lamda)/N-n)/(n-1);%求RI的值
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值