4步用代码拆解数学建模中的TOPSIS评价决策! ! !

文章目录

步骤一:数据输入

导入数据

复制代码
X = xlsread('工作簿1.xlsx');

步骤二:正向化

三类指标转换为极大型

复制代码
1. 极小型:数值越小越好
	1. 极小型转极大型

			X(:,vec(i)) = Min2Max(X(:,vec(i)));
			   %极小型转为极大型

\[极小MinMax讲解\]

  1. 中间型:越接近某个值越好

  2. 中间型转极大型

    复制代码
     best = input('请输入中间型的最好值:\n');%用户需要最好的数值
     
     temp = X(:,vec(i));
    
     X(:,vec(i)) = Mid2Max(X(:,vec(i)), best);

\[中间MidMax讲解\]

  1. 区间型:落在某个区间越好

  2. 区间型转最大型

    复制代码
     	1. arr = input('请输入最佳区间,按照"[a,b]"的形式输入:\n');

    X(:,vec(i)) = Int2Max(X(:,vec(i)), arr(1), arr(2));

\[区间Int2Max\]

输入:[[TOPSIS正向化输入]]

步骤三:[[标准化处理]]

  1. 获取规模

    复制代码
     	disp('***************正在进行标准化...***************');

    [n,m] = size(X);

  2. \[检查负数元素\]

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('***************正在进行标准化...***************');

    [n,m] = size(X);

  2. \[检查负数元素\]

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. (方法一)用[[距离法]]打分

    复制代码
     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. (方法二)用[[优劣法]]打分(优先级高)

    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分钟中有例题(很重要)

补充知识点:

![