clear all;
%==================数据为矩阵,横坐标为属性(最后属性为解决方案),纵坐标为案例
pause on;
FileNameCaseBase=input('请输入手机案例库的数据文件名:','s');
CaseBase=load(FileNameCaseBase);
FileNameNewCase=input('请输入新手机的配置的数据文件名:','s');
NewCase=load(FileNameNewCase); %行向量
FileNameWights=input('请输入手机各属性权重大小的数据文件名:','s');
Wights=load(FileNameWights); %行向量,针对各个属性的权重
[M,N]=size(CaseBase);
%====================将各案例中各属性值归一化,即除以案例库中最大值;权重归一化
wights=Wights/sum(Wights);
for i=1:N-1
newCase(i)=NewCase(i)/max(CaseBase(:,i));
caseBase(:,i)=CaseBase(:,i)/max(CaseBase(:,i));
end
%================================求出案例库中案例与新案例的欧氏距离
for j=1:M
dist(j)=norm(wights.*(caseBase(j,1:N-1)-newCase));
end
%================将得出的距离从小到大排序,Dist为排序后的距离,I为原指标
%================并输出案例库中与新案例距离最小的和距离第二小的案例
[Dist,I]=sort(dist);
disp('新案例到案例库中各案例的距离(从小到大排列):');
Dist
disp('案例库中与新案例距离最小的的案例');
format short g
CaseBase(I(1),:)
disp('案例库中与新案例距离第二小的的案例');
CaseBase(I(2),:)
disp('案例库中与新案例距离第三小的的案例');
CaseBase(I(3),:)
disp('此手机的估计价格:');
E=(CaseBase(I(1),N)+CaseBase(I(2),N)+CaseBase(I(3),N))/3 %推荐解决方案为最小和第二小的平均
%=======================================将所得推荐解决方案加到新案例的最后一列
% fid = fopen(FileNameNewCase, 'a');
% fprintf(fid,'%0.2f\t',E);
% fclose(fid);
%================================若新案例与案例库中的所有案例相差都较大,具有代表性,则加入案例库(最后一行)
if Dist(1)>0.1
NewCase=[NewCase E];
fid = fopen(FileNameCaseBase, 'a');
fprintf(fid,'%','\r\n');
fprintf(fid,'%0.2f\t',NewCase');
fclose(fid);
end
评论2