⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mohu.m

📁 一个非常实用且能进行模糊综合评判的matlab程序
💻 M
字号:


%--------------------------------------------------------------------------
%  
%  %mohu.m
%本程序为模糊综合评判的程序,人为给定权重
%程序运行,直接输入命令mohu即可
%本程序可以进行扩展
%对于进行二级模糊综合评判,可编制mohufun.m函数来实现
%如[yy1,qdh,qdh1]=mohufun(R,L,M,w,XX,yy]来实现运行两次这个函数,并编制相应的m文件,其中放至两个这样的函数即可实
%现
%模糊评判的结果说明:
%1:对于所有等级的隶属度之和为1。
%2:输出结果随某个变量的增大而qdh1的结果呈现出单调递增或递减
%3:最后的等级出[0.2 0 0 0.8]这种情况是正常的,和可拓评判中的对于等级的距离的概念是不一样的。
%只表现有变量是属于0.2这个等级的。
%--------------------------------------------------------------------------

clc
clear all
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%此部分由计算时,人为给定部分,即相关求解条件
%要求计算前输入部分
R=4;  %影响因素的个数
L=4;  %评判的等级个数
M=29; %待评价洞段的个数
w=[0.1 0.7 0.1 0.1];%各指标的权重
%可拓评判的经典域,每天列构成一组,共有L组,由左到右依此为1,2,3,4
%评判结果为1,则表示属于最左边的经典域,为4则属于最右边的经典域
%XX为隶属函数的范围,具体可参见论文基于粗集的模糊综合评判,一个有四个隶属函数
%前两个数,确定是一个下降段的隶属函数,分成三段
%以后依此4上数为一组,确定一个梯形的隶属函数,分成五段
%最后两个是单独一组,为一个上升段的隶属函数分成三段
%下面的每行有12个数,其分成4个等级,分办界点数个2 4 4 2 之和为12
%也就是构成四个等级范围
%XX也是计算的核心数据
xx=[70	90	70	90	110	130	110	130	170	190	170	190
   45	35	45	35	30	20	30	20	17	10	17	10
  1.5	2.5	1.5	2.5	3	4	3	4	4.5	5.5	4.5	5.5
0.25	0.35	0.25	0.35	0.45	0.55	0.45	0.55	0.65	0.75	0.65	0.75];

%pp1为个指标为越大,等级越高,还是越大,等级越小的指标
%0为指标值越大,等级越大
%1为指标值越大,等级越小
%这一点要严格执行,XX(i,:),从小到大为0,XX(i,:)从大到小为1,
%若将以上的XX第行的顺序颠倒,则为pp1=[1 0 1 1 ]
pp1=[0 1 0 0];
%各待评价洞段参数
yy=[200	8	6	0.8
200	9.5	6	0.8
200	11	6	0.8
200	12.5	6	0.8
200	14	6	0.8
200	15.5	6	0.8
200	17	6	0.8
200	18.5	6	0.8
200	20	6	0.8
200	21.5	6	0.8
200	23	6	0.8
200	24.5	6	0.8
200	26	6	0.8
200	27.5	6	0.8
200	29	6	0.8
200	30.5	6	0.8
200	32	6	0.8
200	33.5	6	0.8
200	35	6	0.8
200	36.5	6	0.8
200	38	6	0.8
200	39.5	6	0.8
200	41	6	0.8
200	42.5	6	0.8
200	44	6	0.8
200	45.5	6	0.8
200	47	6	0.8
200	48.5	6	0.8
200	50	6	0.8
];
%下升段和下降段的隶属函数形式
%注意隶属函数的形式和论文中的隶属函数形式也要一样,否则要更改程序中的基些部分
%这里的a指区间的中间点,b指区间的宽度
f1=inline('0.5-0.5*sin((x-a)*pi/b)','a','b','x');
f2=inline('0.5+0.5*sin((x-a)*pi/b)','a','b','x');




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%
%求每个指标对于第一个等级的隶属度
for i=1:M,
    for k=1:R,
        j=1;
   if pp1(k)==0     %先是求越大,等级越高的指标    
if yy(i,k)<xx(k,j)
    yy1(i,k,j)=1;
elseif yy(i,k)<=xx(k,j+1)
    yy1(i,k,j)=f1(0.5*(xx(k,j)+xx(k,j+1)),abs(xx(k,j)-xx(k,j+1)),yy(i,k)) ;
