首页 > 编程知识 正文

优劣解距离法,优劣解距离法的优化

时间:2023-05-03 16:05:39 阅读:205206 作者:422

数学建模二:TOPSIS法(优劣解距离法)附代码详解

TOPSIS法(优劣解距离法)用于评价类问题。

层次分析法因为受限于一致性检验指标的数量,最多只能选择15个准则或方案。同时层次分析法也难以处理已经存在评价数据的问题。而TOPSIS法(优劣解距离法)则没有这些问题。

TOPSIS法(优劣解距离法)步骤:
1.原始矩阵正向化。
2.正向化矩阵标准化。
3.计算得分并归一化。

例:评价下表中20条河流的水质情况。
注:含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。

1.原始矩阵正向化。
最常见的指标类型:

原始矩阵正向化就是将所有指标都转化为极大型指标。并且转化函数不唯一,可以根据数据进行适当的修改。

极小型指标转化公式:

max - x (如果x均大于零,可以用1/x)

中间型指标转化公式:

区间型指标转化公式:


代码涉及函数应用,具体代码见完整代码。

2.正向化矩阵标准化。

标准化的目的是消除不同指标量纲的影响。同时标准化的方法有很多种,其主要目的就是去除量纲的影响,未来我们还可能见到更多种的标准化方法,例如:(x‐x的均值)/x的标准差;具体选用哪一种标准化的方法在多数情况下并没有很大的限制,这里我们采用的是前人的论文中用的比较多的一种标准化方法。

标准化方法:

%%正向化矩阵标准化Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);disp('标准化矩阵 Z = ')disp(Z)

3.计算得分并归一化。
要区别开归一化和标准化。归一化的计算步骤也可以消去量纲的影响,但更多时候,我们进行归一化的目的是为了让我们的结果更容易解释,或者说让我们对结果有一个更加清晰直观的印象。例如将得分归一化后可限制在0‐1这个区间,对于区间内的每一个得分,我们很容易的得到其所处的比例位置。

归一化方法:


如果赋予指标不同的权重,那么计算评价对象与最大值的距离和评价对象与最大值的距离时,要在计算公式中添加权重。

代码如下:

%% 第四步:计算与最大值的距离和最小值的距离,并算出得分D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5; % D+ 与最大值的距离向量D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5; % D- 与最小值的距离向量S = D_N ./ (D_P+D_N); % 未归一化的得分disp('最后的得分为:')stand_S = S / sum(S)[sorted_S,index] = sort(stand_S ,'descend')

完整代码如下:

%% 第一步:把数据复制到工作区,并将这个矩阵命名为X% (1)在工作区右键,点击新建(Ctrl+N),输入变量名称为X% (2)在Excel中复制数据,再回到Excel中右键,点击粘贴Excel数据(Ctrl+Shift+V)% (3)关掉这个窗口,点击X变量,右键另存为,保存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)% (4)注意,代码和数据要放在同一个目录下哦,且Matlab的当前文件夹也要是这个目录。clear;clcload data_water_quality.mat%% 注意:如果提示: 错误使用 load,无法读取文件 'data_water_quality.mat'。没有此类文件或目录。% 那么原因是因为你的Matlab的当前文件夹中不存在这个文件% 可以使用cd函数修改Matlab的当前文件夹% 比如说,我的代码和数据放在了: D:第2讲.TOPSIS法(优劣解距离法)代码和例题数据% 那么我就可以输入命令:% cd 'D:第2讲.TOPSIS法(优劣解距离法)代码和例题数据'% 也可以看我更新的视频:“更新9_Topsis代码为什么运行失败_得分结果怎么可视化以及权重的确定如何更加准确”,里面有介绍%% 第二步:判断是否需要正向化[n,m] = size(X);disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ']);if Judge == 1 Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,4] disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ') Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: '); %[2,1,3] % 注意,Position和Type是两个同维度的行向量 for i = 1 : size(Position,2) %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数 X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i)); % Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数 % 第一个参数是要正向化处理的那一列向量 X(:,Position(i)) 回顾上一讲的知识,X(:,n)表示取第n列的全部元素 % 第二个参数是对应的这一列的指标类型(1:极小型, 2:中间型, 3:区间型) % 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列 % 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量 end disp('正向化后的矩阵 X = ') disp(X)end%% 第三步:对正向化后的矩阵进行标准化Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);disp('标准化矩阵 Z = ')disp(Z)%% 第四步:计算与最大值的距离和最小值的距离,并算出得分D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5; % D+ 与最大值的距离向量D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5; % D- 与最小值的距离向量S = D_N ./ (D_P+D_N); % 未归一化的得分disp('最后的得分为:')stand_S = S / sum(S)[sorted_S,index] = sort(stand_S ,'descend')% A = magic(5) % 幻方矩阵% M = magic(n)返回由1到n^2的整数构成并且总行数和总列数相等的n×n矩阵。阶次n必须为大于或等于3的标量。% sort(A)若A是向量不管是列还是行向量,默认都是对A进行升序排列。sort(A)是默认的升序,而sort(A,'descend')是降序排序。% sort(A)若A是矩阵,默认对A的各列进行升序排列% sort(A,dim)% dim=1时等效sort(A)% dim=2时表示对A中的各行元素升序排列% A = [2,1,3,8]% Matlab中给一维向量排序是使用sort函数:sort(A),排序是按升序进行的,其中A为待排序的向量;% 若欲保留排列前的索引,则可用 [sA,index] = sort(A,'descend') ,排序后,sA是排序好的向量,index是向量sA中对A的索引。% sA = 8 3 2 1% index = 4 3 1 2

更多数学建模相关内容请关注微信公众号《数学建模学习交流》。同时购买更多优质精选的数学建模资料,在微信公众号后台发送“买”这个字即可进入店铺(我的微店地址:https://weidian.com/?userid=1372657210)进行购买。视频价格不贵,但价值很高。单人购买观看只需要58元,三人购买人均仅需46元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。