logo资料库

模糊综合评价matlab实现.docx

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
附录 2、各章节中编程计算的 MatLab 程序 2.1 模糊综合评判计算程序 模糊综合评判的过程: ○1 、灰色关联分析,求权重(程序见 Relation); ○2 、模糊聚类分析,划分等级(程序见 F_class); ○3 、隶属度计算,求隶属函数(程序见 Subjection 和 subject); ○4 、模糊综合评判,计算各单元等级(程序见 F_judge)。 各步骤的程序如下: X_t=fscanf(fid,'%g',[n m]); % 从数据文件读入数据。 (1)Relation:灰色关联分析程序 主程序: % 灰色关联分析:--母序列必须置为第一行!即 x(1,:) clear; sq={'母指标','断层分维值','隔水层厚度','太会含水层水压','开采深度'}; m=5;n=81; fid=fopen('data1_no E_ZH.dat','r'); fclose(fid); x=X_t'; for i=1:m end for i=1:m-1 end max=DT(1,1);min=DT(1,1); for i=1:m-1 for j=1:n DT(i,:)=abs(D(1,:)-D(i+1,:)); D(i,:)=initia_MAX(x(i,:),n); if maxDT(i,j) min=DT(i,j); end end end yita=0.5; for i=1:m-1 gama_t(i)=0; for j=1:n end xigma(i,j)=(min+yita*max)/(abs(DT(i,j))+yita*max); gama_t(i)=gama_t(i)+xigma(i,j); end gama(1)=1.0; % 母序列对自己的关联度总是为 1。 disp(strcat(sq(1),'-to-',sq(1))),disp(gama(1)) for i=1:m-1
gama(i+1)=gama_t(i)/n; disp(strcat(sq(i+1),'-to-',sq(1))),disp(gama(i+1)) end disp('归一化处理如下:') gama_all=0; for i=1:m end for i=1:m gama_all=gama_all+gama(i); weight(i)=gama(i)/gama_all; disp(sq(i)),disp(weight(i)) end 子程序:initia_MAX(X,n) function X1=initia_MAX(X,n) % 初始化,亦即无量纲化,对地质数据,采用最大值化为宜。 max=X(1); for i=1:n if max
c=input('Input the value of c;'); for i=1:n for j=1:n d_all=0; for k=1:m end r(i,j)=1-c*d_all; d_all=d_all+abs(X(i,k)-X(j,k)); end end if r>zeros(n,n) end otherwise tr0=1; end disp('You input the wrong value!'); disp('OK!');break; r_t=rr; disp('NOT OK! Cycle times is:');disp(i); nmta=input('Input the value of nmta: '); for i=1:n end disp(r); r_t=r; for i=1:1000 rr=multiply_F(r_t,r_t); if rr==r_t else end end disp(rr); tr='y'; while tr=='Y'|tr=='y' for j=1:n if rr(i,j)>=nmta else end R(i,j)=1; R(i,j)=0; end end disp(R); for i=1:n k=1; for j=i:n if R(i,j)==1 C_t(k)=j; k=k+1; end end C{i}=C_t; disp(C{i}); clear C_t; end tr=input('Are you go on ? (Y/N)','s');
end n_class=n; for i=n:-1:1 for j=i-1:-1:1 end end end end x=C{i};y=C{j}; for k=1:length(C{j}) if x(l)==y(k) for l=1:length(C{i}) C{i}=[0]; n_class=n_class-1; continue; disp(C{i}); F=[ 7.5 15.0 22.5 30.0 37.5 45.0 52.5 60.0 67.5 75.0; end disp('The number of classes is:');disp(n_class); disp('They are as follow:'); for i=1:n end (3)Subjection:隶属函数计算程序(配合子程序 sugject) 主程序: % 建立隶属函数--即某单元(i)在某项指标上(Ui)对某评语等级(Vj)的隶属度(Rij)。 clear; M=[0.002 0.004 0.006 0.008 0.010 0.012 0.014 0.016 0.018 0.020; 0.024 0.028 0.032 0.036 0.040 0.044 0.048 0.052 0.056 0.060; 0.066 0.072 0.078 0.084 0.090 0.096 0.102 0.108 0.114 0.120; 0.126 0.132 0.138 0.144 0.150 0.156 0.162 0.168 0.174 0.180]; 82.5 90.0 97.5 105.0 112.5 120.0 127.5 135.0 142.5 150.0; 175.0 200.0 225.0 250.0 275.0 300.0 325.0 350.0 375.0 400.0; 440.0 480.0 520.0 560.0 600.0 640.0 680.0 720.0 760.0 800.0]; Q=[0.25 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50; 3.25 4.00 4.75 5.50 6.25 7.00 7.75 8.50 9.25 10.0; 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0; 30.0 40.0 50.0 60.0 70.0 80.0 90.0 100. 110. 120.]; A=[ 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0; 5.3 5.6 5.9 6.2 6.5 6.8 7.1 7.4 7.7 8.0; 8.4 8.8 9.2 9.6 10.0 10.4 10.8 11.2 11.6 12.0; 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0]; R=[0.025 0.050 0.075 0.100 0.125 0.150 0.175 0.200 0.225 0.250; 0.265 0.280 0.295 0.310 0.325 0.340 0.355 0.370 0.385 0.400; 0.420 0.440 0.460 0.480 0.500 0.520 0.540 0.560 0.580 0.600; 0.620 0.640 0.660 0.680 0.700 0.720 0.740 0.760 0.780 0.800]; D=[0.20 0.40 0.60 0.80 1.00 1.20 1.40 1.60 1.80 2.00; 2.20 2.40 2.60 2.80 3.00 3.20 3.40 3.60 3.80 4.00; 4.40 4.80 5.20 5.60 6.00 6.40 6.80 7.20 7.60 8.00; 8.40 8.80 9.20 9.60 10.0 10.4 10.8 11.2 11.6 12.0]; H=[ 6 12 18 24 30 36 42 48 54 60; 64 68 72 76 80 84 88 92 96 100; 105 110 115 120 125 130 135 140 145 150; 155 160 165 170 175 180 185 190 195 200]; S=[0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10; 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 0.19 0.20;
0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30; 0.32 0.34 0.36 0.38 0.40 0.42 0.44 0.46 0.48 0.50]; fid=fopen('subjec_dat.dat','r'); A_t=fscanf(fid,'%g',[8 34]); % 从数据文件读入数据。 fclose(fid); A=A_t'; % 各单元(行数)的各项指标(列数)统计结果(矩阵) % 注:34 个单元,每个单元 8 项指标,每个指标 4 个评语等级,故要生成 34 个 8×4 矩阵。 m0=4; % 评语集的维数; m=34;n=8; % 指标集的维数,m-单元个数,n-指标个数; for j=1:n % 第一循环开始 switch j case 1 case 2 case 3 case 4 case 5 case 6 case 7 case 8 otherwise disp('指标个数 > 8 ----修改程序!'); X_T=M;ver=0; % 指标值为升序时 ver=0,降序时 ver=1,下同! X_T=F;ver=0; X_T=Q;ver=0; X_T=A;ver=0; X_T=R;ver=0; X_T=D;ver=0; X_T=H;ver=0; X_T=S;ver=0; end for i=1:m % 第二循环开始 for k=1:m0 % 第三循环开始 X=[A(i,j),X_T(k,:)]; switch ver case 0 chs=1; if k==1 else if k==m chs=3; chs=2; else end end case 1 if k==1 else if k==m chs=1; chs=2; chs=3; else end end end R_T=subject(X,length(X),chs); R(j,k,i)=R_T(1); end % 第三循环结束
end % 第二循环结束 clear X_T; end % 第一循环结束 % 归一化处理: clear R_T; R_T=R; clear R; for i=1:m for j=1:n all=0; for k=1:m0 end for k=1:m0 end end all=all+R_T(j,k,i); R(j,k,i)=R_T(j,k,i)/all; end % 输出到文件...... fid=fopen('subjec_ans.dat','w'); fprintf(fid,'\n'); for i=1:m fprintf(fid,'\n%s%d%s\n','R(',i,')'); for j=1:n end,fprintf(fid,'\n'); fprintf(fid,'%6.4f %6.4f %6.4f %6.4f\n',R(j,:,i)); end fclose(fid); disp('各单元的指标对应各评语等级的隶属度'); disp(R); 子程序:subject function r=subject(x,n,choice) % 建立隶属函数--即某单元(i)在某项指标上(Ui)对某评语等级(Vj)的隶属度(Rij)。 x_all=0; for i=1:n end x_ave=x_all/n; dt_a=0; for i=1:n end dt2=dt_a/(n-1); % disp('Input the value of choice:'); % choice=input('1-偏小型 2-中间型 3-偏大型 '); switch choice dt_a=dt_a+(x(i)-x_ave)^2; x_all=x_all+x(i); case 1 for i=1:n end case 2 if x(i)<=x_ave else end r(i)=1; r(i)=exp(-(x(i)-x_ave)^2/dt2);
r(i)=exp(-(x(i)-x_ave)^2/dt2); r(i)=1; r(i)=exp(-(x(i)-x_ave)^2/dt2); for i=1:n end case 3 for i=1:n if x(i)>=x_ave else end otherwise end disp('The value of "choice" is wrong !'); end (4)F_judge:模糊综合评判程序 % 模糊评判--矩阵相乘 clear A=[0.153 0.160 0.151 0.094 0.088 0.117 0.096 0.141]; % 权重集(矩阵) m0=4;n=8; % 评价矩阵维数,m0-评语集的维数,n-指标个数; m=34; % 单元个数; fid=fopen('subjec_ans.dat','r'); for i=1:m B{i}=A*R{i}; Tmp=fscanf(fid,'%s',1); R_t=fscanf(fid,'%g',[m0 n]); % 从数据文件读入数据。 R{i}=R_t'; end fclose(fid); for i=1:m end fid=fopen('F_judge_ans.dat','w'); fprintf(fid,'%s\n','The answers:'); fprintf(fid,'%s\n',' Ⅰ Ⅱ fprintf('%s\n','The answers:'); fprintf('%s\n',' Ⅱ for i=1:m disp(B{i}); fprintf(fid,'%6.4f %6.4f %6.4f %6.4f\n',B{i}); Ⅲ Ⅲ Ⅳ'); Ⅳ'); Ⅰ end fclose(fid);
分享到:
收藏