matlab:基于组合赋权的topsis法_新出炉的烤鸡的博客-程序员宝宝_topsis法matlab代码

技术标签: 算法  矩阵  线性代数  

帮朋友忙时,最后不得已帮她实现,特此记录。

参考文献:[1]杨宝臣, 陈跃, YANG,等. 基于组合赋权TOPSIS模型的项目评标方法研究[J]. 电子科技大学学报:社会科学版, 2011, 13(1):6.

基本实现文献代码复现。

其中组合权重这样定义:

                                    \omega _{j}=\frac{\alpha _{j}\beta _{j}}{\sum_{j=1} ^{n}\alpha _{j}\beta _{j} }

其中\alpha _{j}是熵权法(客观)算出来的权重,\beta _{j}是AHP法(主观)算出来的权重。

加权标准化决策矩阵Z :

                         

 

现给出matlab代码:

五个函数部分:

一、数据处理:

1.极大型:

function [v] = toMax(x)
    M = max(x)-min(x);
    v = (x - min(x)) / M;
end

2.极小型:

function [v] = toMin(x)
    M = max(x)-min(x);
    v = (max(x)-x) / M;
end

3.中间型:

function v=toMean(x,xb)
%xb是你认为最优的值
M=max(abs(x-xb));
v=1-abs(x-xb)/M;
end

二、熵权法计算权重:

function weights = EntropyWeight(R)
%% 熵权法求指标权重,R为输入矩阵,返回权重向量weights

[rows,cols]=size(R);   % 输入矩阵的大小,rows为对象个数,cols为指标个数
k=1/log(rows);        % 求k

f=zeros(rows,cols);   % 初始化fij
sumBycols=sum(R,1);   % 输入矩阵的每一列之和(结果为一个1*cols的行向量)
% 计算fij
for i=1:rows
    for j=1:cols
      f(i,j)=R(i,j)./sumBycols(1,j);
   end
end

lnfij=zeros(rows,cols);  % 初始化lnfij
% 计算lnfij
for i=1:rows
    for j=1:cols
       if f(i,j)==0
          lnfij(i,j)=0;
       else
          lnfij(i,j)=log(f(i,j));
       end
   end
end

Hj=-k*(sum(f.*lnfij,1)); % 计算熵值Hj
weights=(1-Hj)/(cols-sum(Hj));
end

三、AHP法计算权重:

function weights = AHP(A)
[V,D] = eig(A)
[Lmax,ind] = max(diag(D));     % 求最大特征值及其位置
weights = V(:,ind) / sum(V(:,ind))   % 最大特征值对应的特征向量做归一化, 即权向量

四、主代码:

load x.mat;
z=x;
%指标数据处理
for i=1:6
        z(:,i)=toMean(z(:,i),0)
end
%我这是直接输入AHP中的比较矩阵
A=[1 1/2 1/3 1/2 2 0.25;2 1 1/2 1/4 1/2 1/4;3 2 1 2 2 1/4;2 4 1/2 1 1 1/4;1/2 2 1/2 1 1 1/4;4 4 4 4 4 1];
%熵权重
weight1=EntropyWeight(z);
weight1
%AHP权重
weight2=AHP(A);
weight2
%组合权重
weight3=weight1.*(weight2)';
weight=weight3/sum(weight3);
weight
%加权标准化矩阵Z
for i=1:5
    z(i,:)=weight.*z(i,:)
