1.步骤
(1).数据的标准化处理;
(2).选出最优方案和最劣方案;
(3).计算出各个对象和最优以及最劣之间的距离;
(4).再使用Dbest/(Dbest+Dwors)计算出各对象的评分,值越小的评价越高,依次排序;
2.源代码
#include <iostream>
#define m 8
#define n 3
void max(float a[][n], float b[], float c[]);
int main()
{
FILE* fpr, * fpw;
fopen_s(&fpr, "1.txt", "r");
fopen_s(&fpw, "2.txt", "w");
float sum = 0.0, aver, c = 0.0, r, minn[n], maxx[n], s1 = 0.0, s2 = 0.0, s[m][2], best[m], z, a[m][n];
int sort[m];
for (int i = 0; i < m; i++)//读取数据
for (int j = 0; j < n; j++)
fscanf_s(fpr, "%f", &a[i][j]);
/* for (int j = 0; j < n; j++)//具体题目具体改编,逆数据取倒
for (int i = 0; i < m; i++)
a[i][j] = 1.0 / a[i][j];*/
max(a, maxx, minn);//求最值
for (int j = 0; j < n; j++)//极差标准化处理
for (int i = 0; i < m; i++)
a[i][j] = (a[i][j] - minn[j]) / (maxx[j] - minn[j]);
/* for (int j = 0; j < n; j++)//求各列之和
for (int i = 0; i < m; i++)
sum += a[i][j];
aver = sum / (n * m);
for (int j = 0; j < n; j++)
for (int i = 0; i < m; i++)
c += abs((a[i][j] - aver) * (a[i][j] - aver) / (n * m));
r = sqrt(c);//标准差求解
for (int j = 0; j < n; j++)//归一化处理(z-score 0均值标准化)
for (int i = 0; i < m; i++)
a[i][j] = (a[i][j]-aver) / r;*/
max(a, maxx, minn);//求最值
fprintf(fpw,"归一化处理后的数据为:\n");
for (int j = 0; j < m; j++)
{
for (int i = 0; i < n; i++)
fprintf(fpw,"%f ", a[j][i]);
fprintf(fpw,"\n");
}
max(a, maxx, minn);//求最值
for (int j = 0; j < m; j++)//求正负距离
{
for (int i = 0; i < n; i++)
{
s1 += (a[j][i] - maxx[i]) * (a[j][i] - maxx[i]);
s2 += (a[j][i] - minn[i]) * (a[j][i] - minn[i]);
}
s[j][0] = sqrt(s1);
s[j][1] = sqrt(s2);
}
for (int j = 0; j < m; j++)//求每组距离的最大值
{
z = s[j][0];
for (int i = 0; i < 2; i++)
if (z < s[j][i])
z = s[j][i];
best[j] = z;
}
for (int i = 0; i < m; i++)
best[i] = best[i] / (s[i][0] + s[i][1]);
fprintf(fpw,"\n最优数据为:\n");
for (int i = 0; i < n; i++)
fprintf(fpw,"%f ", maxx[i]);
fprintf(fpw,"\n");
fprintf(fpw,"\n最差数据为:\n");
for (int i = 0; i < n; i++)
fprintf(fpw,"%f ", minn[i]);
fprintf(fpw,"\n");
fprintf(fpw,"\n每组数据的正负距离为:\n");
for (int j = 0; j < m; j++)
{
for (int i = 0; i < 2; i++)
fprintf(fpw,"%f ", s[j][i]);
fprintf(fpw,"\n");
}
fprintf(fpw,"\n每组数据的权值为:\n");
for (int i = 0; i < m; i++)
fprintf(fpw,"%f\n", best[i]);
for (int i = 0; i < m; i++)
sort[i] = 1;
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
if (best[j] < best[i])
sort[i] += 1;
fprintf(fpw,"\n各数据排名为:\n");
for (int i = 0; i < m; i++)
fprintf(fpw,"%d\n", sort[i]);
return 0;
}
void max(float a[][n], float b[], float c[])//求最大及最小值
{
for (int i = 0; i < n; i++)
b[i] = c[i] = a[0][i];
for (int j = 0; j < n; j++)
for (int i = 0; i < m; i++)
{
if (a[i][j] > b[j])
b[j] = a[i][j];
if (a[i][j] < c[j])
c[j] = a[i][j];
}
}
3.I/O(输入和输出放在txt文件内)
输入:
1150.3 3565.71 69
1189.7 3656.705 69
1193.7 3618.585 69
1221.9 3624.21 72
1229.8 3591.705 83
1230.6 3630.495 86
1276.1 3594.075 93
1337.7 3614.955 102
输出:
归一化处理后的数据为:
0.000000 0.000000 0.000000
0.210245 1.000000 0.000000
0.231590 0.581075 0.000000
0.382071 0.642892 0.090909
0.424226 0.285676 0.424242
0.428495 0.711963 0.515152
0.671291 0.311720 0.727273
1.000000 0.541184 1.000000
最优数据为:
1.000000 1.000000 1.000000
最差数据为:
0.000000 0.000000 0.000000
每组数据的正负距离为:
1.732051 0.000000
2.150282 1.021863
2.527779 1.198117
2.779474 1.415287
2.983076 1.563521
3.089240 1.844038
3.193676 2.115941
3.226465 2.601939
每组数据的权值为:
1.000000
0.677864
0.678435
0.662606
0.656112
0.626204
0.601489
0.553576
各数据排名为:
8
6
7
5
4
3
2
1