else yy1(i,k,j)=0;
end
%再是求值越小,等级越高的指标
%下在和一个相比大于和小于要互换,函数f1和f2也要互换
   elseif yy(i,k)>xx(k,j)
    yy1(i,k,j)=1;
elseif yy(i,k)>=xx(k,j+1)
    yy1(i,k,j)=f2(0.5*(xx(k,j)+xx(k,j+1)),abs(xx(k,j)-xx(k,j+1)),yy(i,k));  
else yy1(i,k,j)=0;
end

        end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%求每个指标对于最后一个等级的隶属度
 for i=1:M,
    for k=1:R,
        j=L;
        if pp1(k)==0       %先是求越大,等级越高的指标 
if yy(i,k)<xx(k,j*4-5)
    yy1(i,k,j)=0;
elseif yy(i,k)<=xx(k,j*4-4)
    yy1(i,k,j)=f2(0.5*(xx(k,j*4-5)+xx(k,j*4-4)),abs(xx(k,j*4-5)-xx(k,j*4-4)),yy(i,k));  
else yy1(i,k,j)=1;
end

%再是求值越小,等级越高的指标
%下在和一个相比大于和小于要互换,函数f1和f2也要互换
elseif yy(i,k)>xx(k,j*4-5)
    yy1(i,k,j)=0;
elseif yy(i,k)>=xx(k,j*4-4)
    yy1(i,k,j)=f1(0.5*(xx(k,j*4-5)+xx(k,j*4-4)),abs(xx(k,j*4-5)-xx(k,j*4-4)),yy(i,k)) ; 
else yy1(i,k,j)=1;
end


        end
 end   
    
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%求每个指标对于中间几个等级的隶属度
 
 for i=1:M,
    for k=1:R,
        for j=2:L-1;
            
         if pp1(k)==0     %先是求越大,等级越高的指标 
if yy(i,k)<xx(k,j*4-5)
    yy1(i,k,j)=0;
elseif yy(i,k)<=xx(k,j*4-4)
    yy1(i,k,j)=f2(0.5*(xx(k,j*4-5)+xx(k,j*4-4)),abs(xx(k,j*4-5)-xx(k,j*4-4)),yy(i,k));  
elseif yy(i,k)<=xx(k,j*4-3)
    yy1(i,k,j)=1;
elseif yy(i,k)<=xx(k,j*4-2)
    yy1(i,k,j)=f1(0.5*(xx(k,j*4-3)+xx(k,j*4-2)),abs(xx(k,j*4-3)-xx(k,j*4-2)),yy(i,k)) ; 
    
  else yy1(i,k,j)=0;
end
        %再是求值越小,等级越高的指标
%下在和一个相比大于和小于要互换,函数f1和f2也要互换
      elseif yy(i,k)>xx(k,j*4-5)
    yy1(i,k,j)=0;
elseif yy(i,k)>=xx(k,j*4-4)
    yy1(i,k,j)=f1(0.5*(xx(k,j*4-5)+xx(k,j*4-4)),abs(xx(k,j*4-5)-xx(k,j*4-4)),yy(i,k));
elseif yy(i,k)>=xx(k,j*4-3)
    yy1(i,k,j)=1;
elseif yy(i,k)>=xx(k,j*4-2)
    yy1(i,k,j)=f2(0.5*(xx(k,j*4-3)+xx(k,j*4-2)),abs(xx(k,j*4-3)-xx(k,j*4-2)),yy(i,k)) ;
    
else yy1(i,k,j)=0;
end      
            
            
        end
        
        
        end
end
 
 % %相乘计算,隶属度乘权重各洞段对每一等级的隶属度,取最大值
 %dot函数为内积函数,为两向量各对应分量相等后再求和
for i=1:M,
   for j=1:L,
       
            
            qdh(i,j)=dot(yy1(i,:,j),w);
            
       
    end
end
%隶属度乘等级值,确定级别
 for i=1:M,
   for j=1:L,
       
            
            qdh1(i)=dot(qdh(i,:),[1:L]);
            
       
    end
end
 

% %结果输入:yy1为各指标对于各等级的隶属度
% %qdh为评价结果,取最大的,属于哪一个等级
% qdh1,等级值
%问题从qdh1的输出值,怎么样来判定是几类??????????
qdh
qdh1'

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -