【数学建模】优劣解距离法Topsis模型(含MATLAB代码)

TOPSIS法,全称 Technique for Order Preference by Similarity to an Ideal Solution,是由C.L.Hwang和K.Yoon于1981年首次提出的 。这是一种多目标决策分析中常用的有效方法,也被称作优劣解距离法 。 TOPSIS法的基本原理是通过检测评价对象与最优解、最劣解的距离来进行排序。如果一个方案距离理想最优解越近,距离最劣解越远,我们就认为这个方案更好 。

TOPSIS法的主要适用场景包括:

土地利用规划:在土地资源管理和规划中,TOPSIS法可以用来评估不同土地利用方案的优劣,帮助决策者选择最佳的土地利用策略 。

物料选择评估:在供应链管理和物料采购中,TOPSIS法可以用来评估不同供应商提供的物料质量,帮助企业选择性价比最高的物料 。

项目投资:在金融管理和投资决策中,TOPSIS法可以用来评估不同投资项目的风险和收益,帮助投资者选择最有利的投资方案 。

医疗卫生:在医疗管理和健康政策制定中,TOPSIS法可以用来评估不同治疗方案的效果,帮助医生和患者选择最佳的治疗方案。

指标类型:

极大型(效益型)期望取值越大越好
极小型期望取值越小越好
中间型期望取值为适当的中间值最好
区间型期望取值落在某一个确定的区间内最好

一致化处理(正向化):所谓一致化处理就是将评价指标的类型进行统一;使得表中任意属性下性能越优的方案变换后的属性值越大(极大型)。

无量纲化处理:不同指标,不同单位。

归一化:不同指标,不同数值大小。

构造计算评分公式:

TOPSIS法符号说明:

设:多属性决策方案集A={a1,a2,……,am},即有m个可行方案;

  衡量方案优劣的属性变量(指标)为x1,x2,……,xn,即有n个评价指标这时方案集A中的方案ai(i=1,2,……,m)的n个属性值构成了向量[ai1,ai2,……,ain]它作为n维空间中的一个点,则每个方案依照其各项指标的值就对应n维空间中一个坐标点。

举个栗子:以下是五所高校(ai)的基本情况,我们要根据“人均专著”(x1)、“逾期毕业率”(x2)两个方面来为这五所高校进行一个排名。

序号人均专著/(本/人)逾期毕业率/%
10.14.1
20.35.1
30.46.8
40.80.3
51.21.7

正理想解C+是设想各指标属性都达到最满意值的解[1.2,0.3]

负理想解C-是设想各指标属性都达到最不满意值的解 [0.1,6.8]

在n维空间中,算出方案集D中的各备选方案ai与正理想解C+和负理想解C-的距离:

d*:备选方案di(i=1,2,……,m)到正理想解的距离;

d-:备选方案di(i=1,2,……,m)到负理想解的距离。

理论介绍:

第一步:将n个评价指标x1,x2,……,xn,看成n条坐标轴,由此可以构造出一个n维空间,则每个方案依照其各项指标的数据就对应n维空间中每一个坐标点。

第二步:针对各项指标从所有待评价方案中选出该指标的最优值(正理想解,对应最有坐标点)和最差值(负理想解,对应最差标点),依次求出各个待评价方案的坐标点分别最优坐标点和最差坐标点的距离d*和d-。

第三步:构造相对贴进度(评价参考值)f:

则f值越大代表评价结果越优。

算法步骤:

(1)构造决策矩阵A=(aij)m×n,每一列是一个评价指标,每一行是一个待评价方案;

为了去掉量纲的影响,为了方便比较,做规范化处理得到B=(bij)m×n,其中:

注:该规范化(向量归一化法)处理后,各评价方案的同一评价指标的平方和为1.

(2)根据每个评价指标对评价结果的贡献程度不同,指定不同的权重:

W=[w1,w2,……,wn],将B的第j列乘以其权重wj,得到带权的规范矩阵C=(cij)m×n。

(3)确定正理想解C+和负理想解C-:

C+=[c1+,c2+,……,cn+];C-=[c1-,c2-, ……,cn-];

(4)计算每个待评价方案到正理想解和负理想解的距离:

 (5)计算每个待评价方案的相对贴进度(评价参考值):

再将从大到小排列 ,得到各备选方案的优先序。

案例分析:以下是五所高校的基本情况,我们要根据“人均专著”、“师生比”、“科研经费”、“逾期毕业率”四个方面围着五所高校进行一个评估。

序号人均专著/(本/人)师生比科研经费/(万元/年)逾期毕业率/%
10.1450004.1
20.3570005.1
30.4960006.8
40.811100002.6
51.228001.7

第一步:导入数据、数据预处理、构建决策矩阵

先把数据规范化,规范化的作用:

a.正向化  b.无量纲化  c.归一化

方法

法1.线性变换法:将原始决策矩阵A =(aij)m×n,进行线性比例变换

    若x为极大型(效益型)属性:

    若x为极小型(成本型)属性: 

注:经过该变换之后的bij最优值不一定是1,最差值不一定为0.

0<=bij<=1;所有指标均为正向指标。

法二、极差变换法(使变换后的每个属性的最优值为1,最差为0)

          若x为极大型(效益型)属性:          若x为极小型(成本型)属性:

法三、区间型属性的变换:若x区间型属性

           假设给定最优属性区间为[c,d], 为无法容忍下限,为无法容忍下限

若以该案列为例:假设2某地高校师生比的最有区间为[5,9],且a2-=1;a2*=12.

序号师生比
14
25
39
411
52

数据处理——>

序号师生比变换后的师生比
140.75
251
391
4110.3333333
520.25

法四、中间属性的变换

           若x为中间型属性,且假设最优值为k,那么:

 比如:

生产线零件长/cm
112
211
313
415

假设零件在12cm为最佳,则处理后的矩阵为

生产线零件长/cm变换后的零件长/cm
1121
2111/3
3132/3
4150

法五、向量归一化(使得每列平方和为1)

 注:向量归一标准化后:

1、0<=bij<=1;

2、正、负向指标的方向没有发生变化

法六、标准样本变换法(大数定律):

 

序号人均专著/(本/人)师生比科研经费/(万元/年)逾期毕业率/%
10.1450004.1
20.3570005.1
30.4960006.8
40.811100002.6
51.228001.7

称B=(bij)m×n 为向量标准样本变换矩阵。

注:经标准样本变换后标准化矩阵的样本均值为0,方差为1.

先对第二列进行区间型属性的变换,再对所有属性进行规范化(向量归一法)

序号人均专著/(本/人)师生比科研经费/(万元/年)逾期毕业率/%
10. 0653720450.453413450.3445082140.412670364
20. 1961161350.6045512660. 48231150.513321672
30. 261488180.6045512660. 4134098570.684428896
40. 522976360.2015170890. 6890164280.261693401
50. 7844645410.151137817 0. 055121314 0.171107224

 

确定正理想解和负理想解

正理想解C+=[0.235339362,0.1209102531,0.275606571,0.017110722]

负理想解C-=[0.019611614,0.030227563,0.022048526,0.06844289]

计算各方案到正理想解和负理想解的距离

d*:备选方案ai(i=1,2,……,m)到正理想解的距离;

d-:备选方案ai(i=1,2,……,m)到负理想解的距离

序号d*d-
10.2588927190.133388582
20.1978920460.198124257
30. 1985039370. 179510995
40. 112842220. 291592888
50. 2692861540. 22175088

计算各方案的相近贴进度 

序号fi排行
40.720988071
20.5002931842
30.4748780533
50.4515970594
10.3400329855

 在实际应用中,TOPSIS法因其简便、直观和易于理解的特性,已经被广泛应用于各个领域。然而,需要注意的是,TOPSIS法也有其局限性,比如对数据敏感性高、对样本容量的要求、以及对权重确定的主观性等问题 。因此,在使用TOPSIS法时,应结合实际情况和具体需求,合理考虑其适用性和局限性.

看代码部分:

%%  第一步:把数据复制到工作区,并将这个矩阵命名为X
% (1)在工作区右键,点击新建(Ctrl+N),输入变量名称为X
% (2)在Excel中复制数据,再回到Excel中右键,点击粘贴Excel数据(Ctrl+Shift+V)
% (3)关掉这个窗口,点击X变量,右键另存为,保存为mat文件(下次就不用复制粘贴了,只需使用load命令即可加载数据)
% (4)注意,代码和数据要放在同一个目录下哦,且Matlab的当前文件夹也要是这个目录。
clear;clc
load 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元,视频本身也是下载到本地观看的,所以请大家不要侵犯知识产权,对视频或者资料进行二次销售。
% % 如何修改代码避免查重的方法:https://www.bilibili.com/video/av59423231(必看)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 72
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 38
    评论
### 回答1: 数学建模是将现实世界中的问题转化为数学模型,并利用数学方对其进行分析和求的过程。葡萄酒代码Python是利用Python编程语言来实现对葡萄酒相关问题的建模和求。 在葡萄酒行业中,数学建模可以应用于多个方面,例如葡萄酒的质量评估、销售预测、供应链管理等。下面以葡萄酒的质量评估为例进行说明。 首先,我们需要收集与葡萄酒质量相关的数据,例如葡萄品种、气候条件、土壤性质等。然后,我们可以利用Python中的数据处理和统计分析库(如pandas和numpy)对数据进行预处理和分析,得到各个因素与葡萄酒质量之间的关联性。 接下来,我们可以选择合适的数学模型来描述葡萄酒质量与各个因素之间的关系。常用的模型包括线性回归模型、逻辑回归模型等。在Python中,我们可以使用机器学习库(如scikit-learn)来建立和训练这些模型,并进行模型的评估和调优。 最后,我们可以利用已建立的模型来进行葡萄酒质量的预测和评估。通过输入新的葡萄酒相关数据,我们可以利用模型对其质量进行预测,并根据预测结果进行相应的决策。 总之,数学建模葡萄酒代码Python是利用数学模型和Python编程语言对葡萄酒相关问题进行建模和求的过程。通过收集和分析相关数据,建立合适的数学模型,并利用Python进行模型的训练和评估,我们可以对葡萄酒质量进行预测和评估,为相关决策提供支持。 ### 回答2: 数学建模是指利用数学方和技巧来决实际问题的过程。而葡萄酒代码则是利用Python编写的计算机程序,用来实现对葡萄酒相关数据进行分析和建模。 在数学建模中,葡萄酒的研究可以涉及多个方面,如 ### 回答3: 数学建模是将实际问题抽象成数学模型,然后利用数学方进行求和分析的过程。而葡萄酒代码主要是指用Python编程语言实现对葡萄酒数据进行处理和分析的代码。 在这个问题中,我们可以假设有一个关于葡萄酒的数据集,其中包了不同葡萄酒的特征和品质评分。我们的目标是通过对这些特征进行分析,建立一个数学模型来预测葡萄酒的品质评分。 首先,我们需要用Python编程语言读取和处理数据集。可以使用pandas库来读取葡萄酒数据集,并对数据进行预处理,例如去除缺失值、标准化特征等。 接下来,我们可以通过数据可视化和统计分析的方,对葡萄酒的各个特征进行探索性数据分析。这些特征包括葡萄酒的酒精量、酸度、 pH 值等。通过可视化的方式,我们可以观察到特征与品质评分之间的关系。 然后,我们可以使用机器学习算法来建立数学模型,以预测葡萄酒的品质评分。例如,可以使用线性回归、决策树等算法来训练模型,并利用交叉验证的方来评估模型的性能。 最后,我们可以使用建立好的数学模型对新的葡萄酒数据进行预测,并对其品质进行评估。通过对模型进行调优和改进,我们可以提高模型的准确性和鲁棒性。 总之,通过数学建模和葡萄酒代码的结合,我们可以对葡萄酒数据进行深入分析和预测。这对于葡萄酒行业的决策和生产具有重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值