end
%% 计算与最大值和最小值的距离,并计算得分
D_P = sum((z - repmat(max(z),5,1)) .^ 2 ,2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum((z - repmat(min(z),5,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');
disp('标准化后得分为:');
disp(sorted_S);
disp('对应的下标为:');
disp(6-index);

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/NIH2221/article/details/123523307

智能推荐

c++ vector(模拟实现)_带佩亚诺余项的泰勒的博客-程序员宝宝

#include<iostream>using namespace std;namespace bit{ template<typename T> class vector { public: typedef T* iterator; public: T operator[](int i) { return start[i]; } ...

微信聊天记录没有备份可以恢复吗?吐血整理分享_数据蛙苹果恢复专家的博客-程序员宝宝

“你平时手机上的东西会备份吗?”问一百个人估计有九十九个人都会说“不会”,那么,微信聊天记录没有备份可以恢复吗?也不是不可以,只是路途会坎坷点。

pynng 超快速上手,但不保熟_ONE_SIX_MIX的博客-程序员宝宝_nng zeromq

nng 是 zeromq 的后辈,nanomsg 的 下一代的消息处理库。主要就是快,上手超快,消息收发也超快。本机 python 3.9 + pynng 0.7.1 本地环回测试 10000次1G数据,只需要1秒就可以完成。nng相比zeromq的目前发现优势,链接状态全自动维护,自动重连,掉线重连能快速恢复,数据发送不完整时能自动无限重发(默认情况),报头能全定义从而能支持http协议,速度飞快。以下4个简单完整例子_try_push_pull.py_try_pair_pair.py_tr

查找算法+思维导图_lsxa123的博客-程序员宝宝

1.总体架构在这里插入图片描述2.线性查找顺序查找:适用范围:顺序表数组、链表查找过程:从表的一段开始,向另一端逐个按给定值kx与关键码进行比较。若找到,查找成功,并给出数据元素在表中的位置;若整个表检索完之后,仍未找到与kx相同的关键码,则查找失败。折半查找(二分查找):使用范围:查找表为顺序存储结构且表中的元素按关键码有序查找过程:取查找表中间的元素作为比较对象,若给定值与...

Oracle 安装失败后如何卸载干净 以及 登陆时 ORA-01017_我是祁名烦的博客-程序员宝宝

我在安装失败了两次后,终于安装成功。期间第一次遇到的问题忘记了,第二次是因为安装路径上有中文。失败后的卸载1.进入安全模式2.删除相关文件夹f盘appc盘program file中oracle文件夹3.windows+r,输入msconfig4.c盘用户祁名烦temp文件夹下删除Oracle相关5."C:\ProgramData\Microsoft\Windows\Start Me...

h5移动端调试工具vConsole_alokka的博客-程序员宝宝_h5 手机调试工具

1.npm使用方法npm 安装vconsole npm install vconsole -D 在 main.js 中引用 import Vconsole from 'vconsole'; const vConsole = new Vconsole();在页面中正常使用 console.log("lokka")js中使用下载 vConsole 的最新版本,取...

随便推点

tensorflow: 怎样找到对应的bazel 版本和安装_shuai_wen的博客-程序员宝宝_查看bazel版本

tensorflow是用bazel编译的,有些情景是需要bazel编译的,如定制kernel,编译一些工具如freeze_graph等。如果要编译成功需要找到对应的bazel版本,并不是说使用最高的bazel就能成功。使用tensorflow的过程中不时因为tensorlfow和bazel的版本不匹配出现各种问题,且这些问题不好解决。怎样找到对应的版本tensorflow的源码里已经明确告...

将Emacs配置成一个C/C++的IDE编程环境_robertzhouxh的博客-程序员宝宝

将Emacs配置成一个C/C++的IDE编程环境                                                                                                                                            ——by 0-&-11.写在前面         Linux

我国SOA标准体系进入倒计时_胡争辉的博客-程序员宝宝

 众多参会厂商的参与说明了SOA标准化的市场需求有多大。今年年底之前,中国将初步制定完成SOA标准体系一个有吸引力的市场必定也有其生命力。这从SOA标准化国际论坛的众多参会厂商和主办方就能看出来。11月5日,主题为“SOA的标准与应用”的“SOA标准化国际论坛”在京举行。这是目前在SOA标准制定方面权威机构最多、参与厂商最多的一次论坛。中国电子技术标准化研究所(

18three.js加载obj模型和材质_X01动力装甲的博客-程序员宝宝

18three.js加载obj模型和材质图片.pngobj和mtl加载器更新变化很大。下面的代码是92版本的代码,参考官方的案例。 var onProgress = function ( xhr ) { if ( xhr.lengthComputable ) { ...

Android应用开发新路线_拟声的主扬的博客-程序员宝宝

Android应用开发新路线利用HTML5开发Android应用程序!Android与HTML5融合Android的HTML5应用程序概述如何适配多分辨率的Android设备?如何在Android中构建HTML5应用程序?对其内容详细阅读

前端开发中表格table单元格高度或者行高的设置_翔云123456的博客-程序员宝宝_table单元格高度

最近开发中遇到一个问题:在width一定的情况下,如何设置table的单元格高度? td的height、max-height属性设置以后,发现完全没有效果。后来多方收集资料后才明白,单元格高度由以下因素决定:首先,根据单元格内内容,要把内容放的下;其次,再看height设置值;如果内容小于height,单元格高度自动扩展到height;参考:http://www.cnblogs.com/li