%本程序适用于计算物元评价,最好(将各指标换算为统一的增序)
%详细计算过程参见文献:《基于物元分析的土地生态安全评价》
%需要说明的是:目前很多论文中有些数据或计算是有问题的。
%数据采用excel中的交互式定位技术
%要求将原始数据文件存放在Excel中,并将文件命名为wuyuan_data.xls。
%特别提醒,在给Excel文件命名时,避免使用中文字符作为文件名,否则易出错。
%%------------------------------------------------------------------
clear;
clc;
%-------------------------------------------------------------------
%重要变量说明
% R0存放经典域的上下限的所有数据
% x存放一个待评对象n个特征的数据
% w存放权重向量,权重用其它方法获得后直接载入
% n表示特征个数,即评价指标的个数
% m代表评价等级或者类型的个数
% a代表经典域下限矩阵
% b代表经典域上限矩阵
% ap代表节域下限向量
% bp代表节域上限向量
% kp指在考虑指标重要性程度的基础上,待评事物(对象、方案等)各指标关于各类型(或等级)的关联度的组合值
% jstar指级别变量特征值
disp('请在弹出来的Excel表格中指定经典域');
R0=xlsread('C:\\Users\\Administrator\\Desktop\\wuyuan_data2.xls',-1);
disp('请从excel表格中指定待评价物元的数据');
x=xlsread('wuyuan_data2.xls',-1); %读入一个评价单元的一组数据,对应n个特征
disp('请从excel表格中指定各指标的权重');
w=xlsread('wuyuan_data2.xls',-1); %读入权重,权重通过AHP,专家打分等方法给出
[n,mm]=size(R0); %n代表特征个数
m=mm/2; %m代表评价等级个数
a=R0(:,1:2:end); %a代表经典域下限矩阵
b=R0(:,2:2:end); %b代表经典域上限矩阵
ap=min(R0')'; %ap代表节域下限向量
bp=max(R0')'; %bp代表节域上限向量
for i=1:n
for j=1:m
%判断经典域中某区间上下限是否相同
if a(i,j)==b(i,j)
%指标值与区间上下限相同时,距为0
if x(i)==a(i,j)
k(i,j)=0;
else
pp=abs(x(i)-0.5*(ap(i)+bp(i)))-0.5*(bp(i)-ap(i));
k(i,j)=abs(x(i)-a(i,j))/(pp-(abs(x(i)-a(i,j))));
end
else
%指标值落在区间内(含区间端点)时的算法
if (x(i)>=a(i,j) && x(i)<=b(i,j))
p=abs(x(i)-0.5*(a(i,j)+b(i,j)))-0.5*(b(i,j)-a(i,j)); %计算距(点与经典域区间的距)
k(i,j)=-p/abs(b(i,j)-a(i,j)); %计算关联函数(x值在考察区间内)
else
%指标值落在区间外时的算法
p=abs(x(i)-0.5*(a(i,j)+b(i,j)))-0.5*(b(i,j)-a(i,j)); %计算距(点与经典域区间的距)
pp=abs(x(i)-0.5*(ap(i)+bp(i)))-0.5*(bp(i)-ap(i)); %点与节域区间的距离
k(i,j)=p/(pp-p); %计算关联函数(x值不在考察区间内)
end
end
end
end
kp=w*k;
%计算最大的kp值以及对应的类别号
[kpmax,j0]=max(kp);
if kpmax<0
warning('所有的kp值小于0');
end
%计算级别变量特征值
for j=1:m
avkpp(j)=(kp(j)-min(kp))/(max(kp)-min(kp));
end
jup=0;
for j=1:m
jup=jup+j*avkpp(j);
end
jstar=jup/sum(avkpp);
%数据的输出代码,默认路径为MATLAB的work目录,文件名为wuyuan_output.xls
%将kp值输出到wuyuan_output.xls第一页sheet1从单元格A2开始的区域中
string_a='kp值';
xlswrite('wuyuan_output.xls',string_a,1,'A1');
xlswrite('wuyuan_output.xls',kp,1,'A2');
%将j*值输出到wuyuan_output.xls第一页sheet1中单元格为A6的位置
string_b='j*值';
xlswrite('wuyuan_output.xls',string_b,1,'A5');
xlswrite('wuyuan_output.xls',jstar,1,'A6');
%判断被评价对象属于的类别
string_c=['被评价对象属于类别',num2str(j0)];
xlswrite('wuyuan_output.xls',string_c,1,'A8');