数学建模——层次分析法 学习笔记

it2026-01-11  9

main主函数 clear;clc city=3; factor=[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]; %影响判断结果的因素互相之间的矩阵 scenery=[1 2 5;1/2 1 2;1/5 1/2 1]; %单独的某个影响判断结果的因素的矩阵(eg:景色对三个目标的判断矩阵) spend=[1 1/3 1/8;3 1 1/3;8 3 1]; %花费 location=[1 1 3;1 1 3;1/3 1/3 1]; %居住 diet=[1 3 4;1/3 1 1;1/4 1 1]; %饮食 traffic=[1 1 1/4;1 1 1/4;4 4 1]; %交通 All={factor scenery spend location diet traffic}; w={}; for i=1:length(All) w{i}=dealfile(All{i}); end %访问元胞数组里面某一个矩阵中的某行某列的元素 w{i,j}(m,n) targets=zeros(city,1); for i=1:city targets(i)=round(w{1}(1,1),4)*round(w{2}(i,1),4) + round(w{1}(2,1),4)*round(w{3}(i,1),4)… %所有因素的权值相加比较 +round(w{1}(3,1),4)*round(w{4}(i,1),4)+ round(w{1}(4,1),4)*round(w{5}(i,1),4)… +round(w{1}(5,1),4)*round(w{6}(i,1),4); end [targets_max,targets_city]=max(targets);

%求权重 function w=weight(x_max) x_abs=abs(x_max); %先绝对值化,避免因为正负号的原因相加导致的错误 x_all=sum(x_abs); %做归一化处理 [m n]=size(x_abs); %这里的归一化是每个值除总的和 w=ones(m,n); %这里相当于初始化一个矩阵,方便后面赋值 w=x_abs/x_all; end

%一致性判断求解 function RC=judge(lamda,n) CI=(lamda-n)/(n-1); RI=[1:15;0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; RC=CI/RI(2,n); end

%判断是否是一致性函数 function w=dealfile(matrix) [m,n]=size(matrix); [lamda vector]=charact(matrix); j=judge(lamda,n); if(j>0.1) disp(‘这不是一个一致矩阵,需要对判断矩阵进行修正’);%一致矩阵各列或者各行之间成比例,所以判断矩阵matrix尽量往这个方向靠 else disp(‘这是一个一致矩阵’); w=weight(vector); end end

%求特征值函数 function [y_max x_max]=charact(matrix) [x y]=eig(matrix); %求解特征值和特征向量 x为特征向量 y为特征值的矩阵,形如单位矩阵E y_new=diag(y); %把对角线矩阵重组为一个新的n*1的矩阵 [y_max,n]=max(y_new); %找出最大特征值和最大特征值的行号(是为了对应最大特征向量) x_max=x(:,n); %求解最大特征向量 end

最新回复(0)