C++实现:
输入
第一行输入矩阵的行数n
第二行输入矩阵的列数m
第三行输入m列的各个权重w(以空格相隔,没有权重则全输入为1)
之后输入n行m列数据矩阵
输入完矩阵之后选择是否将低优指标转换成高优指标(进行输入1,不进行输入0)
输出
输出共一行,表示每个对象的接近程度,结果保留4位小数,以空格相隔。
样例输入
5
3
1 1 1
50.8 4.3 8.7
200 4.9 7.2
71.4 2.5 5
98.5 3.7 2.7
10.2 2.4 0.3
1
样例输出
0.1067 0.0052 0.1896 0.0945 1.0000
#include<iostream>
#include<vector>
#include<math.h>
#include <iomanip>
using namespace std;
int main()
{
int n, m,f=0;
cin >> n >> m;
float *w = new float[m];
for (int i = 0; i < m; i++)//权重
cin >> w[i];
vector<vector<float>> r(n, vector<float>(m));
for (int i = 0; i < n;i++)
for (int j = 0; j < m; j++)
{
cin >> r[i][j];
}
cin >> f;
if (f)
{
//评价指标同趋化
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
r[i][j] = (1.0 / r[i][j]) * 100;
}
}
vector<float> p(m,0) ; //存放每列值的平方的和
for (int i = 0; i < m;i++)
for (int j = 0; j < n; j++)
{
p[i] += r[j][i] * r[j][i];
}
//归一化处理
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
r[i][j] /= sqrt(p[j]);
}
//计算最优最劣方案
vector<float> max(m, 0);
vector<float> min(m, 10000);
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
{
if (r[i][j]>max[j])
{
max[j] = r[i][j];
}
if (r[i][j]<min[j])
min[j] = r[i][j];
}
//计算各指标与最优最劣方案距离
vector<float> dt1(n, 0);
vector<float> dt2(n, 0);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
dt1[i] += (r[i][j] - max[j])*(r[i][j] - max[j])*w[j];
dt2[i] += (r[i][j] - min[j])*(r[i][j] - min[j])*w[j];
}
dt1[i] = sqrt(dt1[i]);
dt2[i] = sqrt(dt2[i]);
}
vector<float> dt3(n, 0);//存放接近程度
for (int i = 0; i < n; i++)
{
dt3[i] = dt2[i] / (dt2[i] + dt1[i]);
}
for (int i = 0; i < n; i++)
cout << fixed << showpoint << setprecision(4) << dt3[i] << " ";
}