文章目录
步骤一:数据输入
导入数据
X = xlsread('工作簿1.xlsx');
步骤二:正向化
三类指标转换为极大型
1. 极小型:数值越小越好
1. 极小型转极大型
X(:,vec(i)) = Min2Max(X(:,vec(i)));
%极小型转为极大型
\[极小MinMax讲解\]
-
中间型:越接近某个值越好
-
中间型转极大型
best = input('请输入中间型的最好值:\n');%用户需要最好的数值 temp = X(:,vec(i)); X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
\[中间MidMax讲解\]
-
区间型:落在某个区间越好
-
区间型转最大型
1. arr = input('请输入最佳区间,按照"[a,b]"的形式输入:\n');
X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
\[区间Int2Max\]
输入:[[TOPSIS正向化输入]]
步骤三:[[标准化处理]]
-
获取规模
disp('***************正在进行标准化...***************');
[n,m] = size(X);
-
\[检查负数元素\]
bash
% 检查有没有负数元素
isNeg = 0;
for i = 1 : n
for j = 1 : m
if(X(i,j) < 0)
isNeg = 1;
break;
end
end
end
if (isNeg == 0)%没有负数
squere_X = (X.*X);
sum_X = sum(squere_X,1).^0.5; %按列求和,再开方
stand_X = X./repmat(sum_X, n, 1);
else
max_X = max(X,[],1); %按照列找出最大元素
min_X = min(X,[],1); %按照列找出最小元素
stand_X = X - repmat(min_X,n,1) ./ (repmat(max_X,n,1) - repmat(min_X,n,1));
end
disp('标准化完成!')
步骤四:[[标准化处理]]
-
获取规模
disp('***************正在进行标准化...***************');
[n,m] = size(X);
-
\[检查负数元素\]
bash
% 检查有没有负数元素
isNeg = 0;
for i = 1 : n
for j = 1 : m
if(X(i,j) < 0)
isNeg = 1;
break;
end
end
end
if (isNeg == 0)%没有负数
squere_X = (X.*X);
sum_X = sum(squere_X,1).^0.5; %按列求和,再开方
stand_X = X./repmat(sum_X, n, 1);
else
max_X = max(X,[],1); %按照列找出最大元素
min_X = min(X,[],1); %按照列找出最小元素
stand_X = X - repmat(min_X,n,1) ./ (repmat(max_X,n,1) - repmat(min_X,n,1));
end
disp('标准化完成!')
步骤四:打分
-
(方法一)用[[距离法]]打分
1. disp('***************正在用距离法打分...***************');
max_x = max(stand_X,[], 1) %按照列找出最大元素
min_x = min(stand_X,[], 1) %按照列找出最小元素
(stand_X - repmat(min_x,n,1)) ./ (max_x - min_x)%距离法公式
【】的作用: [[max(stand_X,[], 1)]]
-
(方法二)用[[优劣法]]打分(优先级高)
- disp('正在用优劣解打分...');
tmp = ones(m);% 这个矩阵很有用,要掌握哦tmp=ones(n):生成n行n列的1
默认权值
w_j = tmp(:,1);%tmp的第一列作为默认权值
是否需要指定权值
is_need_w = input('是否需要指定权值,如需要请输入1,否则请输入0:\n');
if (is_need_w == 1)
w_j = input('请按列输入各指标的权值:(如[0.1;0.2;0.3;0.4])')
end
-
过程变量求解
%最大向量Z+(成矩阵为了方便相减)
Z_plus = repmat(max_x,n,1);%最小向量Z-
Z_sub = repmat(min_x,n,1);%每个指标相当于最大值的距离D+
D_plus = sum(((stand_X - Z_plus).^2) * w_j, 2).^0.5 %注意是按行求和%每个指标相当于最小值的距离D-
D_sub = sum(((stand_X - Z_sub)).^2 * w_j, 2).^0.5
数学化公式
S = D_sub ./ (D_sub + D_plus)
【大师兄数学建模】第5讲 Topsis上机篇_哔哩哔哩_bilibili14分钟中有例题(很重要)
补充知识点:
![