现实中,如果我们想评价一个事物,只从单一指标出发评价,会显得很不公正也不科学。
多数情况下,评价一个事物往往需要涉及多个层次、多个方面的指标,进行综合评价,从而得出更加科学合理的结论。评价者要从诸因素出发,参照有关信息,根据其判断对复杂问题分别作出“大、中、小”;“高、中、低”;“优、良、可、劣”;“好、较好、一般、较差、差”等程度性的模糊评价。
请看下面这个例子:
再对结果归一化即可
以上图文参自 《信息安全管理与风险评估》毕方明
C++实现 :
输入
第一行输入评价对象的个数n
第二行输入用作评价的指标个数m
第三个输入评级个数b
之后输入n组数据,代表n个对象。
每组第一行输入m个指标权重的向量A
之后输入m行b列的评价矩阵R
输出
输出n行的综合评价结果的总和归一化的数据(保留两位小数),结果以空格相隔,对于结果须四舍五入。
样例输入
3
3
3
0.2 0.3 0.5
0.7 0.2 0.1
0.1 0.2 0.7
0.3 0.6 0.1
0.2 0.3 0.5
0.3 0.6 0.1
1 0 0
0.7 0.3 0
0.2 0.3 0.5
0.1 0.4 0.5
1 0 0
0.1 0.3 0.6
样例输出
0.27 0.45 0.27
0.56 0.33 0.11
0.27 0.27 0.45
#include<iostream>
#include<vector>
#include<algorithm>
#include <iomanip>
using namespace std;
int main()
{
int n;//对象个数
int m;//指标个数
int b;//评级个数
cin >> n >> m >> b;
float* p1 = new float[m]; //权重向量A
vector<vector<float>> r(m, vector<float>(b)); //评价矩阵R
float* p2 = new float[b]; //存放归一化结果
while (n--)
{
for (int i = 0; i < m; i++)
{
cin >> p1[i];
}
for (int i = 0; i < m;i++)
for (int j = 0; j < b; j++)
{
cin >> r[i][j];
}
for (int i = 0; i < b; i++)
{
float max=0;
for (int j = 0; j < m; j++)
{
if (min(p1[j], r[j][i])>max)
max = min(p1[j], r[j][i]);
}
p2[i] = max;
}
float sum = 0;
for (int i = 0; i < b; i++)
{
sum += p2[i];
}
for (int i = 0; i < b; i++)
{
p2[i] /= sum;
}
for (int i = 0; i < b; i++)
cout << fixed << showpoint << setprecision(2) <<p2[i]<<" ";
cout << endl;
}
}