4步用代码拆解数学建模中的TOPSIS评价决策! ! !
文章目录
- 步骤一:数据输入
- 步骤二:正向化
- 步骤三:[[标准化处理]]
- 步骤四:[[标准化处理]]
- 步骤四:打分
步骤一:数据输入
导入数据
X = xlsread('工作簿1.xlsx');
步骤二:正向化
三类指标转换为极大型
1. 极小型:数值越小越好1. 极小型转极大型
X(:,vec(i)) = Min2Max(X(:,vec(i)));%极小型转为极大型
[[极小MinMax讲解]]
1. 中间型:越接近某个值越好
1. 中间型转极大型
best = input('请输入中间型的最好值:\n');%用户需要最好的数值temp = X(:,vec(i));X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);
[[中间MidMax讲解]]
1. 区间型:落在某个区间越好
1. 区间型转最大型
1. arr = input('请输入最佳区间,按照“[a,b]”的形式输入:\n');X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));
[[区间Int2Max]]
输入:[[TOPSIS正向化输入]]
步骤三:[[标准化处理]]
- 获取规模
disp('***************正在进行标准化...***************');[n,m] = size(X);
- [[检查负数元素]]
1.
% 检查有没有负数元素isNeg = 0;for i = 1 : nfor j = 1 : mif(X(i,j) < 0)isNeg = 1;break;endendendif (isNeg == 0)%没有负数squere_X = (X.*X);sum_X = sum(squere_X,1).^0.5; %按列求和,再开方stand_X = X./repmat(sum_X, n, 1);elsemax_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));enddisp('标准化完成!')
步骤四:[[标准化处理]]
- 获取规模
disp('***************正在进行标准化...***************');[n,m] = size(X);
- [[检查负数元素]]
1.
% 检查有没有负数元素isNeg = 0;for i = 1 : nfor j = 1 : mif(X(i,j) < 0)isNeg = 1;break;endendendif (isNeg == 0)%没有负数squere_X = (X.*X);sum_X = sum(squere_X,1).^0.5; %按列求和,再开方stand_X = X./repmat(sum_X, n, 1);elsemax_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));enddisp('标准化完成!')
步骤四:打分
- (方法一)用[[距离法]]打分
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)]]
- (方法二)用[[优劣法]]打分(优先级高)
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分钟中有例题(很重要)
补充知识点:
![