1. 熵值-topsis代码data= [n,m]=size(data);maxdata=repmat(max(data),n,1); mindata=repmat(min(data),n,1);max_min=maxdata-mindata; stddata=(data-mindata)./max_min;
%% 利用信息熵计算不同科目的权重
f=(1+stddata)./repmat(sum(1+stddata),n,1);e=-1/log(n)*sum(f.*log(f));
d=1-e; w=d/sum(d);
%% 计算加权决策矩阵,确定正理想解和负理想解 normdata=repmat(w,n,1).*stddata; % 加权决策矩阵 posideal=max(normdata); % 正理想解 negideal=min(normdata); % 负理想解
%% 计算加权后的决策数据与正负理想解的欧式距离 dtopos=sqrt(sum((normdata-repmat(posideal,n,1)).^2,2));dtoneg=sqrt(sum((normdata-repmat(negideal,n,1)).^2,2));
18
%% 计算各样本与理想解得接近程度并得到排序结果 d=dtoneg./(dtoneg+dtopos); [dscore,index]=sort(d,'descend');
2.熵权法求权重代码
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Template template<class T>
#define lowbit(x) x&(-x)
#define mem(a,b) memset(a,b,sizeof a)
#define debug cout<<"****************"<<endl#define go int T;cin>>T;for(int kase=0;kase<T;kase++) #define FRER()freopen("i.txt","r",stdin) #define FREW()freopen("out.txt","w",stdout)
#define eps 1e-8
#define mod 2147493647
#define x first
#define y second
#define pq priority_queue
#define yes cout << "Yes" << endl
#define no cout << "No" <<endl
#define scand(a) scanf("%d",&a);
#define scanlld(a) scanf("%lld",&a);
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1000+7 ,inf = 0x3f3f3f3f;
double X[maxn][maxn];
double t[maxn][maxn];
double MAXX[maxn],MINX[maxn];
double e[maxn],E[maxn],w[maxn];
double Y[maxn][maxn];
double p[maxn][maxn];
double sumY[maxn];
19
double Z[maxn],s[maxn];
int n,m;
int main()
{
FRER();
cin >> m >> n;
for(int j=1;j<=m;j++) for(inti=1;i<=n;i++) cin >> X[j][i]; for(int i=1;i<=n;i++){
MAXX[i] = -inf ; MINX[i] = inf;
for(int j=1;j<=m;j++){
MAXX[i] = max(MAXX[i],X[j][i]);
MINX[i] = min(MINX[i],X[j][i]);
}
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
Y[j][i] = (X[j][i]-MINX[i])/(MAXX[i]-MINX[i]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sumY[i] += Y[j][i];
}
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
p[j][i] = Y[j][i]/sumY[i];
}
}
double SUME = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(p[j][i] != 0) e[i] += p[j][i] * log(p[j][i]);
}
E[i] = -1.0/log(m)*e[i];
SUME += E[i];
}
for(int i=1;i<=n;i++){
w[i] = (1.0-E[i])/(1.0*n-SUME);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
s[i] += Y[i][j]*w[j];
}
20
}
for(int i=1;i<=m;i++) cout<<s[i]<<" ";
cout << endl;
}
3.DPSIR 代码
x=[362 365 324 348 340 354 343
95.00 95.10 98.40 100 100 100 100
55143 59101 62619 72651 81034 89757 100173
36505 40742 44653 40948 44633 48695 52938
24080 26728 28812 28853 32359 36481 38320
1757 1860 2182 2189 2346 3388 3969
71969 76684 82535 86535 92682 96955 104363
1854 2008 2228 2532 2946 3339 3492
110 115 117 122 123 134 135
0.3077 0.2825 0.4416 0.4883 0.6086 0.6582 0.7308];
[n,m]=size(x);
[X,ps]=mapminmax(x');
ps.ymin=0.002;
ps.ymax=0.996;
ps.yrange=ps.ymax-ps.ymin;
X=mapminmax(x',ps);
% mapminmax('reverse',xx,ps);
X=X'; for i=1:n for j=1:mp(i,j)=X(i,j)/sum(X(:,j)); end
%% 利用信息熵计算不同科目的权重
f=(1+stddata)./repmat(sum(1+stddata),n,1);e=-1/log(n)*sum(f.*log(f));
d=1-e; w=d/sum(d);
%% 计算加权决策矩阵,确定正理想解和负理想解 normdata=repmat(w,n,1).*stddata; % 加权决策矩阵 posideal=max(normdata); % 正理想解 negideal=min(normdata); % 负理想解
%% 计算加权后的决策数据与正负理想解的欧式距离 dtopos=sqrt(sum((normdata-repmat(posideal,n,1)).^2,2));dtoneg=sqrt(sum((normdata-repmat(negideal,n,1)).^2,2));
18
%% 计算各样本与理想解得接近程度并得到排序结果 d=dtoneg./(dtoneg+dtopos); [dscore,index]=sort(d,'descend');
2.熵权法求权重代码
#include <set>
#include <map>
#include <list>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
#define Template template<class T>
#define lowbit(x) x&(-x)
#define mem(a,b) memset(a,b,sizeof a)
#define debug cout<<"****************"<<endl#define go int T;cin>>T;for(int kase=0;kase<T;kase++) #define FRER()freopen("i.txt","r",stdin) #define FREW()freopen("out.txt","w",stdout)
#define eps 1e-8
#define mod 2147493647
#define x first
#define y second
#define pq priority_queue
#define yes cout << "Yes" << endl
#define no cout << "No" <<endl
#define scand(a) scanf("%d",&a);
#define scanlld(a) scanf("%lld",&a);
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1000+7 ,inf = 0x3f3f3f3f;
double X[maxn][maxn];
double t[maxn][maxn];
double MAXX[maxn],MINX[maxn];
double e[maxn],E[maxn],w[maxn];
double Y[maxn][maxn];
double p[maxn][maxn];
double sumY[maxn];
19
double Z[maxn],s[maxn];
int n,m;
int main()
{
FRER();
cin >> m >> n;
for(int j=1;j<=m;j++) for(inti=1;i<=n;i++) cin >> X[j][i]; for(int i=1;i<=n;i++){
MAXX[i] = -inf ; MINX[i] = inf;
for(int j=1;j<=m;j++){
MAXX[i] = max(MAXX[i],X[j][i]);
MINX[i] = min(MINX[i],X[j][i]);
}
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
Y[j][i] = (X[j][i]-MINX[i])/(MAXX[i]-MINX[i]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
sumY[i] += Y[j][i];
}
}
for(int j=1;j<=m;j++){
for(int i=1;i<=n;i++){
p[j][i] = Y[j][i]/sumY[i];
}
}
double SUME = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(p[j][i] != 0) e[i] += p[j][i] * log(p[j][i]);
}
E[i] = -1.0/log(m)*e[i];
SUME += E[i];
}
for(int i=1;i<=n;i++){
w[i] = (1.0-E[i])/(1.0*n-SUME);
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
s[i] += Y[i][j]*w[j];
}
20
}
for(int i=1;i<=m;i++) cout<<s[i]<<" ";
cout << endl;
}
3.DPSIR 代码
x=[362 365 324 348 340 354 343
95.00 95.10 98.40 100 100 100 100
55143 59101 62619 72651 81034 89757 100173
36505 40742 44653 40948 44633 48695 52938
24080 26728 28812 28853 32359 36481 38320
1757 1860 2182 2189 2346 3388 3969
71969 76684 82535 86535 92682 96955 104363
1854 2008 2228 2532 2946 3339 3492
110 115 117 122 123 134 135
0.3077 0.2825 0.4416 0.4883 0.6086 0.6582 0.7308];
[n,m]=size(x);
[X,ps]=mapminmax(x');
ps.ymin=0.002;
ps.ymax=0.996;
ps.yrange=ps.ymax-ps.ymin;
X=mapminmax(x',ps);
% mapminmax('reverse',xx,ps);
X=X'; for i=1:n for j=1:mp(i,j)=X(i,j)/sum(X(:,j)); end