多属性决策模型-matlab实现
- 属性集合
- 决策矩阵
- 评价指标类型的一致化处理
- 决策矩阵标准化
- 属性权重
- 信息熵法
- 动态加权函数的设定
- 1.分段变幂函数
- 2.偏大型正态分布函数
- 3.S型分布函数
- 综合方法
- 简单加权和法(首选)
- 加权积法
- 接近理想解的偏好排序法
- 方案选取
- 代码实现
- 归一化函数
- 综合方法函数
- 求信息熵
- 完整代码
适用于评价决策问题,例如:决策目标,备选方案
属性集合
- 影响力较强
- 性间独立属
- 容易辨别优劣
- 可量化
- 数量过多时(>7)分层
决策矩阵
表示方案对属性的偏好程
方案为行,属性为列,对每一方案每一属性取值
评价指标类型的一致化处理
一般来说,在评价指标x1,x2,…,xm(m>1)中可能包括“极大型”指标、“极小型”指标、“中间型”指标 和 “区间型”指标。
- 极大型指标:总是期望指标的取值越大越好; 效益型指标,如:收益、利润;
- 极小型指标:总是期望指标的取值越小越好; 费用型指标,如:成本、能耗;
- 中间型指标:总是期望指标的取值既不要太大,也不要太小,即取适当的中间值最好;如:环境温度、湿度、人的身高、体重、BMI;
- 区间型指标:总是期望指标的取值最好是落在某一个确定的区间内最好。如:水质量评估中PH值。
极大型指标和极小型指标又被称为效益型指标和费用型指标。
进行综合评价的过程中,将指标一致化(一样的指标类型),要么极小(综合评价值越小越好),要么极大(…)。评价指标预处理的过程中,首先将指标一致化处理。根据决策目标、实际问题来决定目标是极小还是极大!预处理数据最好不要产生大的变动。
决策矩阵标准化
- 区分费用型属性和效益性属性,对费用型属性值取倒数变换,将全部属性转为效益型
属性权重
对目标影响力的权重分配
信息熵法
熵:衡量不确定的指标,熵越大,不确定越大
动态加权函数的设定
考虑到评价指标的“质差”与“量差”的关系,选择动态权重函数时 既要能体现不同类型指标之间质的差异,也要能体现同类型指标量的差异。
具体取什么样的动态加权函数,主要是从实际问题出发分析确定。
对于不同的指标可以取相同的权函数,也可以取不同的权函数。
1.分段变幂函数
2.偏大型正态分布函数
3.S型分布函数
综合方法
将决策矩阵与属性权重加以综合,得到最终巨册的数学方法
简单加权和法(首选)
加权积法
接近理想解的偏好排序法
求解方法:
- 正理想解: 每列最大值
- 负理想解: 每列最小值
- 求每列与正负理想解距离
- 求接近度
方案选取
- 分配模式
- 简单加权和法+归一化
- 适用于资源分配问题
- 理想模式
- 简单加权和法+最大化
- 适用于挑选最优者
代码实现
归一化函数
function D_std = gui1(D,k)
% 对数据进行归一化处理
% D为数据 k为归一化选项
D_std=[];
switch k
%归一化
case 1
D_std=D./(ones(size(D,1),1)*sum(D,1)); %D列为1矩阵*D列和
%最大化
case 2
D_std=D./(ones(size(D,1),1)*max(D,[],1)); %D列为1矩阵*D列最大值
%模一化
case 3
mo_D=sqrt(sum(D.^2,1));
D_std=D./(ones(size(D,1),1)*mo_D); %D列为1矩阵*D列模
%区间尺度变换/极值差
case 4
D_max=(ones(size(D,1),1)*max(D,[],1));
D_min=(ones(size(D,1),1)*min(D,[],1));
D_std=(D-D_min)./(D_max-D_min);
end
综合方法函数
function V_score = allway(D_std,W,k)
%综合方法
%D_std数据值,W属性权重,k方案选择
V_score=[];
switch k
%简单求加权和
case 1
V_score=D_std*W;
V_score=V_score/sum(V_score); %归一化处理
%加权积法
case 2
V_mid=D_std.^(ones(size(D_std,1),1)*W'); %D列为1矩阵*W
V_score=prod(V_mid,2); %dij乘积
V_score=V_score/sum(V_score); %归一化处理
%接近理想解的偏好排序法
case 3
V_mid=D_std.*(ones(size(D_std,1),1)*W'); %D列为1矩阵*W
V_plus=ones(size(D_std,1),1)*max(V_mid,[],1); %正理想解(列最大值向量)
V_dim=ones(size(D_std,1),1)*min(V_mid,[],1); %负理想解(行最大值向量)
S_plus=sum((V_mid-V_plus).^2,2).^(0.5); %与正理想解距离
S_dim=sum((V_mid-V_dim).^2,2).^(0.5); %与负理想解距离
C_plus=S_dim./(S_plus+S_dim); %接近度
V_score = C_plus/sum(C_plus); %归一化
end
end
求信息熵
D=[ 1/25,9,7;
1/18,7,7;
1/12,5,5];
%% 归一化处理
D_std=gui1(D,1);
disp(D_std);
%%求信息熵
m=size(D,1);
E=-1/log(m)*sum(D_std.*log(D_std),1); %求熵E
F=1-E; %求区分度F
W=F/sum(F); %求x权重W
W=W'; %行向量转列向量
disp(W);
完整代码
D=[ 1/25,9,7;
1/18,7,7;
1/12,5,5];
%% 归一化处理
D_std=gui1(D,1);
disp(D_std);
%% 求信息熵
m=size(D,1);
E=-1/log(m)*sum(D_std.*log(D_std),1); %求熵E
F=1-E; %求区分度F
W=F/sum(F); %求x权重W
W=W'; %行向量转列向量
disp(W);
%% 综合方法
res = allway(D_std,W,1); %加权和方法
disp(res);
res = allway(D,W,2); %加权积方法
disp(res);
D_std=gui1(D,3);
res = allway(D_std,W,3); %理想解方法
disp(res);